Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(213)

Side by Side Diff: pkg/analysis_server/lib/src/computer/computer_overrides.dart

Issue 1037193002: Fix for computing overridden/implemented members from interfaces. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | pkg/analysis_server/test/analysis/notification_overrides_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library computer.overrides; 5 library computer.overrides;
6 6
7 import 'package:analysis_server/src/collections.dart'; 7 import 'package:analysis_server/src/collections.dart';
8 import 'package:analysis_server/src/protocol_server.dart'; 8 import 'package:analysis_server/src/protocol_server.dart';
9 import 'package:analyzer/src/generated/ast.dart'; 9 import 'package:analyzer/src/generated/ast.dart';
10 import 'package:analyzer/src/generated/element.dart' as engine; 10 import 'package:analyzer/src/generated/element.dart' as engine;
(...skipping 27 matching lines...) Expand all
38 SimpleIdentifier nameNode = field.name; 38 SimpleIdentifier nameNode = field.name;
39 _addOverride(nameNode.offset, nameNode.length, nameNode.name); 39 _addOverride(nameNode.offset, nameNode.length, nameNode.name);
40 } 40 }
41 } 41 }
42 } 42 }
43 } 43 }
44 } 44 }
45 return _overrides; 45 return _overrides;
46 } 46 }
47 47
48 void _addInterfaceOverrides(List<engine.Element> elements, String name,
49 engine.InterfaceType type, bool checkType,
50 Set<engine.InterfaceType> visited) {
51 if (type == null) {
52 return;
53 }
54 if (!visited.add(type)) {
55 return;
56 }
57 // check type
58 if (checkType) {
59 engine.Element element = _lookupMember(type.element, name);
60 if (element != null) {
61 elements.add(element);
62 }
63 }
64 // check interfaces
65 for (engine.InterfaceType interfaceType in type.interfaces) {
66 _addInterfaceOverrides(elements, name, interfaceType, true, visited);
67 }
68 // check super
69 _addInterfaceOverrides(elements, name, type.superclass, true, visited);
70 }
71
48 void _addOverride(int offset, int length, String name) { 72 void _addOverride(int offset, int length, String name) {
49 // super 73 // super
50 engine.Element superEngineElement; 74 engine.Element superEngineElement;
51 { 75 {
52 engine.InterfaceType superType = _currentClass.supertype; 76 engine.InterfaceType superType = _currentClass.supertype;
53 if (superType != null) { 77 if (superType != null) {
54 superEngineElement = _lookupMember(superType.element, name); 78 superEngineElement = _lookupMember(superType.element, name);
55 } 79 }
56 } 80 }
57 // interfaces 81 // interfaces
58 List<engine.Element> interfaceEngineElements = <engine.Element>[]; 82 List<engine.Element> interfaceEngineElements = <engine.Element>[];
59 for (engine.InterfaceType interfaceType in _currentClass.interfaces) { 83 if (superEngineElement == null) {
60 engine.ClassElement interfaceElement = interfaceType.element; 84 Set<engine.InterfaceType> visitedTypes = new Set<engine.InterfaceType>();
61 engine.Element interfaceMember = _lookupMember(interfaceElement, name); 85 _addInterfaceOverrides(interfaceEngineElements, name, _currentClass.type,
62 if (interfaceMember != null) { 86 false, visitedTypes);
63 interfaceEngineElements.add(interfaceMember);
64 }
65 } 87 }
66 // is there any override? 88 // is there any override?
67 if (superEngineElement != null || interfaceEngineElements.isNotEmpty) { 89 if (superEngineElement != null || interfaceEngineElements.isNotEmpty) {
68 OverriddenMember superMember = superEngineElement != null 90 OverriddenMember superMember = superEngineElement != null
69 ? newOverriddenMember_fromEngine(superEngineElement) 91 ? newOverriddenMember_fromEngine(superEngineElement)
70 : null; 92 : null;
71 List<OverriddenMember> interfaceMembers = interfaceEngineElements 93 List<OverriddenMember> interfaceMembers = interfaceEngineElements
72 .map( 94 .map(
73 (engine.Element member) => newOverriddenMember_fromEngine(member)) 95 (engine.Element member) => newOverriddenMember_fromEngine(member))
74 .toList(); 96 .toList();
(...skipping 21 matching lines...) Expand all
96 } 118 }
97 // setter 119 // setter
98 member = classElement.lookUpSetter(name + '=', library); 120 member = classElement.lookUpSetter(name + '=', library);
99 if (member != null) { 121 if (member != null) {
100 return member; 122 return member;
101 } 123 }
102 // not found 124 // not found
103 return null; 125 return null;
104 } 126 }
105 } 127 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analysis_server/test/analysis/notification_overrides_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698