Chromium Code Reviews| Index: dart/lib/compiler/implementation/elements/elements.dart |
| diff --git a/dart/lib/compiler/implementation/elements/elements.dart b/dart/lib/compiler/implementation/elements/elements.dart |
| index 432d835a3f4c120c8dc82a4093bea074d2af20cf..5a05bacced371c4e6b5710e287166ff85885efcd 100644 |
| --- a/dart/lib/compiler/implementation/elements/elements.dart |
| +++ b/dart/lib/compiler/implementation/elements/elements.dart |
| @@ -440,8 +440,9 @@ class TypedefElement extends Element implements TypeDeclarationElement { |
| Type computeType(Compiler compiler) { |
| if (cachedType !== null) return cachedType; |
| - cachedType = compiler.computeFunctionType( |
| - this, compiler.resolveTypedef(this)); |
| + cachedType = new FunctionType(null, null, this); |
| + cachedType.initializeFrom( |
| + compiler.computeFunctionType(this, compiler.resolveTypedef(this))); |
| return cachedType; |
| } |
| @@ -883,6 +884,9 @@ class ClassElement extends ContainerElement |
| Link<Type> interfaces = const EmptyLink<Type>(); |
| bool isResolved = false; |
| bool isBeingResolved = false; |
| + bool isLoadingSupertypes = false; |
| + bool supertypesAreLoaded = false; |
|
Lasse Reichstein Nielsen
2012/08/07 09:02:17
Should we consider some kind of "state" type with
|
| + |
| // backendMembers are members that have been added by the backend to simplify |
| // compilation. They don't have any user-side counter-part. |
| Link<Element> backendMembers = const EmptyLink<Element>(); |
| @@ -921,7 +925,12 @@ class ClassElement extends ContainerElement |
| Link<Type> get typeVariables() => type.arguments; |
| ClassElement ensureResolved(Compiler compiler) { |
| - compiler.resolveClass(this); |
| + if (!isResolved && !isBeingResolved) { |
| + isBeingResolved = true; |
| + compiler.resolver.resolveClass(this); |
|
Lasse Reichstein Nielsen
2012/08/07 09:02:17
This looks like the job for a work queue.
Can't w
|
| + isBeingResolved = false; |
| + isResolved = true; |
| + } |
| return this; |
| } |
| @@ -939,9 +948,25 @@ class ClassElement extends ContainerElement |
| if (e.modifiers.isStatic()) continue; |
| return e; |
| } |
| + if (isInterface()) { |
| + return lookupSuperInterfaceMember(memberName, getLibrary()); |
| + } |
| return null; |
| } |
| + Element lookupSuperInterfaceMember(SourceString memberName, |
| + LibraryElement fromLibrary) { |
| + for (Type t in interfaces) { |
| + Element e = t.element.lookupLocalMember(memberName); |
| + if (e === null) continue; |
| + // Private members from a different library are not visible. |
| + if (memberName.isPrivate() && fromLibrary !== e.getLibrary()) continue; |
| + // Static members are not inherited. |
| + if (e.modifiers.isStatic()) continue; |
| + return e; |
| + } |
| + } |
| + |
| /** |
| * Find the first member in the class chain with the given |
| * [memberName]. This method is NOT to be used for resolving |