| 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 f7d5592e88e926898680bdf67eee56b5ad2ea305..62d68b5f7b590cab79ddc411fe8e16cfc3743046 100644
|
| --- a/pkg/analyzer/lib/src/task/dart.dart
|
| +++ b/pkg/analyzer/lib/src/task/dart.dart
|
| @@ -76,6 +76,17 @@ final ListResultDescriptor<ClassElement> CLASS_ELEMENTS =
|
| cachingPolicy: ELEMENT_CACHING_POLICY);
|
|
|
| /**
|
| + * A list of the [ConstantEvaluationTarget]s defined in a unit. This includes
|
| + * constants defined at top level, statically inside classes, and local to
|
| + * functions, as well as constant constructors, annotations, and default values
|
| + * of parameters to constant constructors.
|
| + */
|
| +final ListResultDescriptor<ConstantEvaluationTarget> COMPILATION_UNIT_CONSTANTS =
|
| + new ListResultDescriptor<ConstantEvaluationTarget>(
|
| + 'COMPILATION_UNIT_CONSTANTS', null,
|
| + cachingPolicy: ELEMENT_CACHING_POLICY);
|
| +
|
| +/**
|
| * The element model associated with a single compilation unit.
|
| *
|
| * The result is only available for [LibrarySpecificUnit]s.
|
| @@ -620,7 +631,11 @@ class BuildCompilationUnitElementTask extends SourceBasedAnalysisTask {
|
| */
|
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
|
| 'BuildCompilationUnitElementTask', createTask, buildInputs,
|
| - <ResultDescriptor>[COMPILATION_UNIT_ELEMENT, RESOLVED_UNIT1]);
|
| + <ResultDescriptor>[
|
| + COMPILATION_UNIT_ELEMENT,
|
| + RESOLVED_UNIT1,
|
| + COMPILATION_UNIT_CONSTANTS
|
| + ]);
|
|
|
| /**
|
| * Initialize a newly created task to build a compilation unit element for
|
| @@ -648,11 +663,18 @@ class BuildCompilationUnitElementTask extends SourceBasedAnalysisTask {
|
| CompilationUnitBuilder builder = new CompilationUnitBuilder();
|
| CompilationUnitElement element =
|
| builder.buildCompilationUnit(source, unit, librarySpecificUnit.library);
|
| + ConstantFinder constantFinder =
|
| + new ConstantFinder(context, source, librarySpecificUnit.library);
|
| + unit.accept(constantFinder);
|
| + List<ConstantEvaluationTarget> constants =
|
| + new List<ConstantEvaluationTarget>.from(
|
| + constantFinder.constantsToCompute);
|
| //
|
| // Record outputs.
|
| //
|
| outputs[COMPILATION_UNIT_ELEMENT] = element;
|
| outputs[RESOLVED_UNIT1] = unit;
|
| + outputs[COMPILATION_UNIT_CONSTANTS] = constants;
|
| }
|
|
|
| /**
|
| @@ -1957,6 +1979,64 @@ class DartErrorsTask extends SourceBasedAnalysisTask {
|
| }
|
|
|
| /**
|
| + * A task that builds [CONSTANT_RESOLVED_UNIT] for a unit.
|
| + */
|
| +class EvaluateUnitConstantsTask extends SourceBasedAnalysisTask {
|
| + /**
|
| + * The name of the [RESOLVED_UNIT] input.
|
| + */
|
| + static const String UNIT_INPUT = 'UNIT_INPUT';
|
| +
|
| + /**
|
| + * The name of the [CONSTANT_VALUE] input.
|
| + */
|
| + static const String CONSTANT_VALUES = 'CONSTANT_VALUES';
|
| +
|
| + /**
|
| + * The task descriptor describing this kind of task.
|
| + */
|
| + static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
|
| + 'EvaluateUnitConstantsTask', createTask, buildInputs,
|
| + <ResultDescriptor>[CONSTANT_RESOLVED_UNIT]);
|
| +
|
| + EvaluateUnitConstantsTask(AnalysisContext context, LibrarySpecificUnit target)
|
| + : super(context, target);
|
| +
|
| + @override
|
| + TaskDescriptor get descriptor => DESCRIPTOR;
|
| +
|
| + @override
|
| + void internalPerform() {
|
| + // No actual work needs to be performed; the task manager will ensure that
|
| + // all constants are evaluated before this method is called.
|
| + CompilationUnit unit = getRequiredInput(UNIT_INPUT);
|
| + outputs[CONSTANT_RESOLVED_UNIT] = unit;
|
| + }
|
| +
|
| + /**
|
| + * Return a map from the names of the inputs of this kind of task to the task
|
| + * input descriptors describing those inputs for a task with the
|
| + * given [target].
|
| + */
|
| + static Map<String, TaskInput> buildInputs(LibrarySpecificUnit target) {
|
| + return <String, TaskInput>{
|
| + UNIT_INPUT: RESOLVED_UNIT.of(target),
|
| + CONSTANT_VALUES:
|
| + COMPILATION_UNIT_CONSTANTS.of(target).toListOf(CONSTANT_VALUE)
|
| + };
|
| + }
|
| +
|
| + /**
|
| + * Create an [EvaluateUnitConstantsTask] based on the given [target] in
|
| + * the given [context].
|
| + */
|
| + static EvaluateUnitConstantsTask createTask(
|
| + AnalysisContext context, LibrarySpecificUnit target) {
|
| + return new EvaluateUnitConstantsTask(context, target);
|
| + }
|
| +}
|
| +
|
| +/**
|
| * The helper for building the export [Namespace] of a [LibraryElement].
|
| */
|
| class ExportNamespaceBuilder {
|
|
|