Index: pkg/analyzer/lib/src/task/dart.dart |
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart |
index dfee11b9ed64e51ad24b1c999842254f6b8a2854..64ba3d19e864ea133842974bf2cd4c40fa759cee 100644 |
--- a/pkg/analyzer/lib/src/task/dart.dart |
+++ b/pkg/analyzer/lib/src/task/dart.dart |
@@ -347,7 +347,26 @@ final ListResultDescriptor<AnalysisError> PARSE_ERRORS = |
'PARSE_ERRORS', AnalysisError.NO_ERRORS); |
/** |
- * The flag specifying that [RESOLVED_UNIT] is ready for a library. |
+ * The flag specifying that [LIBRARY_ELEMENT2] is ready for a library and its |
+ * import/export closure. |
+ * |
+ * The result is only available for [Source]s representing a library. |
+ */ |
+final ResultDescriptor<bool> READY_LIBRARY_ELEMENT2 = |
+ new ResultDescriptor<bool>('READY_LIBRARY_ELEMENT2', false); |
+ |
+/** |
+ * The flag specifying that [LIBRARY_ELEMENT5] is ready for a library and its |
+ * import/export closure. |
+ * |
+ * The result is only available for [Source]s representing a library. |
+ */ |
+final ResultDescriptor<bool> READY_LIBRARY_ELEMENT5 = |
+ new ResultDescriptor<bool>('READY_LIBRARY_ELEMENT5', false); |
+ |
+/** |
+ * The flag specifying that [RESOLVED_UNIT] is ready for all of the units of a |
+ * library and its import/export closure. |
* |
* The result is only available for [Source]s representing a library. |
*/ |
@@ -355,7 +374,8 @@ final ResultDescriptor<bool> READY_RESOLVED_UNIT = |
new ResultDescriptor<bool>('READY_RESOLVED_UNIT', false); |
/** |
- * The flag specifying that [RESOLVED_UNIT10] is ready for a library. |
+ * The flag specifying that [RESOLVED_UNIT10] is ready for all of the units of a |
+ * library and its import/export closure. |
* |
* The result is only available for [Source]s representing a library. |
*/ |
@@ -363,7 +383,8 @@ final ResultDescriptor<bool> READY_RESOLVED_UNIT10 = |
new ResultDescriptor<bool>('READY_RESOLVED_UNIT10', false); |
/** |
- * The flag specifying that [RESOLVED_UNIT9] is ready for a library. |
+ * The flag specifying that [RESOLVED_UNIT9] is ready for all of the units of a |
+ * library and its import/export closure. |
* |
* The result is only available for [Source]s representing a library. |
*/ |
@@ -1943,10 +1964,8 @@ class ComputeLibraryCycleTask extends SourceBasedAnalysisTask { |
static Map<String, TaskInput> buildInputs(AnalysisTarget target) { |
LibrarySpecificUnit unit = target; |
return <String, TaskInput>{ |
- 'resolveReachableLibraries': IMPORT_EXPORT_SOURCE_CLOSURE |
- .of(unit.library) |
- .toListOf(LIBRARY_ELEMENT2), |
- LIBRARY_ELEMENT_INPUT: LIBRARY_ELEMENT2.of(unit.library) |
+ LIBRARY_ELEMENT_INPUT: LIBRARY_ELEMENT2.of(unit.library), |
+ 'resolveReachableLibraries': READY_LIBRARY_ELEMENT2.of(unit.library), |
}; |
} |
@@ -3478,9 +3497,7 @@ class PartiallyResolveUnitReferencesTask extends SourceBasedAnalysisTask { |
static Map<String, TaskInput> buildInputs(AnalysisTarget target) { |
LibrarySpecificUnit unit = target; |
return <String, TaskInput>{ |
- 'fullyBuiltLibraryElements': IMPORT_EXPORT_SOURCE_CLOSURE |
- .of(unit.library) |
- .toListOf(LIBRARY_ELEMENT5), |
+ 'fullyBuiltLibraryElements': READY_LIBRARY_ELEMENT5.of(unit.library), |
LIBRARY_INPUT: LIBRARY_ELEMENT5.of(unit.library), |
UNIT_INPUT: RESOLVED_UNIT4.of(unit), |
TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request), |
@@ -3545,6 +3562,125 @@ class PublicNamespaceBuilder { |
} |
/** |
+ * A task that ensures that [LIBRARY_ELEMENT2] is ready for the target library |
+ * source and its import/export closure. |
+ */ |
+class ReadyLibraryElement2Task extends SourceBasedAnalysisTask { |
+ static const String IS_CLIENT_LIST_INPUT1 = 'IS_CLIENT_LIST_INPUT1'; |
+ static const String IS_CLIENT_LIST_INPUT2 = 'IS_CLIENT_LIST_INPUT2'; |
+ |
+ static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
+ 'ReadyLibraryElement2Task', |
+ createTask, |
+ buildInputs, |
+ <ResultDescriptor>[READY_LIBRARY_ELEMENT2, IS_CLIENT]); |
+ |
+ ReadyLibraryElement2Task( |
+ InternalAnalysisContext context, AnalysisTarget target) |
+ : super(context, target); |
+ |
+ @override |
+ TaskDescriptor get descriptor => DESCRIPTOR; |
+ |
+ @override |
+ bool get handlesDependencyCycles => true; |
+ |
+ @override |
+ void internalPerform() { |
+ bool isClient = _isClient(); |
+ outputs[READY_LIBRARY_ELEMENT2] = true; |
+ outputs[IS_CLIENT] = isClient; |
+ } |
+ |
+ bool _isClient() { |
+ Source htmlSource = context.sourceFactory.forUri(DartSdk.DART_HTML); |
+ Source source = getRequiredSource(); |
+ if (source == htmlSource) { |
+ return true; |
+ } |
+ if (_hasTrueElement(getRequiredInput(IS_CLIENT_LIST_INPUT1))) { |
+ return true; |
+ } |
+ if (_hasTrueElement(getRequiredInput(IS_CLIENT_LIST_INPUT2))) { |
+ return true; |
+ } |
+ return false; |
+ } |
+ |
+ static Map<String, TaskInput> buildInputs(AnalysisTarget target) { |
+ Source source = target; |
+ return <String, TaskInput>{ |
+ 'thisLibraryElementReady': LIBRARY_ELEMENT2.of(source), |
+ IS_CLIENT_LIST_INPUT1: IMPORTED_LIBRARIES.of(source).toListOf(IS_CLIENT), |
+ IS_CLIENT_LIST_INPUT2: EXPORTED_LIBRARIES.of(source).toListOf(IS_CLIENT), |
+ 'directlyImportedLibrariesReady': |
+ IMPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT2), |
+ 'directlyExportedLibrariesReady': |
+ EXPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT2), |
+ }; |
+ } |
+ |
+ static ReadyLibraryElement2Task createTask( |
+ AnalysisContext context, AnalysisTarget target) { |
+ return new ReadyLibraryElement2Task(context, target); |
+ } |
+ |
+ static bool _hasTrueElement(List<bool> elements) { |
+ if (elements != null) { |
+ for (bool isClient in elements) { |
+ if (isClient == true) { |
+ return true; |
+ } |
+ } |
+ } |
+ return false; |
+ } |
+} |
+ |
+/** |
+ * A task that ensures that [LIBRARY_ELEMENT5] is ready for the target library |
+ * source and its import/export closure. |
+ */ |
+class ReadyLibraryElement5Task extends SourceBasedAnalysisTask { |
+ static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
+ 'ReadyLibraryElement5Task', |
+ createTask, |
+ buildInputs, |
+ <ResultDescriptor>[READY_LIBRARY_ELEMENT5]); |
+ |
+ ReadyLibraryElement5Task( |
+ InternalAnalysisContext context, AnalysisTarget target) |
+ : super(context, target); |
+ |
+ @override |
+ TaskDescriptor get descriptor => DESCRIPTOR; |
+ |
+ @override |
+ bool get handlesDependencyCycles => true; |
+ |
+ @override |
+ void internalPerform() { |
+ outputs[READY_LIBRARY_ELEMENT5] = true; |
+ } |
+ |
+ static Map<String, TaskInput> buildInputs(AnalysisTarget target) { |
+ Source source = target; |
+ return <String, TaskInput>{ |
+ 'thisLibraryElementReady': LIBRARY_ELEMENT5.of(source), |
+ 'directlyImportedLibrariesReady': |
+ IMPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT5), |
+ 'directlyExportedLibrariesReady': |
+ EXPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT5), |
+ }; |
+ } |
+ |
+ static ReadyLibraryElement5Task createTask( |
+ AnalysisContext context, AnalysisTarget target) { |
+ return new ReadyLibraryElement5Task(context, target); |
+ } |
+} |
+ |
+/** |
* A task that ensures that [RESOLVED_UNIT10] is ready for every unit of the |
* target library source and its import/export closure. |
*/ |
@@ -3963,7 +4099,7 @@ class ResolveLibraryReferencesTask extends SourceBasedAnalysisTask { |
} |
/** |
- * An artifitial task that does nothing except to force type names resolution |
+ * An artificial task that does nothing except to force type names resolution |
* for the defining and part units of a library. |
*/ |
class ResolveLibraryTypeNamesTask extends SourceBasedAnalysisTask { |