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

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

Issue 1273003005: Keep only unique overridden elements. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Stop when found the corresponding element in an interface. Created 5 years, 4 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
« 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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 SimpleIdentifier nameNode = field.name; 44 SimpleIdentifier nameNode = field.name;
45 _addOverride(nameNode.offset, nameNode.length, nameNode.name); 45 _addOverride(nameNode.offset, nameNode.length, nameNode.name);
46 } 46 }
47 } 47 }
48 } 48 }
49 } 49 }
50 } 50 }
51 return _overrides; 51 return _overrides;
52 } 52 }
53 53
54 void _addInterfaceOverrides(List<engine.Element> elements, String name, 54 void _addInterfaceOverrides(
55 engine.InterfaceType type, bool checkType, 55 Set<engine.Element> elements,
56 String name,
57 engine.InterfaceType type,
58 bool checkType,
56 Set<engine.InterfaceType> visited) { 59 Set<engine.InterfaceType> visited) {
57 if (type == null) { 60 if (type == null) {
58 return; 61 return;
59 } 62 }
60 if (!visited.add(type)) { 63 if (!visited.add(type)) {
61 return; 64 return;
62 } 65 }
63 // check type 66 // check type
64 if (checkType) { 67 if (checkType) {
65 engine.Element element = _lookupMember(type.element, name); 68 engine.Element element = _lookupMember(type.element, name);
66 if (element != null) { 69 if (element != null) {
67 elements.add(element); 70 elements.add(element);
71 return;
68 } 72 }
69 } 73 }
70 // check interfaces 74 // check interfaces
71 for (engine.InterfaceType interfaceType in type.interfaces) { 75 for (engine.InterfaceType interfaceType in type.interfaces) {
72 _addInterfaceOverrides(elements, name, interfaceType, true, visited); 76 _addInterfaceOverrides(elements, name, interfaceType, true, visited);
73 } 77 }
74 // check super 78 // check super
75 _addInterfaceOverrides(elements, name, type.superclass, checkType, visited); 79 _addInterfaceOverrides(elements, name, type.superclass, checkType, visited);
76 } 80 }
77 81
78 void _addOverride(int offset, int length, String name) { 82 void _addOverride(int offset, int length, String name) {
79 // super 83 // super
80 engine.Element superEngineElement; 84 engine.Element superEngineElement;
81 { 85 {
82 engine.InterfaceType superType = _currentClass.supertype; 86 engine.InterfaceType superType = _currentClass.supertype;
83 if (superType != null) { 87 if (superType != null) {
84 superEngineElement = _lookupMember(superType.element, name); 88 superEngineElement = _lookupMember(superType.element, name);
85 } 89 }
86 } 90 }
87 // interfaces 91 // interfaces
88 List<engine.Element> interfaceEngineElements = <engine.Element>[]; 92 Set<engine.Element> interfaceEngineElements = new Set<engine.Element>();
89 _addInterfaceOverrides(interfaceEngineElements, name, _currentClass.type, 93 _addInterfaceOverrides(interfaceEngineElements, name, _currentClass.type,
90 false, new Set<engine.InterfaceType>()); 94 false, new Set<engine.InterfaceType>());
95 interfaceEngineElements.remove(superEngineElement);
91 // is there any override? 96 // is there any override?
92 if (superEngineElement != null || interfaceEngineElements.isNotEmpty) { 97 if (superEngineElement != null || interfaceEngineElements.isNotEmpty) {
93 OverriddenMember superMember = superEngineElement != null 98 OverriddenMember superMember = superEngineElement != null
94 ? newOverriddenMember_fromEngine(superEngineElement) 99 ? newOverriddenMember_fromEngine(superEngineElement)
95 : null; 100 : null;
96 List<OverriddenMember> interfaceMembers = interfaceEngineElements 101 List<OverriddenMember> interfaceMembers = interfaceEngineElements
97 .map((member) => newOverriddenMember_fromEngine(member)) 102 .map((member) => newOverriddenMember_fromEngine(member))
98 .toList(); 103 .toList();
99 _overrides.add(new Override(offset, length, 104 _overrides.add(new Override(offset, length,
100 superclassMember: superMember, 105 superclassMember: superMember,
(...skipping 19 matching lines...) Expand all
120 } 125 }
121 // setter 126 // setter
122 member = classElement.lookUpSetter(name + '=', library); 127 member = classElement.lookUpSetter(name + '=', library);
123 if (member != null) { 128 if (member != null) {
124 return member; 129 return member;
125 } 130 }
126 // not found 131 // not found
127 return null; 132 return null;
128 } 133 }
129 } 134 }
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