OLD | NEW |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |