Index: pkg/analyzer/lib/src/generated/engine.dart |
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart |
index 18ec587c5ee37f761cdcfb2c71a96a126413b991..897b469aa042ba7d3454855c0ee1b4943e21812a 100644 |
--- a/pkg/analyzer/lib/src/generated/engine.dart |
+++ b/pkg/analyzer/lib/src/generated/engine.dart |
@@ -968,6 +968,11 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
Source _coreLibrarySource; |
/** |
+ * A source representing the async library. |
+ */ |
+ Source _asyncLibrarySource; |
+ |
+ /** |
* The partition that contains analysis results that are not shared with other contexts. |
*/ |
CachePartition _privatePartition; |
@@ -1403,6 +1408,7 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
factory.context = this; |
_sourceFactory = factory; |
_coreLibrarySource = _sourceFactory.forUri(DartSdk.DART_CORE); |
+ _asyncLibrarySource = _sourceFactory.forUri(DartSdk.DART_ASYNC); |
_cache = createCacheFromSourceFactory(factory); |
_invalidateAllLocalResolutionInformation(true); |
} |
@@ -1477,7 +1483,15 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
if (coreElement == null) { |
throw new AnalysisException("Could not create an element for dart:core"); |
} |
- return new TypeProviderImpl(coreElement); |
+ Source asyncSource = sourceFactory.forUri(DartSdk.DART_ASYNC); |
+ if (asyncSource == null) { |
+ throw new AnalysisException("Could not create a source for dart:async"); |
+ } |
+ LibraryElement asyncElement = computeLibraryElement(asyncSource); |
+ if (asyncElement == null) { |
+ throw new AnalysisException("Could not create an element for dart:async"); |
+ } |
+ return new TypeProviderImpl(coreElement, asyncElement); |
} |
@override |
@@ -5357,6 +5371,31 @@ class AnalysisContextImpl_CycleBuilder { |
AnalysisContextImpl_this._neededForResolution = null; |
} |
+ bool _addDependency(ResolvableLibrary dependant, Source dependency, |
+ List<ResolvableLibrary> dependencyList) { |
+ if (dependant.librarySource == dependency) { |
+ // Don't add a dependency of a library on itself; there's no point. |
+ return true; |
+ } |
+ ResolvableLibrary importedLibrary = _libraryMap[dependency]; |
+ if (importedLibrary == null) { |
+ importedLibrary = _createLibraryOrNull(dependency); |
+ if (importedLibrary != null) { |
+ _computeLibraryDependencies(importedLibrary); |
+ if (_taskData != null) { |
+ return false; |
+ } |
+ } |
+ } |
+ if (importedLibrary != null) { |
+ if (dependencyList != null) { |
+ dependencyList.add(importedLibrary); |
+ } |
+ _dependencyGraph.addEdge(dependant, importedLibrary); |
+ } |
+ return true; |
+ } |
+ |
/** |
* Recursively traverse the libraries reachable from the given library, creating instances of |
* the class [Library] to represent them, and record the references in the library |
@@ -5399,87 +5438,52 @@ class AnalysisContextImpl_CycleBuilder { |
void _computeLibraryDependenciesFromDirectives(ResolvableLibrary library, |
List<Source> importedSources, List<Source> exportedSources) { |
int importCount = importedSources.length; |
- if (importCount > 0) { |
- List<ResolvableLibrary> importedLibraries = new List<ResolvableLibrary>(); |
- bool explicitlyImportsCore = false; |
- for (int i = 0; i < importCount; i++) { |
- Source importedSource = importedSources[i]; |
- if (importedSource == AnalysisContextImpl_this._coreLibrarySource) { |
- explicitlyImportsCore = true; |
- } |
- ResolvableLibrary importedLibrary = _libraryMap[importedSource]; |
- if (importedLibrary == null) { |
- importedLibrary = _createLibraryOrNull(importedSource); |
- if (importedLibrary != null) { |
- _computeLibraryDependencies(importedLibrary); |
- if (_taskData != null) { |
- return; |
- } |
- } |
- } |
- if (importedLibrary != null) { |
- importedLibraries.add(importedLibrary); |
- _dependencyGraph.addEdge(library, importedLibrary); |
- } |
- } |
- library.explicitlyImportsCore = explicitlyImportsCore; |
- if (!explicitlyImportsCore && |
- AnalysisContextImpl_this._coreLibrarySource != library.librarySource) { |
- ResolvableLibrary importedLibrary = |
- _libraryMap[AnalysisContextImpl_this._coreLibrarySource]; |
- if (importedLibrary == null) { |
- importedLibrary = |
- _createLibraryOrNull(AnalysisContextImpl_this._coreLibrarySource); |
- if (importedLibrary != null) { |
- _computeLibraryDependencies(importedLibrary); |
- if (_taskData != null) { |
- return; |
- } |
- } |
- } |
- if (importedLibrary != null) { |
- importedLibraries.add(importedLibrary); |
- _dependencyGraph.addEdge(library, importedLibrary); |
- } |
+ List<ResolvableLibrary> importedLibraries = new List<ResolvableLibrary>(); |
+ bool explicitlyImportsCore = false; |
+ bool importsAsync = false; |
+ for (int i = 0; i < importCount; i++) { |
+ Source importedSource = importedSources[i]; |
+ if (importedSource == AnalysisContextImpl_this._coreLibrarySource) { |
+ explicitlyImportsCore = true; |
+ } else if (importedSource == |
+ AnalysisContextImpl_this._asyncLibrarySource) { |
+ importsAsync = true; |
+ } |
+ if (!_addDependency(library, importedSource, importedLibraries)) { |
+ return; |
} |
- library.importedLibraries = importedLibraries; |
- } else { |
- library.explicitlyImportsCore = false; |
- ResolvableLibrary importedLibrary = |
- _libraryMap[AnalysisContextImpl_this._coreLibrarySource]; |
- if (importedLibrary == null) { |
- importedLibrary = |
- _createLibraryOrNull(AnalysisContextImpl_this._coreLibrarySource); |
- if (importedLibrary != null) { |
- _computeLibraryDependencies(importedLibrary); |
- if (_taskData != null) { |
- return; |
- } |
- } |
+ } |
+ library.explicitlyImportsCore = explicitlyImportsCore; |
+ if (!explicitlyImportsCore) { |
+ if (!_addDependency( |
+ library, |
+ AnalysisContextImpl_this._coreLibrarySource, |
+ importedLibraries)) { |
+ return; |
} |
- if (importedLibrary != null) { |
- _dependencyGraph.addEdge(library, importedLibrary); |
- library.importedLibraries = <ResolvableLibrary>[importedLibrary]; |
+ } |
+ if (!importsAsync) { |
+ // Add a dependency on async to ensure that the Future element will be |
+ // built before we generate errors and warnings for async methods. Also |
+ // include it in importedLibraries, so that it will be picked up by |
+ // LibraryResolver2._buildLibraryMap(). |
+ // TODO(paulberry): this is a bit of a hack, since the async library |
+ // isn't actually being imported. |
Brian Wilkerson
2015/02/02 19:41:48
I don't think this is (or should be) necessary und
Paul Berry
2015/02/02 20:55:38
Hmm, your reasoning seems valid. However, if I re
|
+ if (!_addDependency( |
+ library, |
+ AnalysisContextImpl_this._asyncLibrarySource, |
+ importedLibraries)) { |
+ return; |
} |
} |
+ library.importedLibraries = importedLibraries; |
int exportCount = exportedSources.length; |
if (exportCount > 0) { |
List<ResolvableLibrary> exportedLibraries = new List<ResolvableLibrary>(); |
for (int i = 0; i < exportCount; i++) { |
Source exportedSource = exportedSources[i]; |
- ResolvableLibrary exportedLibrary = _libraryMap[exportedSource]; |
- if (exportedLibrary == null) { |
- exportedLibrary = _createLibraryOrNull(exportedSource); |
- if (exportedLibrary != null) { |
- _computeLibraryDependencies(exportedLibrary); |
- if (_taskData != null) { |
- return; |
- } |
- } |
- } |
- if (exportedLibrary != null) { |
- exportedLibraries.add(exportedLibrary); |
- _dependencyGraph.addEdge(library, exportedLibrary); |
+ if (!_addDependency(library, exportedSource, exportedLibraries)) { |
+ return; |
} |
} |
library.exportedLibraries = exportedLibraries; |