Index: dart/compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java |
diff --git a/dart/compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java b/dart/compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java |
deleted file mode 100644 |
index 83b6631f65b0ba01e02b41d4fe399ec9b176327c..0000000000000000000000000000000000000000 |
--- a/dart/compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java |
+++ /dev/null |
@@ -1,463 +0,0 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-package com.google.dart.compiler.resolver; |
- |
-import com.google.common.collect.Lists; |
-import com.google.dart.compiler.ast.ASTNodes; |
-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; |
-import com.google.dart.compiler.ast.DartStringLiteral; |
-import com.google.dart.compiler.ast.DartTypeParameter; |
-import com.google.dart.compiler.ast.Modifiers; |
-import com.google.dart.compiler.common.SourceInfo; |
-import com.google.dart.compiler.type.InterfaceType; |
-import com.google.dart.compiler.type.Type; |
- |
-import java.util.ArrayList; |
-import java.util.HashMap; |
-import java.util.HashSet; |
-import java.util.Iterator; |
-import java.util.List; |
-import java.util.Map; |
-import java.util.Set; |
-import java.util.concurrent.atomic.AtomicReference; |
- |
-class ClassElementImplementation extends AbstractNodeElement implements ClassNodeElement { |
- private InterfaceType type; |
- 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; |
- private final Modifiers modifiers; |
- private final AtomicReference<List<InterfaceType>> allSupertypes = |
- new AtomicReference<List<InterfaceType>>(); |
- private final SourceInfo nameLocation; |
- private final String declarationNameWithTypeParameter; |
- private List<Element> unimplementedMembers; |
- private final int openBraceOffset; |
- private final int closeBraceOffset; |
- private final boolean hasSuperInvocation; |
- |
- // declared volatile for thread-safety |
- @SuppressWarnings("unused") |
- private volatile Set<InterfaceType> subtypes; |
- |
- private final List<ConstructorNodeElement> constructors = Lists.newArrayList(); |
- private final ElementMap members = new ElementMap(); |
- |
- private final LibraryElement library; |
- |
- private static ThreadLocal<Set<Element>> seenSupertypes = new ThreadLocal<Set<Element>>() { |
- @Override |
- protected Set<Element> initialValue() { |
- return new HashSet<Element>(); |
- } |
- }; |
- |
- ClassElementImplementation(DartClass node, String name, String nativeName, |
- LibraryElement library) { |
- super(node, name); |
- this.nativeName = nativeName; |
- this.library = library; |
- if (node != null) { |
- isInterface = node.isInterface(); |
- metadata = node.getObsoleteMetadata(); |
- modifiers = node.getModifiers(); |
- nameLocation = node.getName().getSourceInfo(); |
- declarationNameWithTypeParameter = createDeclarationName(node.getName(), node.getTypeParameters()); |
- openBraceOffset = node.getOpenBraceOffset(); |
- closeBraceOffset = node.getCloseBraceOffset(); |
- hasSuperInvocation = ASTNodes.hasSuperInvocation(node); |
- } else { |
- isInterface = false; |
- metadata = DartObsoleteMetadata.EMPTY; |
- modifiers = Modifiers.NONE; |
- nameLocation = SourceInfo.UNKNOWN; |
- declarationNameWithTypeParameter = ""; |
- openBraceOffset = -1; |
- closeBraceOffset = -1; |
- hasSuperInvocation = false; |
- } |
- } |
- |
- 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; |
- hasSuperInvocation = false; |
- } else { |
- isInterface = false; |
- metadata = DartObsoleteMetadata.EMPTY; |
- modifiers = Modifiers.NONE; |
- nameLocation = SourceInfo.UNKNOWN; |
- declarationNameWithTypeParameter = ""; |
- openBraceOffset = -1; |
- closeBraceOffset = -1; |
- hasSuperInvocation = false; |
- } |
- } |
- |
- @Override |
- public DartDeclaration<?> getNode() { |
- return (DartDeclaration<?>) super.getNode(); |
- } |
- |
- @Override |
- public SourceInfo getNameLocation() { |
- return nameLocation; |
- } |
- |
- @Override |
- public void setType(InterfaceType type) { |
- this.type = type; |
- } |
- |
- @Override |
- public InterfaceType getType() { |
- return type; |
- } |
- |
- @Override |
- public List<Type> getTypeParameters() { |
- return getType().getArguments(); |
- } |
- |
- @Override |
- public InterfaceType getSupertype() { |
- return supertype; |
- } |
- |
- @Override |
- public InterfaceType getDefaultClass() { |
- return defaultClass; |
- } |
- |
- @Override |
- public void setSupertype(InterfaceType supertype) { |
- if (this.supertype != null) { |
- this.supertype.unregisterSubClass(this); |
- } |
- this.supertype = supertype; |
- if (this.supertype != null) { |
- this.supertype.registerSubClass(this); |
- } |
- } |
- |
- void setDefaultClass(InterfaceType element) { |
- defaultClass = element; |
- } |
- |
- @Override |
- public Iterable<NodeElement> getMembers() { |
- return new Iterable<NodeElement>() { |
- // The only use case for calling getMembers() is for iterating through the |
- // members. You should not be able to add or remove members through the |
- // object returned by this method. Returning members or members.value() |
- // would allow such direct manipulation which might be problematic for |
- // keeping the element model consistent. |
- // |
- // On the other hand, we don't want to make a defensive copy of the list |
- // because that makes this method expensive. This method should not be |
- // expensive because the IDE may be using it in interactive scenarios. |
- // Strictly speaking, we should also wrap the iterator as we don't want |
- // the method Iterator.remove to be used either. |
- @Override |
- public Iterator<NodeElement> iterator() { |
- return members.values().iterator(); |
- } |
- }; |
- } |
- |
- @Override |
- public List<ConstructorNodeElement> getConstructors() { |
- return constructors; |
- } |
- |
- @Override |
- public List<InterfaceType> getInterfaces() { |
- return interfaces; |
- } |
- |
- @Override |
- public List<InterfaceType> getMixins() { |
- return mixins; |
- } |
- |
- @Override |
- public ElementKind getKind() { |
- return ElementKind.CLASS; |
- } |
- |
- @Override |
- public boolean isInterface() { |
- return isInterface; |
- } |
- |
- @Override |
- public DartObsoleteMetadata getMetadata() { |
- return metadata; |
- } |
- |
- @Override |
- public Modifiers getModifiers() { |
- return modifiers; |
- } |
- |
- @Override |
- public LibraryElement getLibrary() { |
- return library; |
- } |
- |
- @Override |
- public String getNativeName() { |
- return nativeName; |
- } |
- |
- @Override |
- public String getDeclarationNameWithTypeParameters() { |
- return declarationNameWithTypeParameter; |
- } |
- |
- void addMethod(MethodNodeElement member) { |
- String name = member.getName(); |
- if (member.getModifiers().isOperator()) { |
- name = "operator " + name; |
- } |
- members.add(name, member); |
- } |
- |
- void addConstructor(ConstructorNodeElement member) { |
- constructors.add(member); |
- } |
- |
- void addField(FieldNodeElement member) { |
- members.add(member.getName(), member); |
- } |
- |
- void addInterface(InterfaceType type) { |
- 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. |
- // Match resolve order in Resolver.visitMethodInvocation |
- Element element = lookupLocalMethod(name); |
- if (element != null) { |
- return element; |
- } |
- element = lookupLocalField(name); |
- if (element != null) { |
- return element; |
- } |
- if (type != null) { |
- for (Type arg : type.getArguments()) { |
- if (arg.getElement().getName().equals(name)) { |
- return arg.getElement(); |
- } |
- } |
- } |
- // Don't look for constructors, they are in a different namespace. |
- return null; |
- } |
- |
- /** |
- * Lookup a constructor declared in this class. Note that a class may define |
- * constructors for interfaces in case the class is a default implementation. |
- * |
- * @param type The type of the object this constructor is creating. |
- * @param name The constructor name ("" if unnamed). |
- * |
- * @return The constructor found in the class, or null if not found. |
- */ |
- ConstructorElement lookupConstructor(ClassElement type, String name) { |
- for (ConstructorElement element : constructors) { |
- if (element.getConstructorType().equals(type) && element.getName().equals(name)) { |
- return element; |
- } |
- } |
- return null; |
- } |
- |
- @Override |
- public ConstructorElement lookupConstructor(String name) { |
- // Lookup a constructor that creates instances of this class. |
- return lookupConstructor(this, name); |
- } |
- |
- @Override |
- public Element lookupLocalElement(String name) { |
- return members.get(name); |
- } |
- |
- FieldElement lookupLocalField(String name) { |
- return (FieldElement) members.get(name, ElementKind.FIELD); |
- } |
- |
- MethodElement lookupLocalMethod(String name) { |
- return (MethodElement) members.get(name, ElementKind.METHOD); |
- } |
- |
- public static ClassElementImplementation fromNode(DartClass node, LibraryElement library) { |
- DartStringLiteral nativeName = node.getNativeName(); |
- 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); |
- } |
- |
- @Override |
- public boolean isObject() { |
- return supertype == null; |
- } |
- |
- @Override |
- public boolean isObjectChild() { |
- return supertype != null && supertype.getElement().isObject(); |
- } |
- |
- @Override |
- public EnclosingElement getEnclosingElement() { |
- return library; |
- } |
- |
- @Override |
- public List<InterfaceType> getAllSupertypes() |
- throws CyclicDeclarationException { |
- List<InterfaceType> list = allSupertypes.get(); |
- if (list == null) { |
- allSupertypes.compareAndSet(null, computeAllSupertypes()); |
- list = allSupertypes.get(); |
- } |
- return list; |
- } |
- |
- private List<InterfaceType> computeAllSupertypes() |
- throws CyclicDeclarationException { |
- Map<ClassElement, InterfaceType> interfaces = new HashMap<ClassElement, InterfaceType>(); |
- if (!seenSupertypes.get().add(this)) { |
- throw new CyclicDeclarationException(this); |
- } |
- ArrayList<InterfaceType> supertypes = new ArrayList<InterfaceType>(); |
- try { |
- 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()) { |
- addInterfaceToSupertypes(interfaces, supertypes, |
- t.subst(intf.getArguments(), |
- intf.getElement().getTypeParameters())); |
- } |
- } |
- } |
- if (supertype != null) { |
- for (InterfaceType t : supertype.getElement().getAllSupertypes()) { |
- if (t.getElement().isInterface()) { |
- addInterfaceToSupertypes(interfaces, supertypes, |
- t.subst(supertype.getArguments(), |
- supertype.getElement().getTypeParameters())); |
- } |
- } |
- supertypes.add(supertype); |
- for (InterfaceType t : supertype.getElement().getAllSupertypes()) { |
- if (!t.getElement().isInterface()) { |
- supertypes.add(t.subst(supertype.getArguments(), |
- supertype.getElement().getTypeParameters())); |
- } |
- } |
- } |
- } finally { |
- seenSupertypes.get().remove(this); |
- } |
- return supertypes; |
- } |
- |
- private String createDeclarationName( |
- DartIdentifier name, List<DartTypeParameter> typeParameters) { |
- StringBuilder builder = new StringBuilder(); |
- builder.append(name.toSource()); |
- int count = typeParameters.size(); |
- if (count > 0) { |
- builder.append("<"); |
- for (int i = 0; i < count; i++) { |
- if (i > 0) { |
- builder.append(", "); |
- } |
- builder.append(typeParameters.get(i).toSource()); |
- } |
- builder.append(">"); |
- } |
- return builder.toString(); |
- } |
- |
- private void addInterfaceToSupertypes(Map<ClassElement, InterfaceType> interfaces, |
- ArrayList<InterfaceType> supertypes, |
- InterfaceType intf) { |
- InterfaceType existing = interfaces.put(intf.getElement(), intf); |
- if (existing == null || !(existing.equals(intf))){ |
- supertypes.add(intf); |
- } |
- } |
- |
- @Override |
- public List<Element> getUnimplementedMembers() { |
- return unimplementedMembers; |
- } |
- |
- @Override |
- public void setUnimplementedMembers(List<Element> members) { |
- this.unimplementedMembers = members; |
- } |
- |
- @Override |
- public int getOpenBraceOffset() { |
- return openBraceOffset; |
- } |
- |
- @Override |
- public int getCloseBraceOffset() { |
- return closeBraceOffset; |
- } |
- |
- @Override |
- public boolean hasSuperInvocation() { |
- return hasSuperInvocation; |
- } |
-} |