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

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

Issue 1519413002: Issue 25244. Disable invalid overrides. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years 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;
11 11
12 /** 12 /**
13 * A computer for class member overrides in a Dart [CompilationUnit]. 13 * A computer for class member overrides in a Dart [CompilationUnit].
14 */ 14 */
15 class DartUnitOverridesComputer { 15 class DartUnitOverridesComputer {
16 static const List<ElementKind> FIELD_KINDS = const <ElementKind>[
17 ElementKind.FIELD,
18 ElementKind.GETTER,
19 ElementKind.SETTER
20 ];
21
22 static const List<ElementKind> GETTER_KINDS = const <ElementKind>[
23 ElementKind.FIELD,
24 ElementKind.GETTER
25 ];
26
27 static const List<ElementKind> METHOD_KINDS = const <ElementKind>[
28 ElementKind.METHOD
29 ];
30
31 static const List<ElementKind> SETTER_KINDS = const <ElementKind>[
32 ElementKind.FIELD,
33 ElementKind.SETTER
34 ];
35
16 final CompilationUnit _unit; 36 final CompilationUnit _unit;
17 37
18 final List<Override> _overrides = <Override>[]; 38 final List<Override> _overrides = <Override>[];
19 engine.ClassElement _currentClass; 39 engine.ClassElement _currentClass;
20 40
21 DartUnitOverridesComputer(this._unit); 41 DartUnitOverridesComputer(this._unit);
22 42
23 /** 43 /**
24 * Returns the computed occurrences, not `null`. 44 * Returns the computed occurrences, not `null`.
25 */ 45 */
26 List<Override> compute() { 46 List<Override> compute() {
27 for (CompilationUnitMember unitMember in _unit.declarations) { 47 for (CompilationUnitMember unitMember in _unit.declarations) {
28 if (unitMember is ClassDeclaration) { 48 if (unitMember is ClassDeclaration) {
29 _currentClass = unitMember.element; 49 _currentClass = unitMember.element;
30 for (ClassMember classMember in unitMember.members) { 50 for (ClassMember classMember in unitMember.members) {
31 if (classMember is MethodDeclaration) { 51 if (classMember is MethodDeclaration) {
32 if (classMember.isStatic) { 52 if (classMember.isStatic) {
33 continue; 53 continue;
34 } 54 }
35 SimpleIdentifier nameNode = classMember.name; 55 SimpleIdentifier nameNode = classMember.name;
36 _addOverride(nameNode.offset, nameNode.length, nameNode.name); 56 List<ElementKind> kinds;
57 if (classMember.isGetter) {
58 kinds = GETTER_KINDS;
59 } else if (classMember.isSetter) {
60 kinds = SETTER_KINDS;
61 } else {
62 kinds = METHOD_KINDS;
63 }
64 _addOverride(
65 nameNode.offset, nameNode.length, nameNode.name, kinds);
37 } 66 }
38 if (classMember is FieldDeclaration) { 67 if (classMember is FieldDeclaration) {
39 if (classMember.isStatic) { 68 if (classMember.isStatic) {
40 continue; 69 continue;
41 } 70 }
42 List<VariableDeclaration> fields = classMember.fields.variables; 71 List<VariableDeclaration> fields = classMember.fields.variables;
43 for (VariableDeclaration field in fields) { 72 for (VariableDeclaration field in fields) {
44 SimpleIdentifier nameNode = field.name; 73 SimpleIdentifier nameNode = field.name;
45 _addOverride(nameNode.offset, nameNode.length, nameNode.name); 74 _addOverride(
75 nameNode.offset, nameNode.length, nameNode.name, FIELD_KINDS);
46 } 76 }
47 } 77 }
48 } 78 }
49 } 79 }
50 } 80 }
51 return _overrides; 81 return _overrides;
52 } 82 }
53 83
54 void _addInterfaceOverrides( 84 void _addInterfaceOverrides(
55 Set<engine.Element> elements, 85 Set<engine.Element> elements,
56 String name, 86 String name,
87 List<ElementKind> kinds,
57 engine.InterfaceType type, 88 engine.InterfaceType type,
58 bool checkType, 89 bool checkType,
59 Set<engine.InterfaceType> visited) { 90 Set<engine.InterfaceType> visited) {
60 if (type == null) { 91 if (type == null) {
61 return; 92 return;
62 } 93 }
63 if (!visited.add(type)) { 94 if (!visited.add(type)) {
64 return; 95 return;
65 } 96 }
66 // check type 97 // check type
67 if (checkType) { 98 if (checkType) {
68 engine.Element element = _lookupMember(type.element, name); 99 engine.Element element = _lookupMember(type.element, name, kinds);
69 if (element != null) { 100 if (element != null) {
70 elements.add(element); 101 elements.add(element);
71 return; 102 return;
72 } 103 }
73 } 104 }
74 // check interfaces 105 // check interfaces
75 for (engine.InterfaceType interfaceType in type.interfaces) { 106 for (engine.InterfaceType interfaceType in type.interfaces) {
76 _addInterfaceOverrides(elements, name, interfaceType, true, visited); 107 _addInterfaceOverrides(
108 elements, name, kinds, interfaceType, true, visited);
77 } 109 }
78 // check super 110 // check super
79 _addInterfaceOverrides(elements, name, type.superclass, checkType, visited); 111 _addInterfaceOverrides(
112 elements, name, kinds, type.superclass, checkType, visited);
80 } 113 }
81 114
82 void _addOverride(int offset, int length, String name) { 115 void _addOverride(
116 int offset, int length, String name, List<ElementKind> kinds) {
83 // super 117 // super
84 engine.Element superEngineElement; 118 engine.Element superEngineElement;
85 { 119 {
86 engine.InterfaceType superType = _currentClass.supertype; 120 engine.InterfaceType superType = _currentClass.supertype;
87 if (superType != null) { 121 if (superType != null) {
88 superEngineElement = _lookupMember(superType.element, name); 122 superEngineElement = _lookupMember(superType.element, name, kinds);
89 } 123 }
90 } 124 }
91 // interfaces 125 // interfaces
92 Set<engine.Element> interfaceEngineElements = new Set<engine.Element>(); 126 Set<engine.Element> interfaceEngineElements = new Set<engine.Element>();
93 _addInterfaceOverrides(interfaceEngineElements, name, _currentClass.type, 127 _addInterfaceOverrides(interfaceEngineElements, name, kinds,
94 false, new Set<engine.InterfaceType>()); 128 _currentClass.type, false, new Set<engine.InterfaceType>());
95 interfaceEngineElements.remove(superEngineElement); 129 interfaceEngineElements.remove(superEngineElement);
96 // is there any override? 130 // is there any override?
97 if (superEngineElement != null || interfaceEngineElements.isNotEmpty) { 131 if (superEngineElement != null || interfaceEngineElements.isNotEmpty) {
98 OverriddenMember superMember = superEngineElement != null 132 OverriddenMember superMember = superEngineElement != null
99 ? newOverriddenMember_fromEngine(superEngineElement) 133 ? newOverriddenMember_fromEngine(superEngineElement)
100 : null; 134 : null;
101 List<OverriddenMember> interfaceMembers = interfaceEngineElements 135 List<OverriddenMember> interfaceMembers = interfaceEngineElements
102 .map((member) => newOverriddenMember_fromEngine(member)) 136 .map((member) => newOverriddenMember_fromEngine(member))
103 .toList(); 137 .toList();
104 _overrides.add(new Override(offset, length, 138 _overrides.add(new Override(offset, length,
105 superclassMember: superMember, 139 superclassMember: superMember,
106 interfaceMembers: nullIfEmpty(interfaceMembers))); 140 interfaceMembers: nullIfEmpty(interfaceMembers)));
107 } 141 }
108 } 142 }
109 143
110 static engine.Element _lookupMember( 144 static engine.Element _lookupMember(
111 engine.ClassElement classElement, String name) { 145 engine.ClassElement classElement, String name, List<ElementKind> kinds) {
112 if (classElement == null) { 146 if (classElement == null) {
113 return null; 147 return null;
114 } 148 }
115 engine.LibraryElement library = classElement.library; 149 engine.LibraryElement library = classElement.library;
150 engine.Element member;
116 // method 151 // method
117 engine.Element member = classElement.lookUpMethod(name, library); 152 if (kinds.contains(ElementKind.METHOD)) {
118 if (member != null) { 153 member = classElement.lookUpMethod(name, library);
119 return member; 154 if (member != null) {
155 return member;
156 }
120 } 157 }
121 // getter 158 // getter
122 member = classElement.lookUpGetter(name, library); 159 if (kinds.contains(ElementKind.GETTER)) {
123 if (member != null) { 160 member = classElement.lookUpGetter(name, library);
124 return member; 161 if (member != null) {
162 return member;
163 }
125 } 164 }
126 // setter 165 // setter
127 member = classElement.lookUpSetter(name + '=', library); 166 if (kinds.contains(ElementKind.SETTER)) {
128 if (member != null) { 167 member = classElement.lookUpSetter(name + '=', library);
129 return member; 168 if (member != null) {
169 return member;
170 }
130 } 171 }
131 // not found 172 // not found
132 return null; 173 return null;
133 } 174 }
134 } 175 }
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