Index: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/LibraryResolver.java |
diff --git a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/LibraryResolver.java b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/LibraryResolver.java |
index a5e5ec4fc59b36b9d537efc01e82625efd36a12f..a0a6404558f3a9362bdfb3865b5176b5bd19b96b 100644 |
--- a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/LibraryResolver.java |
+++ b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/LibraryResolver.java |
@@ -16,8 +16,10 @@ package com.google.dart.engine.internal.resolver; |
import com.google.dart.engine.AnalysisEngine; |
import com.google.dart.engine.ast.Combinator; |
import com.google.dart.engine.ast.CompilationUnit; |
+import com.google.dart.engine.ast.CompilationUnitMember; |
import com.google.dart.engine.ast.Directive; |
import com.google.dart.engine.ast.ExportDirective; |
+import com.google.dart.engine.ast.FunctionTypeAlias; |
import com.google.dart.engine.ast.HideCombinator; |
import com.google.dart.engine.ast.ImportDirective; |
import com.google.dart.engine.ast.NamespaceDirective; |
@@ -26,6 +28,7 @@ import com.google.dart.engine.ast.ShowCombinator; |
import com.google.dart.engine.ast.SimpleIdentifier; |
import com.google.dart.engine.ast.StringInterpolation; |
import com.google.dart.engine.ast.StringLiteral; |
+import com.google.dart.engine.ast.TypeAlias; |
import com.google.dart.engine.ast.UriBasedDirective; |
import com.google.dart.engine.context.AnalysisException; |
import com.google.dart.engine.element.Element; |
@@ -66,6 +69,7 @@ import com.google.dart.engine.utilities.io.UriUtilities; |
import java.util.ArrayList; |
import java.util.HashMap; |
import java.util.HashSet; |
+import java.util.List; |
import java.util.Set; |
/** |
@@ -76,6 +80,28 @@ import java.util.Set; |
*/ |
public class LibraryResolver { |
/** |
+ * Instances of the class {@code TypeAliasInfo} hold information about a {@link TypeAlias}. |
+ */ |
+ private static class TypeAliasInfo { |
+ private Library library; |
+ private Source source; |
+ private FunctionTypeAlias typeAlias; |
+ |
+ /** |
+ * Initialize a newly created information holder with the given information. |
+ * |
+ * @param library the library containing the type alias |
+ * @param source the source of the file containing the type alias |
+ * @param typeAlias the type alias being remembered |
+ */ |
+ public TypeAliasInfo(Library library, Source source, FunctionTypeAlias typeAlias) { |
+ this.library = library; |
+ this.source = source; |
+ this.typeAlias = typeAlias; |
+ } |
+ } |
+ |
+ /** |
* The analysis context in which the libraries are being analyzed. |
*/ |
private InternalAnalysisContext analysisContext; |
@@ -211,6 +237,7 @@ public class LibraryResolver { |
buildDirectiveModels(); |
instrumentation.metric("buildDirectiveModels", "complete"); |
typeProvider = new TypeProviderImpl(coreElement); |
+ buildTypeAliases(); |
buildTypeHierarchies(); |
instrumentation.metric("buildTypeHierarchies", "complete"); |
// |
@@ -298,6 +325,7 @@ public class LibraryResolver { |
instrumentation.metric("buildDirectiveModels", "complete"); |
typeProvider = new TypeProviderImpl(coreElement); |
buildEnumMembers(); |
+ buildTypeAliases(); |
buildTypeHierarchies(); |
instrumentation.metric("buildTypeHierarchies", "complete"); |
// |
@@ -583,6 +611,40 @@ public class LibraryResolver { |
} |
/** |
+ * Resolve the types referenced by function type aliases across all of the function type aliases |
+ * defined in the current cycle. |
+ * |
+ * @throws AnalysisException if any of the function type aliases could not be resolved |
+ */ |
+ private void buildTypeAliases() throws AnalysisException { |
+ TimeCounterHandle timeCounter = PerformanceStatistics.resolve.start(); |
+ try { |
+ List<TypeAliasInfo> typeAliases = new ArrayList<TypeAliasInfo>(); |
+ for (Library library : librariesInCycles) { |
+ for (Source source : library.getCompilationUnitSources()) { |
+ CompilationUnit ast = library.getAST(source); |
+ for (CompilationUnitMember member : ast.getDeclarations()) { |
+ if (member instanceof FunctionTypeAlias) { |
+ typeAliases.add(new TypeAliasInfo(library, source, (FunctionTypeAlias) member)); |
+ } |
+ } |
+ } |
+ } |
+ // TODO(brianwilkerson) We need to sort the type aliases such that all aliases referenced by |
+ // an alias T are resolved before we resolve T. |
+ for (TypeAliasInfo info : typeAliases) { |
+ TypeResolverVisitor visitor = new TypeResolverVisitor( |
+ info.library, |
+ info.source, |
+ typeProvider); |
+ info.typeAlias.accept(visitor); |
+ } |
+ } finally { |
+ timeCounter.stop(); |
+ } |
+ } |
+ |
+ /** |
* Resolve the type hierarchy across all of the types declared in the libraries in the current |
* cycle. |
* |