| Index: pkg/analyzer/test/src/task/dart_test.dart
|
| diff --git a/pkg/analyzer/test/src/task/dart_test.dart b/pkg/analyzer/test/src/task/dart_test.dart
|
| index d30fb28980a287e353899d1a775aa352e5e2ae9d..f2184611aa7391ae1f7d6e6448fee7e7daabb6eb 100644
|
| --- a/pkg/analyzer/test/src/task/dart_test.dart
|
| +++ b/pkg/analyzer/test/src/task/dart_test.dart
|
| @@ -47,6 +47,8 @@ main() {
|
| runReflectiveTests(GatherUsedImportedElementsTaskTest);
|
| runReflectiveTests(GatherUsedLocalElementsTaskTest);
|
| runReflectiveTests(GenerateHintsTaskTest);
|
| + runReflectiveTests(InferStaticVariableTypesInUnitTaskTest);
|
| + runReflectiveTests(InferStaticVariableTypeTaskTest);
|
| runReflectiveTests(LibraryErrorsReadyTaskTest);
|
| runReflectiveTests(LibraryUnitErrorsTaskTest);
|
| runReflectiveTests(ParseDartTaskTest);
|
| @@ -1509,7 +1511,7 @@ const b = 0;
|
| expect(task,
|
| new isInstanceOf<ComputeInferableStaticVariableDependenciesTask>());
|
| expect(outputs, hasLength(1));
|
| - Set<VariableElement> dependencies =
|
| + List<VariableElement> dependencies =
|
| outputs[INFERABLE_STATIC_VARIABLE_DEPENDENCIES];
|
| expect(dependencies, unorderedEquals([elementB]));
|
| }
|
| @@ -2032,6 +2034,104 @@ f(A a) {
|
| }
|
|
|
| @reflectiveTest
|
| +class InferStaticVariableTypesInUnitTaskTest extends _AbstractDartTaskTest {
|
| + void test_perform() {
|
| + enableStrongMode();
|
| + AnalysisTarget firstSource = newSource(
|
| + '/first.dart',
|
| + '''
|
| +import 'second.dart';
|
| +
|
| +var a = new M();
|
| +var c = b;
|
| +''');
|
| + AnalysisTarget secondSource = newSource(
|
| + '/second.dart',
|
| + '''
|
| +import 'first.dart';
|
| +
|
| +var b = a;
|
| +class M {}
|
| +''');
|
| + computeResult(new LibrarySpecificUnit(firstSource, firstSource),
|
| + RESOLVED_UNIT6); // new isInstanceOf<InferStaticVariableTypesInUnitTask>()
|
| + CompilationUnit firstUnit = outputs[RESOLVED_UNIT6];
|
| + computeResult(
|
| + new LibrarySpecificUnit(secondSource, secondSource), RESOLVED_UNIT6);
|
| + CompilationUnit secondUnit = outputs[RESOLVED_UNIT6];
|
| +
|
| + VariableDeclaration variableA = getTopLevelVariable(firstUnit, 'a');
|
| + VariableDeclaration variableB = getTopLevelVariable(secondUnit, 'b');
|
| + VariableDeclaration variableC = getTopLevelVariable(firstUnit, 'c');
|
| + ClassDeclaration classM = getClass(secondUnit, 'M');
|
| + DartType typeM = classM.element.type;
|
| +
|
| + expect(variableA.element.type, typeM);
|
| + expect(variableB.element.type, typeM);
|
| + expect(variableB.initializer.staticType, typeM);
|
| + expect(variableC.element.type, typeM);
|
| + expect(variableC.initializer.staticType, typeM);
|
| + }
|
| +}
|
| +
|
| +@reflectiveTest
|
| +class InferStaticVariableTypeTaskTest extends _AbstractDartTaskTest {
|
| + void test_getDeclaration_staticField() {
|
| + AnalysisTarget source = newSource(
|
| + '/test.dart',
|
| + '''
|
| +class C {
|
| + var field = '';
|
| +}
|
| +''');
|
| + computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
|
| + CompilationUnit unit = outputs[RESOLVED_UNIT5];
|
| + VariableDeclaration declaration = getFieldInClass(unit, 'C', 'field');
|
| + VariableElement variable = declaration.name.staticElement;
|
| + InferStaticVariableTypeTask inferTask =
|
| + new InferStaticVariableTypeTask(task.context, variable);
|
| + expect(inferTask.getDeclaration(unit), declaration);
|
| + }
|
| +
|
| + void test_getDeclaration_topLevel() {
|
| + AnalysisTarget source = newSource(
|
| + '/test.dart',
|
| + '''
|
| +var topLevel = '';
|
| +''');
|
| + computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
|
| + CompilationUnit unit = outputs[RESOLVED_UNIT5];
|
| + VariableDeclaration declaration = getTopLevelVariable(unit, 'topLevel');
|
| + VariableElement variable = declaration.name.staticElement;
|
| + InferStaticVariableTypeTask inferTask =
|
| + new InferStaticVariableTypeTask(task.context, variable);
|
| + expect(inferTask.getDeclaration(unit), declaration);
|
| + }
|
| +
|
| + void test_perform() {
|
| + AnalysisTarget source = newSource(
|
| + '/test.dart',
|
| + '''
|
| +var topLevel = '';
|
| +class C {
|
| + var field = topLevel;
|
| +}
|
| +''');
|
| + computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
|
| + CompilationUnit unit = outputs[RESOLVED_UNIT5];
|
| + VariableElement topLevel =
|
| + getTopLevelVariable(unit, 'topLevel').name.staticElement;
|
| + VariableElement field =
|
| + getFieldInClass(unit, 'C', 'field').name.staticElement;
|
| +
|
| + computeResult(field, INFERRED_STATIC_VARIABLE);
|
| + InterfaceType stringType = context.typeProvider.stringType;
|
| + expect(topLevel.type, stringType);
|
| + expect(field.type, stringType);
|
| + }
|
| +}
|
| +
|
| +@reflectiveTest
|
| class LibraryErrorsReadyTaskTest extends _AbstractDartTaskTest {
|
| test_perform() {
|
| Source library = newSource(
|
| @@ -2881,6 +2981,65 @@ class _AbstractDartTaskTest extends AbstractContextTest {
|
| context.analysisOptions = options;
|
| }
|
|
|
| + /**
|
| + * Return the declaration of the class with the given [className] in the given
|
| + * compilation [unit].
|
| + */
|
| + ClassDeclaration getClass(CompilationUnit unit, String className) {
|
| + NodeList<CompilationUnitMember> unitMembers = unit.declarations;
|
| + for (CompilationUnitMember unitMember in unitMembers) {
|
| + if (unitMember is ClassDeclaration && unitMember.name.name == className) {
|
| + return unitMember;
|
| + }
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * Return the declaration of the field with the given [fieldName] in the class
|
| + * with the given [className] in the given compilation [unit].
|
| + */
|
| + VariableDeclaration getFieldInClass(
|
| + CompilationUnit unit, String className, String fieldName) {
|
| + ClassDeclaration unitMember = getClass(unit, className);
|
| + if (unitMember == null) {
|
| + return null;
|
| + }
|
| + NodeList<ClassMember> classMembers = unitMember.members;
|
| + for (ClassMember classMember in classMembers) {
|
| + if (classMember is FieldDeclaration) {
|
| + NodeList<VariableDeclaration> fields = classMember.fields.variables;
|
| + for (VariableDeclaration field in fields) {
|
| + if (field.name.name == fieldName) {
|
| + return field;
|
| + }
|
| + }
|
| + }
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * Return the declaration of the top-level variable with the given
|
| + * [variableName] in the given compilation [unit].
|
| + */
|
| + VariableDeclaration getTopLevelVariable(
|
| + CompilationUnit unit, String variableName) {
|
| + NodeList<CompilationUnitMember> unitMembers = unit.declarations;
|
| + for (CompilationUnitMember unitMember in unitMembers) {
|
| + if (unitMember is TopLevelVariableDeclaration) {
|
| + NodeList<VariableDeclaration> variables =
|
| + unitMember.variables.variables;
|
| + for (VariableDeclaration variable in variables) {
|
| + if (variable.name.name == variableName) {
|
| + return variable;
|
| + }
|
| + }
|
| + }
|
| + }
|
| + return null;
|
| + }
|
| +
|
| void setUp() {
|
| super.setUp();
|
| emptySource = newSource('/test.dart');
|
|
|