Index: compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java |
diff --git a/compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java b/compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java |
index 64d0528050d6319270dc131424b58b363d7a32a3..65aa64407bed9f11cc17bbf8413804149690d136 100644 |
--- a/compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java |
+++ b/compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java |
@@ -6,6 +6,7 @@ package com.google.dart.compiler.resolver; |
import com.google.common.collect.Lists; |
import com.google.dart.compiler.ast.DartClass; |
+import com.google.dart.compiler.ast.DartClassTypeAlias; |
import com.google.dart.compiler.ast.DartDeclaration; |
import com.google.dart.compiler.ast.DartIdentifier; |
import com.google.dart.compiler.ast.DartObsoleteMetadata; |
@@ -30,6 +31,7 @@ class ClassElementImplementation extends AbstractNodeElement implements ClassNod |
private InterfaceType supertype; |
private InterfaceType defaultClass; |
private final List<InterfaceType> interfaces = Lists.newArrayList(); |
+ private final List<InterfaceType> mixins = Lists.newArrayList(); |
private final boolean isInterface; |
private final String nativeName; |
private final DartObsoleteMetadata metadata; |
@@ -81,6 +83,30 @@ class ClassElementImplementation extends AbstractNodeElement implements ClassNod |
closeBraceOffset = -1; |
} |
} |
+ |
+ ClassElementImplementation(DartClassTypeAlias node, String name, |
+ LibraryElement library) { |
+ super(node, name); |
+ this.nativeName = null; |
+ this.library = library; |
+ if (node != null) { |
+ isInterface = false; |
+ metadata = node.getObsoleteMetadata(); |
+ modifiers = node.getModifiers(); |
+ nameLocation = node.getName().getSourceInfo(); |
+ declarationNameWithTypeParameter = createDeclarationName(node.getName(), node.getTypeParameters()); |
+ openBraceOffset = -1; |
+ closeBraceOffset = -1; |
+ } else { |
+ isInterface = false; |
+ metadata = DartObsoleteMetadata.EMPTY; |
+ modifiers = Modifiers.NONE; |
+ nameLocation = SourceInfo.UNKNOWN; |
+ declarationNameWithTypeParameter = ""; |
+ openBraceOffset = -1; |
+ closeBraceOffset = -1; |
+ } |
+ } |
@Override |
public DartDeclaration<?> getNode() { |
@@ -162,6 +188,11 @@ class ClassElementImplementation extends AbstractNodeElement implements ClassNod |
public List<InterfaceType> getInterfaces() { |
return interfaces; |
} |
+ |
+ @Override |
+ public List<InterfaceType> getMixins() { |
+ return mixins; |
+ } |
@Override |
public ElementKind getKind() { |
@@ -218,6 +249,10 @@ class ClassElementImplementation extends AbstractNodeElement implements ClassNod |
interfaces.add(type); |
type.registerSubClass(this); |
} |
+ |
+ void addMixin(InterfaceType type) { |
+ mixins.add(type); |
+ } |
Element findElement(String name) { |
// Temporary find all strategy to get things working. |
@@ -283,6 +318,15 @@ class ClassElementImplementation extends AbstractNodeElement implements ClassNod |
String nativeNameString = (nativeName == null ? null : nativeName.getValue()); |
return new ClassElementImplementation(node, node.getClassName(), nativeNameString, library); |
} |
+ |
+ static class ClassAliasElementImplementation extends ClassElementImplementation implements ClassAliasElement { |
+ ClassAliasElementImplementation(DartClassTypeAlias node, String name, LibraryElement library) { |
+ super(node, name, library); |
+ } |
+ } |
+ public static ClassAliasElement fromNode(DartClassTypeAlias node, LibraryElement library) { |
+ return new ClassAliasElementImplementation(node, node.getClassName(), library); |
+ } |
public static ClassElementImplementation named(String name) { |
return new ClassElementImplementation(null, name, null, null); |
@@ -325,6 +369,9 @@ class ClassElementImplementation extends AbstractNodeElement implements ClassNod |
for (InterfaceType intf : getInterfaces()) { |
addInterfaceToSupertypes(interfaces, supertypes, intf); |
} |
+ for (InterfaceType mix : getMixins()) { |
+ addInterfaceToSupertypes(interfaces, supertypes, mix); |
+ } |
for (InterfaceType intf : getInterfaces()) { |
for (InterfaceType t : intf.getElement().getAllSupertypes()) { |
if (!t.getElement().isObject()) { |