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

Unified Diff: pkg/analyzer/lib/src/generated/engine.dart

Issue 898513002: Fix async/await type checking in analyzer. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Reformat and sort methods Created 5 years, 11 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 side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698