| 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 f9ba88c0ef54e44327049378a0bca4e8eaddad86..f7d5592e88e926898680bdf67eee56b5ad2ea305 100644
|
| --- a/pkg/analyzer/lib/src/task/dart.dart
|
| +++ b/pkg/analyzer/lib/src/task/dart.dart
|
| @@ -86,22 +86,24 @@ final ResultDescriptor<CompilationUnitElement> COMPILATION_UNIT_ELEMENT =
|
| cachingPolicy: ELEMENT_CACHING_POLICY);
|
|
|
| /**
|
| - * The list of [Element]s on which the target constant element depends.
|
| + * The list of [ConstantEvaluationTarget]s on which the target constant element
|
| + * depends.
|
| *
|
| - * The result is only available for targets representing a constant [Element]
|
| - * (i.e. a constant variable declaration, a constant constructor, or a
|
| - * parameter element with a default value).
|
| + * The result is only available for targets representing a
|
| + * [ConstantEvaluationTarget] (i.e. a constant variable declaration, a constant
|
| + * constructor, or a parameter element with a default value).
|
| */
|
| -final ListResultDescriptor<Element> CONSTANT_DEPENDENCIES =
|
| - new ListResultDescriptor<Element>('CONSTANT_DEPENDENCIES', <Element>[]);
|
| +final ListResultDescriptor<ConstantEvaluationTarget> CONSTANT_DEPENDENCIES =
|
| + new ListResultDescriptor<ConstantEvaluationTarget>(
|
| + 'CONSTANT_DEPENDENCIES', const <ConstantEvaluationTarget>[]);
|
|
|
| /**
|
| - * An [Element] that has been successfully constant-evaluated.
|
| + * A [ConstantEvaluationTarget] that has been successfully constant-evaluated.
|
| *
|
| * TODO(paulberry): is ELEMENT_CACHING_POLICY the correct caching policy?
|
| */
|
| -final ResultDescriptor<Element> CONSTANT_EVALUATED_ELEMENT =
|
| - new ResultDescriptor<Element>('CONST_EVALUATED_ELEMENT', null,
|
| +final ResultDescriptor<ConstantEvaluationTarget> CONSTANT_VALUE =
|
| + new ResultDescriptor<ConstantEvaluationTarget>('CONSTANT_VALUE', null,
|
| cachingPolicy: ELEMENT_CACHING_POLICY);
|
|
|
| /**
|
| @@ -1640,7 +1642,7 @@ class BuildTypeProviderTask extends SourceBasedAnalysisTask {
|
| /**
|
| * A task that computes [CONSTANT_DEPENDENCIES] for a constant.
|
| */
|
| -class ComputeConstantDependenciesTask extends ElementBasedAnalysisTask {
|
| +class ComputeConstantDependenciesTask extends ConstantEvaluationAnalysisTask {
|
| /**
|
| * The name of the [RESOLVED_UNIT] input.
|
| */
|
| @@ -1651,8 +1653,8 @@ class ComputeConstantDependenciesTask extends ElementBasedAnalysisTask {
|
| <ResultDescriptor>[CONSTANT_DEPENDENCIES]);
|
|
|
| ComputeConstantDependenciesTask(
|
| - InternalAnalysisContext context, Element element)
|
| - : super(context, element);
|
| + InternalAnalysisContext context, ConstantEvaluationTarget constant)
|
| + : super(context, constant);
|
|
|
| @override
|
| TaskDescriptor get descriptor => DESCRIPTOR;
|
| @@ -1666,15 +1668,15 @@ class ComputeConstantDependenciesTask extends ElementBasedAnalysisTask {
|
| // to ensure that resolution has occurred before we attempt to determine
|
| // constant dependencies.
|
| //
|
| - Element element = target;
|
| - AnalysisContext context = element.context;
|
| + ConstantEvaluationTarget constant = target;
|
| + AnalysisContext context = constant.context;
|
| TypeProvider typeProvider = context.typeProvider;
|
| //
|
| // Compute dependencies.
|
| //
|
| - List<Element> dependencies = <Element>[];
|
| + List<ConstantEvaluationTarget> dependencies = <ConstantEvaluationTarget>[];
|
| new ConstantEvaluationEngine(typeProvider, context.declaredVariables)
|
| - .computeDependencies(element, dependencies.add);
|
| + .computeDependencies(constant, dependencies.add);
|
| //
|
| // Record outputs.
|
| //
|
| @@ -1686,13 +1688,24 @@ class ComputeConstantDependenciesTask extends ElementBasedAnalysisTask {
|
| * input descriptors describing those inputs for a task with the
|
| * given [target].
|
| */
|
| - static Map<String, TaskInput> buildInputs(Element target) {
|
| - CompilationUnitElementImpl unit = target
|
| - .getAncestor((Element element) => element is CompilationUnitElement);
|
| - return <String, TaskInput>{
|
| - UNIT_INPUT: RESOLVED_UNIT
|
| - .of(new LibrarySpecificUnit(unit.librarySource, target.source))
|
| - };
|
| + static Map<String, TaskInput> buildInputs(ConstantEvaluationTarget target) {
|
| + if (target is Element) {
|
| + CompilationUnitElementImpl unit = (target as Element)
|
| + .getAncestor((Element element) => element is CompilationUnitElement);
|
| + return <String, TaskInput>{
|
| + UNIT_INPUT: RESOLVED_UNIT
|
| + .of(new LibrarySpecificUnit(unit.librarySource, target.source))
|
| + };
|
| + } else if (target is ConstantEvaluationTarget_Annotation) {
|
| + return <String, TaskInput>{
|
| + UNIT_INPUT: RESOLVED_UNIT
|
| + .of(new LibrarySpecificUnit(target.librarySource, target.source))
|
| + };
|
| + } else {
|
| + // Should never happen.
|
| + assert(false);
|
| + return <String, TaskInput>{};
|
| + }
|
| }
|
|
|
| /**
|
| @@ -1706,10 +1719,10 @@ class ComputeConstantDependenciesTask extends ElementBasedAnalysisTask {
|
| }
|
|
|
| /**
|
| - * A task that computes the value of a constant ([CONSTANT_EVALUATED_ELEMENT]) and
|
| + * A task that computes the value of a constant ([CONSTANT_VALUE]) and
|
| * stores it in the element model.
|
| */
|
| -class ComputeConstantValueTask extends ElementBasedAnalysisTask {
|
| +class ComputeConstantValueTask extends ConstantEvaluationAnalysisTask {
|
| /**
|
| * The name of the input which ensures that dependent constants are evaluated
|
| * before the target.
|
| @@ -1718,10 +1731,11 @@ class ComputeConstantValueTask extends ElementBasedAnalysisTask {
|
|
|
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
|
| 'ComputeConstantValueTask', createTask, buildInputs,
|
| - <ResultDescriptor>[CONSTANT_EVALUATED_ELEMENT]);
|
| + <ResultDescriptor>[CONSTANT_VALUE]);
|
|
|
| - ComputeConstantValueTask(InternalAnalysisContext context, Element element)
|
| - : super(context, element);
|
| + ComputeConstantValueTask(
|
| + InternalAnalysisContext context, ConstantEvaluationTarget constant)
|
| + : super(context, constant);
|
|
|
| @override
|
| TaskDescriptor get descriptor => DESCRIPTOR;
|
| @@ -1734,18 +1748,18 @@ class ComputeConstantValueTask extends ElementBasedAnalysisTask {
|
| // Note: DEPENDENCIES_INPUT is not needed. It is merely a bookkeeping
|
| // dependency to ensure that the constants that this constant depends on
|
| // are computed first.
|
| - Element element = target;
|
| - AnalysisContext context = element.context;
|
| + ConstantEvaluationTarget constant = target;
|
| + AnalysisContext context = constant.context;
|
| TypeProvider typeProvider = context.typeProvider;
|
| //
|
| // Compute the value of the constant.
|
| //
|
| new ConstantEvaluationEngine(typeProvider, context.declaredVariables)
|
| - .computeConstantValue(element);
|
| + .computeConstantValue(constant);
|
| //
|
| // Record outputs.
|
| //
|
| - outputs[CONSTANT_EVALUATED_ELEMENT] = element;
|
| + outputs[CONSTANT_VALUE] = constant;
|
| }
|
|
|
| /**
|
| @@ -1753,10 +1767,10 @@ class ComputeConstantValueTask extends ElementBasedAnalysisTask {
|
| * input descriptors describing those inputs for a task with the given
|
| * [target].
|
| */
|
| - static Map<String, TaskInput> buildInputs(Element target) {
|
| + static Map<String, TaskInput> buildInputs(ConstantEvaluationTarget target) {
|
| return <String, TaskInput>{
|
| DEPENDENCIES_INPUT:
|
| - CONSTANT_DEPENDENCIES.of(target).toListOf(CONSTANT_EVALUATED_ELEMENT)
|
| + CONSTANT_DEPENDENCIES.of(target).toListOf(CONSTANT_VALUE)
|
| };
|
| }
|
|
|
| @@ -1771,6 +1785,39 @@ class ComputeConstantValueTask extends ElementBasedAnalysisTask {
|
| }
|
|
|
| /**
|
| + * A base class for analysis tasks whose target is expected to be a
|
| + * [ConstantEvaluationTarget].
|
| + */
|
| +abstract class ConstantEvaluationAnalysisTask extends AnalysisTask {
|
| + /**
|
| + * Initialize a newly created task to perform analysis within the given
|
| + * [context] in order to produce results for the given [constant].
|
| + */
|
| + ConstantEvaluationAnalysisTask(
|
| + AnalysisContext context, ConstantEvaluationTarget constant)
|
| + : super(context, constant);
|
| +
|
| + @override
|
| + String get description {
|
| + Source source = target.source;
|
| + String sourceName = source == null ? '<unknown source>' : source.fullName;
|
| + return '${descriptor.name} for element $target in source $sourceName';
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * Interface for [AnalysisTarget]s for which constant evaluation can be
|
| + * performed.
|
| + */
|
| +abstract class ConstantEvaluationTarget extends AnalysisTarget {
|
| + /**
|
| + * Return the [AnalysisContext] which should be used to evaluate this
|
| + * constant.
|
| + */
|
| + AnalysisContext get context;
|
| +}
|
| +
|
| +/**
|
| * A task that computes a list of the libraries containing the target source.
|
| */
|
| class ContainingLibrariesTask extends SourceBasedAnalysisTask {
|
| @@ -1910,25 +1957,6 @@ class DartErrorsTask extends SourceBasedAnalysisTask {
|
| }
|
|
|
| /**
|
| - * A base class for analysis tasks whose target is expected to be an element.
|
| - */
|
| -abstract class ElementBasedAnalysisTask extends AnalysisTask {
|
| - /**
|
| - * Initialize a newly created task to perform analysis within the given
|
| - * [context] in order to produce results for the given [element].
|
| - */
|
| - ElementBasedAnalysisTask(AnalysisContext context, Element element)
|
| - : super(context, element);
|
| -
|
| - @override
|
| - String get description {
|
| - Source source = target.source;
|
| - String sourceName = source == null ? '<unknown source>' : source.fullName;
|
| - return '${descriptor.name} for element $target in source $sourceName';
|
| - }
|
| -}
|
| -
|
| -/**
|
| * The helper for building the export [Namespace] of a [LibraryElement].
|
| */
|
| class ExportNamespaceBuilder {
|
|
|