| 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('../tree/tree.dart'); | 7 #import('../tree/tree.dart'); |
| 8 #import('../scanner/scannerlib.dart'); | 8 #import('../scanner/scannerlib.dart'); |
| 9 #import('../leg.dart'); // TODO(karlklose): we only need type. | 9 #import('../leg.dart'); // TODO(karlklose): we only need type. |
| 10 #import('../util/util.dart'); | 10 #import('../util/util.dart'); |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 441 | 441 |
| 442 class TypedefElement extends Element implements TypeDeclarationElement { | 442 class TypedefElement extends Element implements TypeDeclarationElement { |
| 443 Type cachedType; | 443 Type cachedType; |
| 444 Typedef cachedNode; | 444 Typedef cachedNode; |
| 445 | 445 |
| 446 TypedefElement(SourceString name, Element enclosing) | 446 TypedefElement(SourceString name, Element enclosing) |
| 447 : super(name, ElementKind.TYPEDEF, enclosing); | 447 : super(name, ElementKind.TYPEDEF, enclosing); |
| 448 | 448 |
| 449 Type computeType(Compiler compiler) { | 449 Type computeType(Compiler compiler) { |
| 450 if (cachedType !== null) return cachedType; | 450 if (cachedType !== null) return cachedType; |
| 451 cachedType = compiler.computeFunctionType( | 451 cachedType = new FunctionType(null, null, this); |
| 452 this, compiler.resolveTypedef(this)); | 452 cachedType.initializeFrom( |
| 453 compiler.computeFunctionType(this, compiler.resolveTypedef(this))); |
| 453 return cachedType; | 454 return cachedType; |
| 454 } | 455 } |
| 455 | 456 |
| 456 Link<Type> get typeVariables() => const EmptyLink<Type>(); | 457 Link<Type> get typeVariables() => const EmptyLink<Type>(); |
| 457 | 458 |
| 458 Scope buildScope() => | 459 Scope buildScope() => |
| 459 new TypeDeclarationScope(enclosingElement.buildScope(), this); | 460 new TypeDeclarationScope(enclosingElement.buildScope(), this); |
| 460 } | 461 } |
| 461 | 462 |
| 462 class VariableElement extends Element { | 463 class VariableElement extends Element { |
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 884 final int id; | 885 final int id; |
| 885 InterfaceType type; | 886 InterfaceType type; |
| 886 Type supertype; | 887 Type supertype; |
| 887 Type defaultClass; | 888 Type defaultClass; |
| 888 Link<Element> members = const EmptyLink<Element>(); | 889 Link<Element> members = const EmptyLink<Element>(); |
| 889 Map<SourceString, Element> localMembers; | 890 Map<SourceString, Element> localMembers; |
| 890 Map<SourceString, Element> constructors; | 891 Map<SourceString, Element> constructors; |
| 891 Link<Type> interfaces = const EmptyLink<Type>(); | 892 Link<Type> interfaces = const EmptyLink<Type>(); |
| 892 bool isResolved = false; | 893 bool isResolved = false; |
| 893 bool isBeingResolved = false; | 894 bool isBeingResolved = false; |
| 895 bool isLoadingSupertypes = false; |
| 896 bool supertypesAreLoaded = false; |
| 897 |
| 894 // backendMembers are members that have been added by the backend to simplify | 898 // backendMembers are members that have been added by the backend to simplify |
| 895 // compilation. They don't have any user-side counter-part. | 899 // compilation. They don't have any user-side counter-part. |
| 896 Link<Element> backendMembers = const EmptyLink<Element>(); | 900 Link<Element> backendMembers = const EmptyLink<Element>(); |
| 897 | 901 |
| 898 Link<Type> allSupertypes; | 902 Link<Type> allSupertypes; |
| 899 ClassElement patch = null; | 903 ClassElement patch = null; |
| 900 | 904 |
| 901 ClassElement(SourceString name, CompilationUnitElement enclosing, this.id) | 905 ClassElement(SourceString name, CompilationUnitElement enclosing, this.id) |
| 902 : localMembers = new Map<SourceString, Element>(), | 906 : localMembers = new Map<SourceString, Element>(), |
| 903 constructors = new Map<SourceString, Element>(), | 907 constructors = new Map<SourceString, Element>(), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 922 Link<Type> parameters = | 926 Link<Type> parameters = |
| 923 TypeDeclarationElement.createTypeVariables(this, node.typeParameters); | 927 TypeDeclarationElement.createTypeVariables(this, node.typeParameters); |
| 924 type = new InterfaceType(this, parameters); | 928 type = new InterfaceType(this, parameters); |
| 925 } | 929 } |
| 926 return type; | 930 return type; |
| 927 } | 931 } |
| 928 | 932 |
| 929 Link<Type> get typeVariables() => type.arguments; | 933 Link<Type> get typeVariables() => type.arguments; |
| 930 | 934 |
| 931 ClassElement ensureResolved(Compiler compiler) { | 935 ClassElement ensureResolved(Compiler compiler) { |
| 932 compiler.resolveClass(this); | 936 if (!isResolved && !isBeingResolved) { |
| 937 isBeingResolved = true; |
| 938 compiler.resolver.resolveClass(this); |
| 939 isBeingResolved = false; |
| 940 isResolved = true; |
| 941 } |
| 933 return this; | 942 return this; |
| 934 } | 943 } |
| 935 | 944 |
| 936 Element lookupLocalMember(SourceString memberName) { | 945 Element lookupLocalMember(SourceString memberName) { |
| 937 return localMembers[memberName]; | 946 return localMembers[memberName]; |
| 938 } | 947 } |
| 939 | 948 |
| 940 Element lookupSuperMember(SourceString memberName) { | 949 Element lookupSuperMember(SourceString memberName) { |
| 941 bool isPrivate = memberName.isPrivate(); | 950 bool isPrivate = memberName.isPrivate(); |
| 942 for (ClassElement s = superclass; s != null; s = s.superclass) { | 951 for (ClassElement s = superclass; s != null; s = s.superclass) { |
| 943 // Private members from a different library are not visible. | 952 // Private members from a different library are not visible. |
| 944 if (isPrivate && getLibrary() !== s.getLibrary()) continue; | 953 if (isPrivate && getLibrary() !== s.getLibrary()) continue; |
| 945 Element e = s.lookupLocalMember(memberName); | 954 Element e = s.lookupLocalMember(memberName); |
| 946 if (e === null) continue; | 955 if (e === null) continue; |
| 947 // Static members are not inherited. | 956 // Static members are not inherited. |
| 948 if (e.modifiers.isStatic()) continue; | 957 if (e.modifiers.isStatic()) continue; |
| 949 return e; | 958 return e; |
| 950 } | 959 } |
| 960 if (isInterface()) { |
| 961 return lookupSuperInterfaceMember(memberName, getLibrary()); |
| 962 } |
| 951 return null; | 963 return null; |
| 952 } | 964 } |
| 953 | 965 |
| 966 Element lookupSuperInterfaceMember(SourceString memberName, |
| 967 LibraryElement fromLibrary) { |
| 968 for (Type t in interfaces) { |
| 969 Element e = t.element.lookupLocalMember(memberName); |
| 970 if (e === null) continue; |
| 971 // Private members from a different library are not visible. |
| 972 if (memberName.isPrivate() && fromLibrary !== e.getLibrary()) continue; |
| 973 // Static members are not inherited. |
| 974 if (e.modifiers.isStatic()) continue; |
| 975 return e; |
| 976 } |
| 977 } |
| 978 |
| 954 /** | 979 /** |
| 955 * Find the first member in the class chain with the given | 980 * Find the first member in the class chain with the given |
| 956 * [memberName]. This method is NOT to be used for resolving | 981 * [memberName]. This method is NOT to be used for resolving |
| 957 * unqualified sends because it does not implement the scoping | 982 * unqualified sends because it does not implement the scoping |
| 958 * rules, where library scope comes before superclass scope. | 983 * rules, where library scope comes before superclass scope. |
| 959 */ | 984 */ |
| 960 Element lookupMember(SourceString memberName) { | 985 Element lookupMember(SourceString memberName) { |
| 961 Element localMember = localMembers[memberName]; | 986 Element localMember = localMembers[memberName]; |
| 962 return localMember === null ? lookupSuperMember(memberName) : localMember; | 987 return localMember === null ? lookupSuperMember(memberName) : localMember; |
| 963 } | 988 } |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1285 TypeVariableElement(name, Element enclosing, this.cachedNode, | 1310 TypeVariableElement(name, Element enclosing, this.cachedNode, |
| 1286 [this.type, this.bound]) | 1311 [this.type, this.bound]) |
| 1287 : super(name, ElementKind.TYPE_VARIABLE, enclosing); | 1312 : super(name, ElementKind.TYPE_VARIABLE, enclosing); |
| 1288 | 1313 |
| 1289 TypeVariableType computeType(compiler) => type; | 1314 TypeVariableType computeType(compiler) => type; |
| 1290 | 1315 |
| 1291 Node parseNode(compiler) => cachedNode; | 1316 Node parseNode(compiler) => cachedNode; |
| 1292 | 1317 |
| 1293 String toString() => "${enclosingElement.toString()}.${name.slowToString()}"; | 1318 String toString() => "${enclosingElement.toString()}.${name.slowToString()}"; |
| 1294 } | 1319 } |
| OLD | NEW |