Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(230)

Side by Side Diff: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/LibraryResolver.java

Issue 594843006: Fix for issue 14497 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/LibraryResolver2.java » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013, the Dart project authors. 2 * Copyright (c) 2013, the Dart project authors.
3 * 3 *
4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u se this file except 4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u se this file except
5 * in compliance with the License. You may obtain a copy of the License at 5 * in compliance with the License. You may obtain a copy of the License at
6 * 6 *
7 * http://www.eclipse.org/legal/epl-v10.html 7 * http://www.eclipse.org/legal/epl-v10.html
8 * 8 *
9 * Unless required by applicable law or agreed to in writing, software distribut ed under the License 9 * Unless required by applicable law or agreed to in writing, software distribut ed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K IND, either express 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K IND, either express
11 * or implied. See the License for the specific language governing permissions a nd limitations under 11 * or implied. See the License for the specific language governing permissions a nd limitations under
12 * the License. 12 * the License.
13 */ 13 */
14 package com.google.dart.engine.internal.resolver; 14 package com.google.dart.engine.internal.resolver;
15 15
16 import com.google.dart.engine.AnalysisEngine; 16 import com.google.dart.engine.AnalysisEngine;
17 import com.google.dart.engine.ast.Combinator; 17 import com.google.dart.engine.ast.Combinator;
18 import com.google.dart.engine.ast.CompilationUnit; 18 import com.google.dart.engine.ast.CompilationUnit;
19 import com.google.dart.engine.ast.CompilationUnitMember;
19 import com.google.dart.engine.ast.Directive; 20 import com.google.dart.engine.ast.Directive;
20 import com.google.dart.engine.ast.ExportDirective; 21 import com.google.dart.engine.ast.ExportDirective;
22 import com.google.dart.engine.ast.FunctionTypeAlias;
21 import com.google.dart.engine.ast.HideCombinator; 23 import com.google.dart.engine.ast.HideCombinator;
22 import com.google.dart.engine.ast.ImportDirective; 24 import com.google.dart.engine.ast.ImportDirective;
23 import com.google.dart.engine.ast.NamespaceDirective; 25 import com.google.dart.engine.ast.NamespaceDirective;
24 import com.google.dart.engine.ast.NodeList; 26 import com.google.dart.engine.ast.NodeList;
25 import com.google.dart.engine.ast.ShowCombinator; 27 import com.google.dart.engine.ast.ShowCombinator;
26 import com.google.dart.engine.ast.SimpleIdentifier; 28 import com.google.dart.engine.ast.SimpleIdentifier;
27 import com.google.dart.engine.ast.StringInterpolation; 29 import com.google.dart.engine.ast.StringInterpolation;
28 import com.google.dart.engine.ast.StringLiteral; 30 import com.google.dart.engine.ast.StringLiteral;
31 import com.google.dart.engine.ast.TypeAlias;
29 import com.google.dart.engine.ast.UriBasedDirective; 32 import com.google.dart.engine.ast.UriBasedDirective;
30 import com.google.dart.engine.context.AnalysisException; 33 import com.google.dart.engine.context.AnalysisException;
31 import com.google.dart.engine.element.Element; 34 import com.google.dart.engine.element.Element;
32 import com.google.dart.engine.element.ExportElement; 35 import com.google.dart.engine.element.ExportElement;
33 import com.google.dart.engine.element.FunctionElement; 36 import com.google.dart.engine.element.FunctionElement;
34 import com.google.dart.engine.element.ImportElement; 37 import com.google.dart.engine.element.ImportElement;
35 import com.google.dart.engine.element.LibraryElement; 38 import com.google.dart.engine.element.LibraryElement;
36 import com.google.dart.engine.element.NamespaceCombinator; 39 import com.google.dart.engine.element.NamespaceCombinator;
37 import com.google.dart.engine.error.AnalysisError; 40 import com.google.dart.engine.error.AnalysisError;
38 import com.google.dart.engine.error.AnalysisErrorListener; 41 import com.google.dart.engine.error.AnalysisErrorListener;
(...skipping 20 matching lines...) Expand all
59 import com.google.dart.engine.source.Source; 62 import com.google.dart.engine.source.Source;
60 import com.google.dart.engine.source.SourceKind; 63 import com.google.dart.engine.source.SourceKind;
61 import com.google.dart.engine.utilities.general.TimeCounter.TimeCounterHandle; 64 import com.google.dart.engine.utilities.general.TimeCounter.TimeCounterHandle;
62 import com.google.dart.engine.utilities.instrumentation.Instrumentation; 65 import com.google.dart.engine.utilities.instrumentation.Instrumentation;
63 import com.google.dart.engine.utilities.instrumentation.InstrumentationBuilder; 66 import com.google.dart.engine.utilities.instrumentation.InstrumentationBuilder;
64 import com.google.dart.engine.utilities.io.UriUtilities; 67 import com.google.dart.engine.utilities.io.UriUtilities;
65 68
66 import java.util.ArrayList; 69 import java.util.ArrayList;
67 import java.util.HashMap; 70 import java.util.HashMap;
68 import java.util.HashSet; 71 import java.util.HashSet;
72 import java.util.List;
69 import java.util.Set; 73 import java.util.Set;
70 74
71 /** 75 /**
72 * Instances of the class {@code LibraryResolver} are used to resolve one or mor e mutually dependent 76 * Instances of the class {@code LibraryResolver} are used to resolve one or mor e mutually dependent
73 * libraries within a single context. 77 * libraries within a single context.
74 * 78 *
75 * @coverage dart.engine.resolver 79 * @coverage dart.engine.resolver
76 */ 80 */
77 public class LibraryResolver { 81 public class LibraryResolver {
78 /** 82 /**
83 * Instances of the class {@code TypeAliasInfo} hold information about a {@lin k TypeAlias}.
84 */
85 private static class TypeAliasInfo {
86 private Library library;
87 private Source source;
88 private FunctionTypeAlias typeAlias;
89
90 /**
91 * Initialize a newly created information holder with the given information.
92 *
93 * @param library the library containing the type alias
94 * @param source the source of the file containing the type alias
95 * @param typeAlias the type alias being remembered
96 */
97 public TypeAliasInfo(Library library, Source source, FunctionTypeAlias typeA lias) {
98 this.library = library;
99 this.source = source;
100 this.typeAlias = typeAlias;
101 }
102 }
103
104 /**
79 * The analysis context in which the libraries are being analyzed. 105 * The analysis context in which the libraries are being analyzed.
80 */ 106 */
81 private InternalAnalysisContext analysisContext; 107 private InternalAnalysisContext analysisContext;
82 108
83 /** 109 /**
84 * The listener to which analysis errors will be reported, this error listener is either 110 * The listener to which analysis errors will be reported, this error listener is either
85 * references {@link #recordingErrorListener}, or it unions the passed 111 * references {@link #recordingErrorListener}, or it unions the passed
86 * {@link AnalysisErrorListener} with the {@link #recordingErrorListener}. 112 * {@link AnalysisErrorListener} with the {@link #recordingErrorListener}.
87 */ 113 */
88 private RecordingErrorListener errorListener; 114 private RecordingErrorListener errorListener;
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 // 230 //
205 buildElementModels(); 231 buildElementModels();
206 instrumentation.metric("buildElementModels", "complete"); 232 instrumentation.metric("buildElementModels", "complete");
207 LibraryElement coreElement = coreLibrary.getLibraryElement(); 233 LibraryElement coreElement = coreLibrary.getLibraryElement();
208 if (coreElement == null) { 234 if (coreElement == null) {
209 throw new AnalysisException("Could not resolve dart:core"); 235 throw new AnalysisException("Could not resolve dart:core");
210 } 236 }
211 buildDirectiveModels(); 237 buildDirectiveModels();
212 instrumentation.metric("buildDirectiveModels", "complete"); 238 instrumentation.metric("buildDirectiveModels", "complete");
213 typeProvider = new TypeProviderImpl(coreElement); 239 typeProvider = new TypeProviderImpl(coreElement);
240 buildTypeAliases();
214 buildTypeHierarchies(); 241 buildTypeHierarchies();
215 instrumentation.metric("buildTypeHierarchies", "complete"); 242 instrumentation.metric("buildTypeHierarchies", "complete");
216 // 243 //
217 // Perform resolution and type analysis. 244 // Perform resolution and type analysis.
218 // 245 //
219 // TODO(brianwilkerson) Decide whether we want to resolve all of the libra ries or whether we 246 // TODO(brianwilkerson) Decide whether we want to resolve all of the libra ries or whether we
220 // want to only resolve the target library. The advantage to resolving eve rything is that we 247 // want to only resolve the target library. The advantage to resolving eve rything is that we
221 // have already done part of the work so we'll avoid duplicated effort. Th e disadvantage of 248 // have already done part of the work so we'll avoid duplicated effort. Th e disadvantage of
222 // resolving everything is that we might do extra work that we don't reall y care about. Another 249 // resolving everything is that we might do extra work that we don't reall y care about. Another
223 // possibility is to add a parameter to this method and punt the decision to the clients. 250 // possibility is to add a parameter to this method and punt the decision to the clients.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 buildElementModels(); 318 buildElementModels();
292 instrumentation.metric("buildElementModels", "complete"); 319 instrumentation.metric("buildElementModels", "complete");
293 LibraryElement coreElement = coreLibrary.getLibraryElement(); 320 LibraryElement coreElement = coreLibrary.getLibraryElement();
294 if (coreElement == null) { 321 if (coreElement == null) {
295 throw new AnalysisException("Could not resolve dart:core"); 322 throw new AnalysisException("Could not resolve dart:core");
296 } 323 }
297 buildDirectiveModels(); 324 buildDirectiveModels();
298 instrumentation.metric("buildDirectiveModels", "complete"); 325 instrumentation.metric("buildDirectiveModels", "complete");
299 typeProvider = new TypeProviderImpl(coreElement); 326 typeProvider = new TypeProviderImpl(coreElement);
300 buildEnumMembers(); 327 buildEnumMembers();
328 buildTypeAliases();
301 buildTypeHierarchies(); 329 buildTypeHierarchies();
302 instrumentation.metric("buildTypeHierarchies", "complete"); 330 instrumentation.metric("buildTypeHierarchies", "complete");
303 // 331 //
304 // Perform resolution and type analysis. 332 // Perform resolution and type analysis.
305 // 333 //
306 // TODO(brianwilkerson) Decide whether we want to resolve all of the libra ries or whether we 334 // TODO(brianwilkerson) Decide whether we want to resolve all of the libra ries or whether we
307 // want to only resolve the target library. The advantage to resolving eve rything is that we 335 // want to only resolve the target library. The advantage to resolving eve rything is that we
308 // have already done part of the work so we'll avoid duplicated effort. Th e disadvantage of 336 // have already done part of the work so we'll avoid duplicated effort. Th e disadvantage of
309 // resolving everything is that we might do extra work that we don't reall y care about. Another 337 // resolving everything is that we might do extra work that we don't reall y care about. Another
310 // possibility is to add a parameter to this method and punt the decision to the clients. 338 // possibility is to add a parameter to this method and punt the decision to the clients.
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 EnumMemberBuilder builder = new EnumMemberBuilder(typeProvider); 604 EnumMemberBuilder builder = new EnumMemberBuilder(typeProvider);
577 library.getAST(source).accept(builder); 605 library.getAST(source).accept(builder);
578 } 606 }
579 } 607 }
580 } finally { 608 } finally {
581 timeCounter.stop(); 609 timeCounter.stop();
582 } 610 }
583 } 611 }
584 612
585 /** 613 /**
614 * Resolve the types referenced by function type aliases across all of the fun ction type aliases
615 * defined in the current cycle.
616 *
617 * @throws AnalysisException if any of the function type aliases could not be resolved
618 */
619 private void buildTypeAliases() throws AnalysisException {
620 TimeCounterHandle timeCounter = PerformanceStatistics.resolve.start();
621 try {
622 List<TypeAliasInfo> typeAliases = new ArrayList<TypeAliasInfo>();
623 for (Library library : librariesInCycles) {
624 for (Source source : library.getCompilationUnitSources()) {
625 CompilationUnit ast = library.getAST(source);
626 for (CompilationUnitMember member : ast.getDeclarations()) {
627 if (member instanceof FunctionTypeAlias) {
628 typeAliases.add(new TypeAliasInfo(library, source, (FunctionTypeAl ias) member));
629 }
630 }
631 }
632 }
633 // TODO(brianwilkerson) We need to sort the type aliases such that all ali ases referenced by
634 // an alias T are resolved before we resolve T.
635 for (TypeAliasInfo info : typeAliases) {
636 TypeResolverVisitor visitor = new TypeResolverVisitor(
637 info.library,
638 info.source,
639 typeProvider);
640 info.typeAlias.accept(visitor);
641 }
642 } finally {
643 timeCounter.stop();
644 }
645 }
646
647 /**
586 * Resolve the type hierarchy across all of the types declared in the librarie s in the current 648 * Resolve the type hierarchy across all of the types declared in the librarie s in the current
587 * cycle. 649 * cycle.
588 * 650 *
589 * @throws AnalysisException if any of the type hierarchies could not be resol ved 651 * @throws AnalysisException if any of the type hierarchies could not be resol ved
590 */ 652 */
591 private void buildTypeHierarchies() throws AnalysisException { 653 private void buildTypeHierarchies() throws AnalysisException {
592 TimeCounterHandle timeCounter = PerformanceStatistics.resolve.start(); 654 TimeCounterHandle timeCounter = PerformanceStatistics.resolve.start();
593 try { 655 try {
594 for (Library library : librariesInCycles) { 656 for (Library library : librariesInCycles) {
595 for (Source source : library.getCompilationUnitSources()) { 657 for (Source source : library.getCompilationUnitSources()) {
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
886 return null; 948 return null;
887 } 949 }
888 String uriContent = uriLiteral.getStringValue().trim(); 950 String uriContent = uriLiteral.getStringValue().trim();
889 if (uriContent == null || uriContent.isEmpty()) { 951 if (uriContent == null || uriContent.isEmpty()) {
890 return null; 952 return null;
891 } 953 }
892 uriContent = UriUtilities.encode(uriContent); 954 uriContent = UriUtilities.encode(uriContent);
893 return analysisContext.getSourceFactory().resolveUri(librarySource, uriConte nt); 955 return analysisContext.getSourceFactory().resolveUri(librarySource, uriConte nt);
894 } 956 }
895 } 957 }
OLDNEW
« no previous file with comments | « no previous file | editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/LibraryResolver2.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698