Chromium Code Reviews| 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 6e3f7a4491eb188b94d879a65bf58ce909e9fea0..46d86e5e14b6a15756dae09df7d472b261f4ca57 100644 |
| --- a/pkg/analyzer/lib/src/task/dart.dart |
| +++ b/pkg/analyzer/lib/src/task/dart.dart |
| @@ -25,6 +25,7 @@ import 'package:analyzer/src/task/general.dart'; |
| import 'package:analyzer/src/task/html.dart'; |
| import 'package:analyzer/src/task/inputs.dart'; |
| import 'package:analyzer/src/task/model.dart'; |
| +import 'package:analyzer/src/task/strong_mode.dart'; |
| import 'package:analyzer/task/dart.dart'; |
| import 'package:analyzer/task/general.dart'; |
| import 'package:analyzer/task/model.dart'; |
| @@ -58,12 +59,23 @@ final ListResultDescriptor<AnalysisError> BUILD_LIBRARY_ERRORS = |
| 'BUILD_LIBRARY_ERRORS', AnalysisError.NO_ERRORS); |
| /** |
| + * A list of the [ClassElement]s representing the classes defined in a |
| + * compilation unit. |
| + * |
| + * The result is only available for [LibrarySpecificUnit]s, and only when strong |
| + * mode is enabled. |
| + */ |
| +final ListResultDescriptor<ClassElement> CLASSES_IN_UNIT = |
| + new ListResultDescriptor<ClassElement>('CLASSES_IN_UNIT', null); |
| + |
| +/** |
| * 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 = |
| +final ListResultDescriptor< |
| + ConstantEvaluationTarget> COMPILATION_UNIT_CONSTANTS = |
|
scheglov
2015/08/17 20:08:49
OMG, why does it format it this way?...
Also, it
Brian Wilkerson
2015/08/18 00:07:04
That would be a question for Bob.
|
| new ListResultDescriptor<ConstantEvaluationTarget>( |
| 'COMPILATION_UNIT_CONSTANTS', null, |
| cachingPolicy: ELEMENT_CACHING_POLICY); |
| @@ -143,6 +155,18 @@ final ListResultDescriptor<Source> IMPORT_EXPORT_SOURCE_CLOSURE = |
| new ListResultDescriptor<Source>('IMPORT_EXPORT_SOURCE_CLOSURE', null); |
| /** |
| + * A list of the [VariableElement]s defined in a unit whose type should be |
| + * inferred. This includes variables defined at the library level as well as |
| + * static members inside classes. |
| + * |
| + * The result is only available for [LibrarySpecificUnit]s, and only when strong |
| + * mode is enabled. |
| + */ |
| +final ListResultDescriptor<VariableElement> INFERABLE_STATIC_VARIABLES_IN_UNIT = |
| + new ListResultDescriptor<VariableElement>( |
| + 'INFERABLE_STATIC_VARIABLES_IN_UNIT', null); |
| + |
| +/** |
| * The partial [LibraryElement] associated with a library. |
| * |
| * The [LibraryElement] and its [CompilationUnitElement]s are attached to each |
| @@ -399,11 +423,14 @@ class BuildCompilationUnitElementTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'BuildCompilationUnitElementTask', createTask, buildInputs, |
| - <ResultDescriptor>[ |
| + 'BuildCompilationUnitElementTask', |
| + createTask, |
| + buildInputs, <ResultDescriptor>[ |
| + CLASSES_IN_UNIT, |
| + COMPILATION_UNIT_CONSTANTS, |
| COMPILATION_UNIT_ELEMENT, |
| - RESOLVED_UNIT1, |
| - COMPILATION_UNIT_CONSTANTS |
| + INFERABLE_STATIC_VARIABLES_IN_UNIT, |
| + RESOLVED_UNIT1 |
| ]); |
| /** |
| @@ -446,15 +473,27 @@ class BuildCompilationUnitElementTask extends SourceBasedAnalysisTask { |
| ConstantFinder constantFinder = |
| new ConstantFinder(context, source, librarySpecificUnit.library); |
| unit.accept(constantFinder); |
| - List<ConstantEvaluationTarget> constants = |
| - new List<ConstantEvaluationTarget>.from( |
| - constantFinder.constantsToCompute); |
| + List<ConstantEvaluationTarget> constants = new List< |
| + ConstantEvaluationTarget>.from(constantFinder.constantsToCompute); |
| + // |
| + // Prepare targets for inference. |
| + // |
| + List<VariableElement> staticVariables = <VariableElement>[]; |
| + List<ClassElement> classes = <ClassElement>[]; |
| + if (context.analysisOptions.strongMode) { |
| + InferrenceFinder inferrenceFinder = new InferrenceFinder(); |
| + unit.accept(inferrenceFinder); |
| + staticVariables = inferrenceFinder.staticVariables; |
| + classes = inferrenceFinder.classes; |
| + } |
| // |
| // Record outputs. |
| // |
| + outputs[CLASSES_IN_UNIT] = classes; |
| + outputs[COMPILATION_UNIT_CONSTANTS] = constants; |
| outputs[COMPILATION_UNIT_ELEMENT] = element; |
| + outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT] = staticVariables; |
| outputs[RESOLVED_UNIT1] = unit; |
| - outputs[COMPILATION_UNIT_CONSTANTS] = constants; |
| } |
| /** |
| @@ -521,10 +560,10 @@ class BuildDirectiveElementsTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'BuildDirectiveElementsTask', createTask, buildInputs, <ResultDescriptor>[ |
| - LIBRARY_ELEMENT2, |
| - BUILD_DIRECTIVES_ERRORS |
| - ]); |
| + 'BuildDirectiveElementsTask', |
| + createTask, |
| + buildInputs, |
| + <ResultDescriptor>[LIBRARY_ELEMENT2, BUILD_DIRECTIVES_ERRORS]); |
| BuildDirectiveElementsTask( |
| InternalAnalysisContext context, AnalysisTarget target) |
| @@ -629,8 +668,11 @@ class BuildDirectiveElementsTask extends SourceBasedAnalysisTask { |
| directive.element = exportElement; |
| exports.add(exportElement); |
| if (exportSourceKindMap[exportedSource] != SourceKind.LIBRARY) { |
| - errors.add(new AnalysisError(exportedSource, uriLiteral.offset, |
| - uriLiteral.length, CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, |
| + errors.add(new AnalysisError( |
| + exportedSource, |
| + uriLiteral.offset, |
| + uriLiteral.length, |
| + CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, |
| [uriLiteral.toSource()])); |
| } |
| } |
| @@ -740,7 +782,9 @@ class BuildEnumMemberElementsTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'BuildEnumMemberElementsTask', createTask, buildInputs, |
| + 'BuildEnumMemberElementsTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[RESOLVED_UNIT2]); |
| BuildEnumMemberElementsTask( |
| @@ -801,7 +845,9 @@ class BuildExportNamespaceTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'BuildExportNamespaceTask', createTask, buildInputs, |
| + 'BuildExportNamespaceTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[LIBRARY_ELEMENT4]); |
| BuildExportNamespaceTask( |
| @@ -957,8 +1003,11 @@ class BuildLibraryElementTask extends SourceBasedAnalysisTask { |
| String partLibraryName = |
| _getPartLibraryName(partSource, partUnit, directivesToResolve); |
| if (partLibraryName == null) { |
| - errors.add(new AnalysisError(librarySource, partUri.offset, |
| - partUri.length, CompileTimeErrorCode.PART_OF_NON_PART, |
| + errors.add(new AnalysisError( |
| + librarySource, |
| + partUri.offset, |
| + partUri.length, |
| + CompileTimeErrorCode.PART_OF_NON_PART, |
| [partUri.toSource()])); |
| } else if (libraryNameNode == null) { |
| if (partsLibraryName == _UNKNOWN_LIBRARY_NAME) { |
| @@ -967,11 +1016,12 @@ class BuildLibraryElementTask extends SourceBasedAnalysisTask { |
| partsLibraryName = null; |
| } |
| } else if (libraryNameNode.name != partLibraryName) { |
| - errors.add(new AnalysisError(librarySource, partUri.offset, |
| - partUri.length, StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, [ |
| - libraryNameNode.name, |
| - partLibraryName |
| - ])); |
| + errors.add(new AnalysisError( |
| + librarySource, |
| + partUri.offset, |
| + partUri.length, |
| + StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, |
| + [libraryNameNode.name, partLibraryName])); |
| } |
| } |
| if (entryPoint == null) { |
| @@ -1138,7 +1188,9 @@ class BuildPublicNamespaceTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'BuildPublicNamespaceTask', createTask, buildInputs, |
| + 'BuildPublicNamespaceTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[LIBRARY_ELEMENT3]); |
| BuildPublicNamespaceTask( |
| @@ -1188,7 +1240,9 @@ class BuildSourceExportClosureTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'BuildSourceExportClosureTask', createTask, buildInputs, |
| + 'BuildSourceExportClosureTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[EXPORT_SOURCE_CLOSURE]); |
| BuildSourceExportClosureTask( |
| @@ -1243,7 +1297,9 @@ class BuildSourceImportExportClosureTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'BuildSourceImportExportClosureTask', createTask, buildInputs, |
| + 'BuildSourceImportExportClosureTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[IMPORT_EXPORT_SOURCE_CLOSURE, IS_CLIENT]); |
| BuildSourceImportExportClosureTask( |
| @@ -1305,7 +1361,9 @@ class BuildTypeProviderTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'BuildTypeProviderTask', createTask, buildInputs, |
| + 'BuildTypeProviderTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[TYPE_PROVIDER]); |
| BuildTypeProviderTask( |
| @@ -1365,7 +1423,9 @@ class ComputeConstantDependenciesTask extends ConstantEvaluationAnalysisTask { |
| static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'ComputeConstantDependenciesTask', createTask, buildInputs, |
| + 'ComputeConstantDependenciesTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[CONSTANT_DEPENDENCIES]); |
| ComputeConstantDependenciesTask( |
| @@ -1451,7 +1511,9 @@ class ComputeConstantValueTask extends ConstantEvaluationAnalysisTask { |
| static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'ComputeConstantValueTask', createTask, buildInputs, |
| + 'ComputeConstantValueTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[CONSTANT_VALUE]); |
| ComputeConstantValueTask( |
| @@ -1565,7 +1627,9 @@ class ContainingLibrariesTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'ContainingLibrariesTask', createTask, buildInputs, |
| + 'ContainingLibrariesTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[CONTAINING_LIBRARIES]); |
| ContainingLibrariesTask( |
| @@ -1774,9 +1838,8 @@ class DartErrorsTask extends SourceBasedAnalysisTask { |
| BUILD_LIBRARY_ERRORS_INPUT: BUILD_LIBRARY_ERRORS.of(source), |
| PARSE_ERRORS_INPUT: PARSE_ERRORS.of(source), |
| SCAN_ERRORS_INPUT: SCAN_ERRORS.of(source), |
| - LIBRARY_UNIT_ERRORS_INPUT: CONTAINING_LIBRARIES |
| - .of(source) |
| - .toMap((Source library) { |
| + LIBRARY_UNIT_ERRORS_INPUT: |
| + CONTAINING_LIBRARIES.of(source).toMap((Source library) { |
| LibrarySpecificUnit unit = new LibrarySpecificUnit(library, source); |
| return LIBRARY_UNIT_ERRORS.of(unit); |
| }) |
| @@ -1811,7 +1874,9 @@ class EvaluateUnitConstantsTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'EvaluateUnitConstantsTask', createTask, buildInputs, |
| + 'EvaluateUnitConstantsTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[RESOLVED_UNIT]); |
| EvaluateUnitConstantsTask(AnalysisContext context, LibrarySpecificUnit target) |
| @@ -1969,7 +2034,9 @@ class GatherUsedImportedElementsTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'GatherUsedImportedElementsTask', createTask, buildInputs, |
| + 'GatherUsedImportedElementsTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[USED_IMPORTED_ELEMENTS]); |
| GatherUsedImportedElementsTask( |
| @@ -2029,7 +2096,9 @@ class GatherUsedLocalElementsTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'GatherUsedLocalElementsTask', createTask, buildInputs, |
| + 'GatherUsedLocalElementsTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[USED_LOCAL_ELEMENTS]); |
| GatherUsedLocalElementsTask( |
| @@ -2214,7 +2283,9 @@ class LibraryErrorsReadyTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'LibraryErrorsReadyTask', createTask, buildInputs, |
| + 'LibraryErrorsReadyTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[LIBRARY_ERRORS_READY]); |
| LibraryErrorsReadyTask(InternalAnalysisContext context, AnalysisTarget target) |
| @@ -2287,7 +2358,9 @@ class LibraryUnitErrorsTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'LibraryUnitErrorsTask', createTask, buildInputs, |
| + 'LibraryUnitErrorsTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[LIBRARY_UNIT_ERRORS]); |
| LibraryUnitErrorsTask(InternalAnalysisContext context, AnalysisTarget target) |
| @@ -2363,8 +2436,8 @@ class ParseDartTask extends SourceBasedAnalysisTask { |
| /** |
| * The task descriptor describing this kind of task. |
| */ |
| - static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('ParseDartTask', |
| - createTask, buildInputs, <ResultDescriptor>[ |
| + static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| + 'ParseDartTask', createTask, buildInputs, <ResultDescriptor>[ |
| EXPLICITLY_IMPORTED_LIBRARIES, |
| EXPORTED_LIBRARIES, |
| IMPORTED_LIBRARIES, |
| @@ -2683,7 +2756,9 @@ class ResolveLibraryReferencesTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'ResolveLibraryReferencesTask', createTask, buildInputs, |
| + 'ResolveLibraryReferencesTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[LIBRARY_ELEMENT, REFERENCED_NAMES]); |
| ResolveLibraryReferencesTask( |
| @@ -2755,7 +2830,9 @@ class ResolveLibraryTypeNamesTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'ResolveLibraryTypeNamesTask', createTask, buildInputs, |
| + 'ResolveLibraryTypeNamesTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[LIBRARY_ELEMENT5]); |
| ResolveLibraryTypeNamesTask( |
| @@ -2818,10 +2895,10 @@ class ResolveUnitReferencesTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'ResolveUnitReferencesTask', createTask, buildInputs, <ResultDescriptor>[ |
| - RESOLVE_REFERENCES_ERRORS, |
| - RESOLVED_UNIT5 |
| - ]); |
| + 'ResolveUnitReferencesTask', |
| + createTask, |
| + buildInputs, |
| + <ResultDescriptor>[RESOLVE_REFERENCES_ERRORS, RESOLVED_UNIT5]); |
| ResolveUnitReferencesTask( |
| InternalAnalysisContext context, AnalysisTarget target) |
| @@ -2907,10 +2984,10 @@ class ResolveUnitTypeNamesTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'ResolveUnitTypeNamesTask', createTask, buildInputs, <ResultDescriptor>[ |
| - RESOLVE_TYPE_NAMES_ERRORS, |
| - RESOLVED_UNIT3 |
| - ]); |
| + 'ResolveUnitTypeNamesTask', |
| + createTask, |
| + buildInputs, |
| + <ResultDescriptor>[RESOLVE_TYPE_NAMES_ERRORS, RESOLVED_UNIT3]); |
| ResolveUnitTypeNamesTask( |
| InternalAnalysisContext context, AnalysisTarget target) |
| @@ -2992,7 +3069,9 @@ class ResolveVariableReferencesTask extends SourceBasedAnalysisTask { |
| * The task descriptor describing this kind of task. |
| */ |
| static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| - 'ResolveVariableReferencesTask', createTask, buildInputs, |
| + 'ResolveVariableReferencesTask', |
| + createTask, |
| + buildInputs, |
| <ResultDescriptor>[RESOLVED_UNIT4, VARIABLE_REFERENCE_ERRORS]); |
| ResolveVariableReferencesTask( |
| @@ -3064,12 +3143,11 @@ class ScanDartTask extends SourceBasedAnalysisTask { |
| /** |
| * The task descriptor describing this kind of task. |
| */ |
| - static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('ScanDartTask', |
| - createTask, buildInputs, <ResultDescriptor>[ |
| - LINE_INFO, |
| - SCAN_ERRORS, |
| - TOKEN_STREAM |
| - ]); |
| + static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| + 'ScanDartTask', |
| + createTask, |
| + buildInputs, |
| + <ResultDescriptor>[LINE_INFO, SCAN_ERRORS, TOKEN_STREAM]); |
| /** |
| * Initialize a newly created task to access the content of the source |
| @@ -3110,7 +3188,8 @@ class ScanDartTask extends SourceBasedAnalysisTask { |
| } |
| ScriptFragment fragment = fragments[0]; |
| - Scanner scanner = new Scanner(source, |
| + Scanner scanner = new Scanner( |
| + source, |
| new SubSequenceReader(fragment.content, fragment.offset), |
| errorListener); |
| scanner.setSourceStart(fragment.line, fragment.column); |
| @@ -3218,8 +3297,11 @@ class VerifyUnitTask extends SourceBasedAnalysisTask { |
| // |
| // Use the ErrorVerifier to compute errors. |
| // |
| - ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, |
| - libraryElement, typeProvider, new InheritanceManager(libraryElement), |
| + ErrorVerifier errorVerifier = new ErrorVerifier( |
| + errorReporter, |
| + libraryElement, |
| + typeProvider, |
| + new InheritanceManager(libraryElement), |
| context.analysisOptions.enableSuperMixins); |
| unit.accept(errorVerifier); |
| // |