| 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 |