OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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('elements'); | 5 #library('elements'); |
6 | 6 |
7 #import('dart:uri'); | 7 #import('dart:uri'); |
8 | 8 |
9 #import('../tree/tree.dart'); | 9 #import('../tree/tree.dart'); |
10 #import('../scanner/scannerlib.dart'); | 10 #import('../scanner/scannerlib.dart'); |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 | 267 |
268 bool _isNative = false; | 268 bool _isNative = false; |
269 void setNative() { _isNative = true; } | 269 void setNative() { _isNative = true; } |
270 bool isNative() => _isNative; | 270 bool isNative() => _isNative; |
271 | 271 |
272 FunctionElement asFunctionElement() => null; | 272 FunctionElement asFunctionElement() => null; |
273 | 273 |
274 Element cloneTo(Element enclosing, DiagnosticListener listener) { | 274 Element cloneTo(Element enclosing, DiagnosticListener listener) { |
275 listener.cancel("Unimplemented cloneTo", element: this); | 275 listener.cancel("Unimplemented cloneTo", element: this); |
276 } | 276 } |
| 277 |
| 278 Link<Type> get allSupertypesAndSelf() { |
| 279 return allSupertypes.prepend(new InterfaceType(this)); |
| 280 } |
277 } | 281 } |
278 | 282 |
279 class ContainerElement extends Element { | 283 class ContainerElement extends Element { |
280 Link<Element> localMembers = const EmptyLink<Element>(); | 284 Link<Element> localMembers = const EmptyLink<Element>(); |
281 | 285 |
282 ContainerElement(name, kind, enclosingElement) | 286 ContainerElement(name, kind, enclosingElement) |
283 : super(name, kind, enclosingElement); | 287 : super(name, kind, enclosingElement); |
284 | 288 |
285 void addMember(Element element, DiagnosticListener listener) { | 289 void addMember(Element element, DiagnosticListener listener) { |
286 localMembers = localMembers.prepend(element); | 290 localMembers = localMembers.prepend(element); |
(...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1059 bool isPrivate = memberName.isPrivate(); | 1063 bool isPrivate = memberName.isPrivate(); |
1060 for (ClassElement s = superclass; s != null; s = s.superclass) { | 1064 for (ClassElement s = superclass; s != null; s = s.superclass) { |
1061 // Private members from a different library are not visible. | 1065 // Private members from a different library are not visible. |
1062 if (isPrivate && getLibrary() !== s.getLibrary()) continue; | 1066 if (isPrivate && getLibrary() !== s.getLibrary()) continue; |
1063 Element e = s.lookupLocalMember(memberName); | 1067 Element e = s.lookupLocalMember(memberName); |
1064 if (e === null) continue; | 1068 if (e === null) continue; |
1065 // Static members are not inherited. | 1069 // Static members are not inherited. |
1066 if (e.modifiers.isStatic()) continue; | 1070 if (e.modifiers.isStatic()) continue; |
1067 return e; | 1071 return e; |
1068 } | 1072 } |
| 1073 if (isInterface()) { |
| 1074 return lookupSuperInterfaceMember(memberName, getLibrary()); |
| 1075 } |
| 1076 return null; |
| 1077 } |
| 1078 |
| 1079 Element lookupSuperInterfaceMember(SourceString memberName, |
| 1080 LibraryElement fromLibrary) { |
| 1081 bool isPrivate = memberName.isPrivate(); |
| 1082 for (Type t in interfaces) { |
| 1083 Element e = t.element.lookupLocalMember(memberName); |
| 1084 if (e === null) continue; |
| 1085 // Private members from a different library are not visible. |
| 1086 if (isPrivate && fromLibrary !== e.getLibrary()) continue; |
| 1087 // Static members are not inherited. |
| 1088 if (e.modifiers.isStatic()) continue; |
| 1089 return e; |
| 1090 } |
1069 return null; | 1091 return null; |
1070 } | 1092 } |
1071 | 1093 |
1072 /** | 1094 /** |
1073 * Find the first member in the class chain with the given | 1095 * Find the first member in the class chain with the given |
1074 * [memberName]. This method is NOT to be used for resolving | 1096 * [memberName]. This method is NOT to be used for resolving |
1075 * unqualified sends because it does not implement the scoping | 1097 * unqualified sends because it does not implement the scoping |
1076 * rules, where library scope comes before superclass scope. | 1098 * rules, where library scope comes before superclass scope. |
1077 */ | 1099 */ |
1078 Element lookupMember(SourceString memberName) { | 1100 Element lookupMember(SourceString memberName) { |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1427 Node parseNode(compiler) => cachedNode; | 1449 Node parseNode(compiler) => cachedNode; |
1428 | 1450 |
1429 String toString() => "${enclosingElement.toString()}.${name.slowToString()}"; | 1451 String toString() => "${enclosingElement.toString()}.${name.slowToString()}"; |
1430 | 1452 |
1431 TypeVariableElement cloneTo(Element enclosing, DiagnosticListener listener) { | 1453 TypeVariableElement cloneTo(Element enclosing, DiagnosticListener listener) { |
1432 TypeVariableElement result = | 1454 TypeVariableElement result = |
1433 new TypeVariableElement(name, enclosing, node, type, bound); | 1455 new TypeVariableElement(name, enclosing, node, type, bound); |
1434 return result; | 1456 return result; |
1435 } | 1457 } |
1436 } | 1458 } |
OLD | NEW |