Index: dart/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java |
diff --git a/dart/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java b/dart/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java |
deleted file mode 100644 |
index 9e461a1232de21c949289ffd1d8919f2659f9081..0000000000000000000000000000000000000000 |
--- a/dart/compiler/java/com/google/dart/compiler/resolver/TopLevelElementBuilder.java |
+++ /dev/null |
@@ -1,323 +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.annotations.VisibleForTesting; |
-import com.google.common.collect.Lists; |
-import com.google.common.collect.Maps; |
-import com.google.common.collect.Sets; |
-import com.google.dart.compiler.DartCompilationError; |
-import com.google.dart.compiler.DartCompilerContext; |
-import com.google.dart.compiler.DartCompilerListener; |
-import com.google.dart.compiler.ErrorCode; |
-import com.google.dart.compiler.ast.ASTVisitor; |
-import com.google.dart.compiler.ast.DartClass; |
-import com.google.dart.compiler.ast.DartClassTypeAlias; |
-import com.google.dart.compiler.ast.DartField; |
-import com.google.dart.compiler.ast.DartFieldDefinition; |
-import com.google.dart.compiler.ast.DartFunctionTypeAlias; |
-import com.google.dart.compiler.ast.DartIdentifier; |
-import com.google.dart.compiler.ast.DartLibraryDirective; |
-import com.google.dart.compiler.ast.DartMethodDefinition; |
-import com.google.dart.compiler.ast.DartNode; |
-import com.google.dart.compiler.ast.DartTypeParameter; |
-import com.google.dart.compiler.ast.DartUnit; |
-import com.google.dart.compiler.ast.LibraryExport; |
-import com.google.dart.compiler.ast.LibraryImport; |
-import com.google.dart.compiler.ast.LibraryUnit; |
-import com.google.dart.compiler.ast.Modifiers; |
-import com.google.dart.compiler.common.SourceInfo; |
-import com.google.dart.compiler.type.Type; |
-import com.google.dart.compiler.type.TypeVariable; |
-import com.google.dart.compiler.type.Types; |
-import com.google.dart.compiler.util.apache.StringUtils; |
- |
-import java.util.Collections; |
-import java.util.List; |
-import java.util.Map; |
-import java.util.Set; |
- |
-/** |
- * Builds all class elements and types of a library. Once all libraries |
- * of an application have built their types, the library scope per |
- * library can be computed. |
- */ |
-public class TopLevelElementBuilder { |
- |
- public void exec(LibraryUnit library, DartCompilerContext context) { |
- assert library.getElement().getScope().isClear(); |
- for (DartUnit unit : library.getUnits()) { |
- unit.accept(new Builder(library.getElement())); |
- } |
- } |
- |
- public void exec(LibraryUnit library, DartUnit unit, DartCompilerContext context) { |
- unit.accept(new Builder(library.getElement())); |
- } |
- |
- public void exec(LibraryUnit library, DartClass cls, DartCompilerContext context) { |
- cls.accept(new Builder(library.getElement())); |
- } |
- |
- /** |
- * Fill the scope for this library, using its own top-level elements and elements from imported |
- * libraries. |
- */ |
- public void fillInLibraryScope(LibraryUnit library, DartCompilerListener listener) { |
- fillInLibraryScope(library, listener, Sets.newHashSet()); |
- } |
- |
- /** |
- * Fill the scope for this library, using its own top-level elements and elements from imported |
- * libraries. |
- */ |
- private void fillInLibraryScope(LibraryUnit library, DartCompilerListener listener, |
- Set<Object> processedObjects) { |
- Scope importScope = library.getElement().getImportScope(); |
- Scope scope = library.getElement().getScope(); |
- |
- // We are done with this library. |
- if (library.getElement().getScope().isStateReady()) { |
- return; |
- } |
- |
- // Fill "library" scope. |
- if (processedObjects.add(library)) { |
- List<Element> exportedElements = Lists.newArrayList(); |
- { |
- DartUnit selfUnit = library.getSelfDartUnit(); |
- if (selfUnit != null && !selfUnit.getDirectives().isEmpty() |
- && selfUnit.getDirectives().get(0) instanceof DartLibraryDirective) { |
- DartLibraryDirective libraryDirective = (DartLibraryDirective) selfUnit.getDirectives().get( |
- 0); |
- if (!libraryDirective.isObsoleteFormat()) { |
- String name = libraryDirective.getLibraryName(); |
- if (name != null) { |
- String elementName = "__library_" + name; |
- scope.declareElement(elementName, library.getElement()); |
- } |
- } |
- } |
- } |
- for (DartUnit unit : library.getUnits()) { |
- fillInUnitScope(unit, listener, scope, exportedElements); |
- } |
- // Remember exported elements. |
- for (Element exportedElement : exportedElements) { |
- Elements.addExportedElement(library.getElement(), exportedElement); |
- } |
- } |
- |
- // Fill "import" scope. |
- Map<String, LibraryPrefixElement> libraryPrefixElements = Maps.newHashMap(); |
- for (LibraryImport libraryImport : library.getImports()) { |
- if (!processedObjects.add(libraryImport)) { |
- continue; |
- } |
- LibraryUnit lib = libraryImport.getLibrary(); |
- // Prepare scope for this import. |
- Scope scopeForImport; |
- String prefix = libraryImport.getPrefix(); |
- { |
- if (prefix != null) { |
- // Put the prefix in the scope. |
- LibraryPrefixElement libraryPrefixElement = libraryPrefixElements.get(prefix); |
- if (libraryPrefixElement == null) { |
- libraryPrefixElement = new LibraryPrefixElementImplementation(prefix, scope); |
- libraryPrefixElements.put(prefix, libraryPrefixElement); |
- Element existingElement = scope.declareElement(prefix, libraryPrefixElement); |
- // Check for conflict between import prefix and top-level element. |
- if (existingElement != null) { |
- listener.onError(new DartCompilationError(existingElement.getNameLocation(), |
- ResolverErrorCode.CANNOT_HIDE_IMPORT_PREFIX, prefix)); |
- } |
- } |
- libraryPrefixElement.addLibrary(lib.getElement()); |
- // Fill prefix scope. |
- scopeForImport = libraryPrefixElement.getScope(); |
- } else { |
- scopeForImport = importScope; |
- } |
- } |
- // Prepare "lib" scope. |
- fillInLibraryScope(lib, listener, processedObjects); |
- // Fill "library" scope with element exported from "lib". |
- for (Element element : lib.getElement().getExportedElements()) { |
- String name = element.getName(); |
- if (libraryImport.isVisible(name)) { |
- Element oldElement = scopeForImport.declareElement(name, element); |
- if (oldElement != null) { |
- scopeForImport.declareElement(name, |
- Elements.createDuplicateElement(oldElement, element)); |
- } |
- } |
- } |
- } |
- |
- // Fill "library" export scope with re-exports. |
- for (LibraryExport export : library.getExports()) { |
- if (!processedObjects.add(export)) { |
- continue; |
- } |
- LibraryUnit lib = export.getLibrary(); |
- fillInLibraryScope(lib, listener, processedObjects); |
- for (Element element : lib.getElement().getExportedElements()) { |
- String name = element.getName(); |
- // re-export only if not defined locally |
- if (scope.findLocalElement(name) != null) { |
- continue; |
- } |
- // check if show/hide combinators of "export" are satisfied |
- if (!export.isVisible(name)) { |
- continue; |
- } |
- // do export |
- Element oldElement = Elements.addExportedElement(library.getElement(), element); |
- if (oldElement != null && oldElement.getEnclosingElement() instanceof LibraryElement) { |
- LibraryElement oldLibrary = (LibraryElement) oldElement.getEnclosingElement(); |
- SourceInfo sourceInfo = export.getSourceInfo(); |
- if (sourceInfo != null) { |
- String oldLibraryName = oldLibrary.getLibraryUnit().getName(); |
- listener.onError(new DartCompilationError(sourceInfo, |
- ResolverErrorCode.DUPLICATE_EXPORTED_NAME, Elements.getUserElementTitle(oldElement), |
- oldLibraryName)); |
- } |
- } |
- } |
- } |
- |
- // Done. |
- library.getElement().getScope().markStateReady(); |
- } |
- |
- @VisibleForTesting |
- public void fillInUnitScope(DartUnit unit, DartCompilerListener listener, Scope scope, |
- List<Element> exportedElements) { |
- for (DartNode node : unit.getTopLevelNodes()) { |
- if (node instanceof DartFieldDefinition) { |
- for (DartField field : ((DartFieldDefinition) node).getFields()) { |
- declareNodeInScope(field, listener, scope, exportedElements); |
- } |
- } else { |
- declareNodeInScope(node, listener, scope, exportedElements); |
- } |
- } |
- } |
- |
- void declareNodeInScope(DartNode node, DartCompilerListener listener, Scope scope, |
- List<Element> exportedElements) { |
- Element element = node.getElement(); |
- String name = element.getName(); |
- declare(element, listener, scope); |
- if (exportedElements != null && !DartIdentifier.isPrivateName(name)) { |
- exportedElements.add(element); |
- } |
- } |
- |
- private static void compilationError(DartCompilerListener listener, SourceInfo node, ErrorCode errorCode, |
- Object... args) { |
- DartCompilationError error = new DartCompilationError(node, errorCode, args); |
- listener.onError(error); |
- } |
- |
- private void declare(Element newElement, DartCompilerListener listener, Scope scope) { |
- String name = newElement.getName(); |
- Element oldElement = scope.findLocalElement(name); |
- if (oldElement == null && newElement instanceof FieldElement) { |
- FieldElement eField = (FieldElement) newElement; |
- if (!eField.getModifiers().isAbstractField()) { |
- oldElement = scope.findLocalElement("setter " + name); |
- } |
- if (eField.getModifiers().isAbstractField() |
- && StringUtils.startsWith(name, "setter ")) { |
- Element other2 = scope.findLocalElement(StringUtils.removeStart(name, "setter ")); |
- if (other2 instanceof FieldElement) { |
- FieldElement otherField = (FieldElement) other2; |
- if (!otherField.getModifiers().isAbstractField()) { |
- oldElement = otherField; |
- } |
- } |
- } |
- } |
- if (oldElement != null) { |
- reportDuplicateDeclaration(listener, oldElement, newElement); |
- reportDuplicateDeclaration(listener, newElement, oldElement); |
- } |
- scope.declareElement(name, newElement); |
- } |
- |
- /** |
- * Reports {@link ResolverErrorCode#DUPLICATE_TOP_LEVEL_DECLARATION} for given named element. |
- */ |
- private void reportDuplicateDeclaration(DartCompilerListener listener, Element element, |
- Element otherElement) { |
- compilationError(listener, element.getNameLocation(), |
- ResolverErrorCode.DUPLICATE_TOP_LEVEL_DECLARATION, |
- Elements.getUserElementTitle(otherElement), |
- Elements.getRelativeElementLocation(element, otherElement)); |
- } |
- |
- /** |
- * Creates a ClassElement for a class. |
- */ |
- private class Builder extends ASTVisitor<Void> { |
- |
- private LibraryElement library; |
- |
- public Builder(LibraryElement library) { |
- this.library = library; |
- } |
- |
- @Override |
- public Void visitClass(DartClass node) { |
- ClassElement element = Elements.classFromNode(node, library); |
- List<DartTypeParameter> parameterNodes = node.getTypeParameters(); |
- List<TypeVariable> typeVariables = Elements.makeTypeVariables(parameterNodes, element); |
- element.setType(Types.interfaceType( |
- element, |
- Collections.<Type>unmodifiableList(typeVariables))); |
- node.setElement(element); |
- node.getName().setElement(element); |
- return null; |
- } |
- |
- @Override |
- public Void visitClassTypeAlias(DartClassTypeAlias node) { |
- ClassAliasElement element = Elements.classFromNode(node, library); |
- List<DartTypeParameter> parameterNodes = node.getTypeParameters(); |
- List<TypeVariable> typeVariables = Elements.makeTypeVariables(parameterNodes, element); |
- element.setType(Types.interfaceType( |
- element, |
- Collections.<Type>unmodifiableList(typeVariables))); |
- node.setElement(element); |
- node.getName().setElement(element); |
- return null; |
- } |
- |
- @Override |
- public Void visitFunctionTypeAlias(DartFunctionTypeAlias node) { |
- FunctionAliasElement element = Elements.functionTypeAliasFromNode(node, library); |
- List<DartTypeParameter> parameterNodes = node.getTypeParameters(); |
- element.setType(Types.functionAliasType(element, |
- Elements.makeTypeVariables(parameterNodes, element))); |
- node.getName().setElement(element); |
- node.setElement(element); |
- return null; |
- } |
- |
- @Override |
- public Void visitMethodDefinition(DartMethodDefinition node) { |
- node.setElement(Elements.methodFromMethodNode(node, library)); |
- return null; |
- } |
- |
- @Override |
- public Void visitField(DartField node) { |
- Modifiers modifiers = node.getModifiers(); |
- node.setElement(Elements.fieldFromNode(node, library, node.getObsoleteMetadata(), modifiers)); |
- return null; |
- } |
- } |
-} |