Add tests validating unresolved assignments.
R=brianwilkerson@google.com, paulberry@google.com
Change-Id: I6a35ce762e136b4c5092777a5a978ca975b5372c
Reviewed-on: https://dart-review.googlesource.com/63300
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
index b6b5572..c201d87 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
@@ -29,6 +29,62 @@
@override
@failingTest
@potentialAnalyzerProblem
+ test_unresolved_assignment_left_identifier_compound() async {
+ await super.test_unresolved_assignment_left_identifier_compound();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_unresolved_assignment_left_identifier_simple() async {
+ await super.test_unresolved_assignment_left_identifier_simple();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_unresolved_assignment_left_indexed1_simple() async {
+ await super.test_unresolved_assignment_left_indexed1_simple();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_unresolved_assignment_left_indexed2_simple() async {
+ await super.test_unresolved_assignment_left_indexed2_simple();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_unresolved_assignment_left_indexed3_simple() async {
+ await super.test_unresolved_assignment_left_indexed3_simple();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_unresolved_assignment_left_indexed4_simple() async {
+ await super.test_unresolved_assignment_left_indexed4_simple();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_unresolved_assignment_left_prefixed1_simple() async {
+ await super.test_unresolved_assignment_left_prefixed1_simple();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_unresolved_assignment_left_property1_simple() async {
+ await super.test_unresolved_assignment_left_property1_simple();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
test_unresolved_instanceCreation_name_11() async {
await super.test_unresolved_instanceCreation_name_11();
}
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 05f5c66..e17435c 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -2,11 +2,14 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import 'dart:async';
+
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/member.dart';
import 'package:analyzer/src/dart/element/type.dart';
@@ -34,6 +37,8 @@
@reflectiveTest
class AnalysisDriverResolutionTest extends BaseAnalysisDriverTest {
AnalysisResult result;
+ FindNode findNode;
+ FindElement findElement;
DartType get doubleType => typeProvider.doubleType;
@@ -41,6 +46,26 @@
TypeProvider get typeProvider => result.unit.element.context.typeProvider;
+ void assertElement(Expression node, Element expected) {
+ Element actual = getNodeElement(node);
+ expect(actual, same(expected));
+ }
+
+ void assertElementNull(Expression node) {
+ Element actual = getNodeElement(node);
+ expect(actual, isNull);
+ }
+
+ void assertType(Expression expression, String expected) {
+ DartType actual = expression.staticType;
+ expect(actual?.toString(), expected);
+ }
+
+ void assertTypeDynamic(Expression expression) {
+ DartType actual = expression.staticType;
+ expect(actual, isDynamicType);
+ }
+
/// Creates a function that checks that an expression is a reference to a top
/// level variable with the given [name].
void Function(Expression) checkTopVarRef(String name) {
@@ -73,6 +98,24 @@
};
}
+ Element getNodeElement(Expression node) {
+ if (node is AssignmentExpression) {
+ return node.staticElement;
+ } else if (node is Identifier) {
+ return node.staticElement;
+ } else if (node is IndexExpression) {
+ return node.staticElement;
+ } else {
+ fail('Unsupported node: (${node.runtimeType}) $node');
+ }
+ }
+
+ Future resolveTestFile() async {
+ result = await driver.getResult(testFile);
+ findNode = new FindNode(result);
+ findElement = new FindElement(result);
+ }
+
test_adjacentStrings() async {
String content = r'''
void main() {
@@ -80,7 +123,7 @@
}
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> statements = _getMainStatements(result);
@@ -123,7 +166,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
TopLevelVariableDeclaration myDeclaration = result.unit.declarations[0];
VariableDeclaration myVariable = myDeclaration.variables.variables[0];
@@ -182,7 +225,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration c = result.unit.declarations[0];
ConstructorDeclaration constructor = c.members[1];
@@ -211,7 +254,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
TopLevelVariableDeclaration myDeclaration = result.unit.declarations[0];
VariableDeclaration myVariable = myDeclaration.variables.variables[0];
@@ -242,7 +285,7 @@
@p.A.a
main() {}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -283,7 +326,7 @@
@p.A(1, b: 2)
main() {}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
ImportElement aImport = unit.element.library.imports[0];
@@ -325,7 +368,7 @@
@p.A.named(1, b: 2)
main() {}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
ImportElement aImport = unit.element.library.imports[0];
@@ -367,7 +410,7 @@
@p.topAnnotation
main() {}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
ImportElement aImport = unit.element.library.imports[0];
@@ -400,7 +443,7 @@
static const a = 1;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
CompilationUnitElement unitElement = unit.element;
var typeProvider = unitElement.context.typeProvider;
@@ -431,7 +474,7 @@
const A(int a, {int b});
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
CompilationUnitElement unitElement = unit.element;
@@ -461,7 +504,7 @@
const A.named(int a, {int b});
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
CompilationUnitElement unitElement = unit.element;
@@ -498,7 +541,7 @@
@D(const C())
f() {}
''');
- var result = await driver.getResult(testFile);
+ await resolveTestFile();
var elementC = AstFinder.getClass(result.unit, 'C').element;
var constructorC = elementC.constructors[0];
var elementD = AstFinder.getClass(result.unit, 'D').element;
@@ -528,7 +571,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
TopLevelVariableDeclaration declaration_1 = result.unit.declarations[0];
VariableDeclaration variable_1 = declaration_1.variables.variables[0];
@@ -564,7 +607,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.path, testFile);
expect(result.errors, isEmpty);
@@ -603,7 +646,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -656,7 +699,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -699,7 +742,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -751,7 +794,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -793,7 +836,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -837,7 +880,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -876,7 +919,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -929,7 +972,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -965,7 +1008,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -1007,7 +1050,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -1056,7 +1099,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -1098,7 +1141,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -1143,7 +1186,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -1201,7 +1244,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -1242,7 +1285,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -1278,7 +1321,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -1315,7 +1358,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -1341,7 +1384,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -1364,7 +1407,7 @@
true || true;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> statements = _getMainStatements(result);
@@ -1391,7 +1434,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -1416,7 +1459,7 @@
}
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> statements = _getMainStatements(result);
@@ -1446,7 +1489,7 @@
});
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
FunctionDeclaration mainDeclaration = result.unit.declarations[0];
FunctionElement mainElement = mainDeclaration.element;
@@ -1546,7 +1589,7 @@
var v = (() => 42)();
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
ClassDeclaration c = unit.declarations[0];
@@ -1564,7 +1607,7 @@
addTestFile(r'''
var v = (() => 42)();
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
TopLevelVariableDeclaration declaration = unit.declarations[0];
@@ -1585,7 +1628,7 @@
}
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> statements = _getMainStatements(result);
@@ -1605,7 +1648,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration cNode = result.unit.declarations[0];
@@ -1629,7 +1672,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration cNode = result.unit.declarations[0];
ClassElement cElement = cNode.element;
@@ -1658,7 +1701,7 @@
B.two(int p) : super.named(p + 1, b: p + 2);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration aNode = result.unit.declarations[0];
ClassElement aElement = aNode.element;
@@ -1698,7 +1741,7 @@
C.two(int p) : this.named(3, b: 4);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration cNode = result.unit.declarations[0];
ClassElement cElement = cNode.element;
@@ -1748,7 +1791,7 @@
factory B.two(double b) = A.named;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isEmpty);
ClassDeclaration aNode = result.unit.declarations[0];
@@ -1809,7 +1852,7 @@
factory B.two(double b) = A<U>.named;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isEmpty);
ClassDeclaration aNode = result.unit.declarations[0];
@@ -1874,7 +1917,7 @@
e.toString();
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
EnumDeclaration enumNode = result.unit.declarations[0];
ClassElement enumElement = enumNode.element;
@@ -1897,7 +1940,7 @@
}
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
var statements = _getMainStatements(result);
@@ -1922,7 +1965,7 @@
var f = <T>[];
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration cNode = result.unit.declarations[0];
var tElement = cNode.element.typeParameters[0];
@@ -1939,7 +1982,7 @@
A(String p(int a));
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration clazz = result.unit.declarations[0];
ConstructorDeclaration constructor = clazz.members[0];
@@ -1973,7 +2016,7 @@
A(String this.f(int a));
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration clazz = result.unit.declarations[0];
@@ -2017,7 +2060,7 @@
A(this.f);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration clazz = result.unit.declarations[0];
@@ -2047,7 +2090,7 @@
A(int this.f);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration clazz = result.unit.declarations[0];
@@ -2080,7 +2123,7 @@
b.m(1);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration aNode = result.unit.declarations[0];
ClassElement eElement = aNode.element;
@@ -2103,7 +2146,7 @@
(f as Foo<int>)<String>('hello');
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> statements = _getMainStatements(result);
@@ -2128,7 +2171,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -2169,7 +2212,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
ClassDeclaration cNode = unit.declarations[0];
@@ -2222,7 +2265,7 @@
var v = new X(1, b: true, c: 3.0);
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
ClassDeclaration xNode = unit.declarations[0];
@@ -2262,7 +2305,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
ClassDeclaration cNode = unit.declarations[0];
@@ -2329,7 +2372,7 @@
new p.C<bool>.named(false);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -2447,7 +2490,7 @@
C.named(T p);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
CompilationUnitElement unitElement = unit.element;
var typeProvider = unitElement.context.typeProvider;
@@ -2561,7 +2604,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -2646,7 +2689,7 @@
foo(1);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
TopLevelVariableElement foo = _getTopLevelVariable(result, 'foo');
@@ -2677,7 +2720,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.path, testFile);
expect(result.errors, isEmpty);
@@ -2716,7 +2759,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.path, testFile);
expect(result.errors, isEmpty);
@@ -2756,7 +2799,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> statements = _getMainStatements(result);
LabeledStatement statement = statements[0];
@@ -2785,7 +2828,7 @@
''');
String fTypeString = '(int, String) → double';
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
InterfaceType doubleType = typeProvider.doubleType;
@@ -2844,7 +2887,7 @@
var v = f(1, '2');
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
@@ -2924,7 +2967,7 @@
void F<T extends U, U, V extends U>(T x, U y, V z) {}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
FunctionDeclarationStatement fStatement = mainStatements[0];
@@ -2946,7 +2989,7 @@
void F<T>({T x}) {}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
FunctionDeclarationStatement fStatement = mainStatements[0];
@@ -2966,7 +3009,7 @@
void F<T>([T x]) {}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
FunctionDeclarationStatement fStatement = mainStatements[0];
@@ -2989,7 +3032,7 @@
''');
String fTypeString = '(int, {b: String, c: bool}) → double';
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
InterfaceType doubleType = typeProvider.doubleType;
@@ -3054,7 +3097,7 @@
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
FunctionDeclarationStatement fStatement = mainStatements[0];
@@ -3081,7 +3124,7 @@
''');
String fTypeString = '(int, [String, bool]) → double';
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
InterfaceType doubleType = typeProvider.doubleType;
@@ -3154,7 +3197,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.path, testFile);
expect(result.errors, isEmpty);
@@ -3187,7 +3230,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
@@ -3241,7 +3284,7 @@
v;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.path, testFile);
expect(result.errors, isEmpty);
@@ -3289,7 +3332,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -3328,7 +3371,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -3363,7 +3406,7 @@
}
num v;
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -3397,7 +3440,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -3427,7 +3470,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -3462,7 +3505,7 @@
var a = 1, b = 2.3;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> statements = _getMainStatements(result);
@@ -3491,7 +3534,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
@@ -3547,7 +3590,7 @@
const <bool, String>{};
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
var statements = _getMainStatements(result);
@@ -3581,7 +3624,7 @@
''');
String fTypeString = '(int, {b: String, c: bool}) → double';
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration classDeclaration = result.unit.declarations[0];
MethodDeclaration methodDeclaration = classDeclaration.members[0];
MethodElement methodElement = methodDeclaration.element;
@@ -3646,7 +3689,7 @@
new C().call(0);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isEmpty);
ClassDeclaration cNode = result.unit.declarations[0];
@@ -3672,7 +3715,7 @@
computation.call(1);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isEmpty);
FunctionDeclaration main = result.unit.declarations[0];
@@ -3715,7 +3758,7 @@
b.foo(1);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration aNode = result.unit.declarations[0];
MethodDeclaration fooNode = aNode.members[0];
@@ -3740,7 +3783,7 @@
void m(T p) {}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
ClassDeclaration cNode = result.unit.declarations[1];
@@ -3775,7 +3818,7 @@
Map<T, U> m<U>(T a, U b) => null;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
@@ -3820,7 +3863,7 @@
}
void foo(int a, {bool b, double c}) {}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
FunctionDeclaration foo = result.unit.declarations[1];
@@ -3844,7 +3887,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration cDeclaration = result.unit.declarations[0];
@@ -3879,7 +3922,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration cDeclaration = result.unit.declarations[0];
@@ -3916,7 +3959,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
FunctionTypeAlias funDeclaration = result.unit.declarations[0];
FunctionTypeAliasElement funElement = funDeclaration.element;
@@ -3947,7 +3990,7 @@
f(1);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
FunctionDeclaration mainDeclaration = result.unit.declarations[0];
FunctionExpression mainFunction = mainDeclaration.functionExpression;
@@ -3974,7 +4017,7 @@
f(1);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
FunctionDeclaration mainDeclaration = result.unit.declarations[0];
FunctionExpression mainFunction = mainDeclaration.functionExpression;
@@ -4001,7 +4044,7 @@
f(1);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
TopLevelVariableDeclaration fDeclaration = result.unit.declarations[0];
VariableDeclaration fNode = fDeclaration.variables.variables[0];
@@ -4033,7 +4076,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
ClassDeclaration cNode = result.unit.declarations[1];
@@ -4097,7 +4140,7 @@
}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration cNode = result.unit.declarations[0];
TypeParameterElement tElement = cNode.element.typeParameters[0];
@@ -4120,7 +4163,7 @@
''');
String fTypeString = '(int, String) → double';
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
InterfaceType doubleType = typeProvider.doubleType;
@@ -4149,7 +4192,7 @@
}
void f<T, U>(T a, U b) {}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> mainStatements = _getMainStatements(result);
@@ -4224,7 +4267,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -4262,7 +4305,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -4301,7 +4344,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> statements = _getMainStatements(result);
@@ -4335,7 +4378,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
List<Statement> statements = _getMainStatements(result);
@@ -4361,7 +4404,7 @@
computation.call;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isEmpty);
FunctionDeclaration main = result.unit.declarations[0];
@@ -4408,7 +4451,7 @@
my.mySetter = 0;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
// TODO(scheglov) Uncomment and fix "unused imports" hint.
// expect(result.errors, isEmpty);
@@ -4491,7 +4534,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -4540,7 +4583,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -4579,7 +4622,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -4633,7 +4676,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -4668,7 +4711,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -4702,7 +4745,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.path, testFile);
expect(result.errors, isEmpty);
@@ -4762,7 +4805,7 @@
'''$v''';
}
""");
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isEmpty);
}
@@ -4787,7 +4830,7 @@
}
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration aNode = result.unit.declarations[0];
ClassDeclaration bNode = result.unit.declarations[1];
@@ -4902,7 +4945,7 @@
}
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration aNode = result.unit.declarations[0];
@@ -5003,7 +5046,7 @@
class D extends A<bool> with B<int> implements C<double> {}
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration aNode = result.unit.declarations[0];
ClassElement aElement = aNode.element;
@@ -5066,7 +5109,7 @@
}
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration cNode = result.unit.declarations[0];
ClassElement cElement = cNode.element;
@@ -5095,7 +5138,7 @@
class D = A<bool> with B<int> implements C<double>;
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
ClassDeclaration aNode = result.unit.declarations[0];
ClassElement aElement = aNode.element;
@@ -5157,7 +5200,7 @@
}
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
EnumDeclaration enumNode = result.unit.declarations[0];
ClassElement enumElement = enumNode.element;
@@ -5198,7 +5241,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.path, testFile);
InterfaceType typeType = typeProvider.typeType;
@@ -5326,7 +5369,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.path, testFile);
InterfaceType doubleType = typeProvider.doubleType;
@@ -5428,7 +5471,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
CompilationUnitElement unitElement = unit.element;
var typeProvider = unitElement.context.typeProvider;
@@ -5476,7 +5519,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
CompilationUnitElement unitElement = unit.element;
var typeProvider = unitElement.context.typeProvider;
@@ -5522,7 +5565,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
CompilationUnitElement unitElement = unit.element;
var typeProvider = unitElement.context.typeProvider;
@@ -5565,7 +5608,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
CompilationUnitElement unitElement = unit.element;
var typeProvider = unitElement.context.typeProvider;
@@ -5609,7 +5652,7 @@
''');
String fTypeString = '(int, {b: String, c: bool}) → double';
- result = await driver.getResult(testFile);
+ await resolveTestFile();
FunctionDeclaration fDeclaration = result.unit.declarations[0];
FunctionElement fElement = fDeclaration.element;
@@ -5680,7 +5723,7 @@
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
CompilationUnitElement unitElement = unit.element;
var typeProvider = unitElement.context.typeProvider;
@@ -5713,7 +5756,7 @@
class C<T extends A, U extends List<A>, V> {}
''';
addTestFile(content);
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
CompilationUnitElement unitElement = unit.element;
var typeProvider = unitElement.context.typeProvider;
@@ -5787,7 +5830,7 @@
try {} on int {}
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -5889,7 +5932,7 @@
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
CompilationUnitElement unitElement = unit.element;
var typeProvider = unitElement.context.typeProvider;
@@ -5929,7 +5972,7 @@
b.A a1;
c.A a2;
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
ImportElement bImport = unit.element.library.imports[0];
@@ -5974,7 +6017,7 @@
}
typedef void F(int p);
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
CompilationUnit unit = result.unit;
var typeProvider = unit.element.context.typeProvider;
@@ -5998,6 +6041,353 @@
}
}
+ test_unresolved_assignment_left_identifier_compound() async {
+ addTestFile(r'''
+int b;
+main() {
+ a += b;
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var assignment = findNode.assignment('a += b');
+ assertElementNull(assignment);
+ assertTypeDynamic(assignment);
+
+ assertElementNull(assignment.leftHandSide);
+ assertTypeDynamic(assignment.leftHandSide);
+
+ assertElement(assignment.rightHandSide, findElement.topGet('b'));
+ assertType(assignment.rightHandSide, 'int');
+ }
+
+ test_unresolved_assignment_left_identifier_simple() async {
+ addTestFile(r'''
+int b;
+main() {
+ a = b;
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var assignment = findNode.assignment('a = b');
+ assertElementNull(assignment);
+ if (useCFE) {
+ assertType(assignment, 'int');
+ }
+
+ assertElementNull(assignment.leftHandSide);
+ assertTypeDynamic(assignment.leftHandSide);
+
+ assertElement(assignment.rightHandSide, findElement.topGet('b'));
+ assertType(assignment.rightHandSide, 'int');
+ }
+
+ test_unresolved_assignment_left_indexed1_simple() async {
+ addTestFile(r'''
+int c;
+main() {
+ a[b] = c;
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var assignment = findNode.assignment('a[b] = c');
+ assertElementNull(assignment);
+ if (useCFE) {
+ assertType(assignment, 'int');
+ }
+
+ IndexExpression indexed = assignment.leftHandSide;
+ assertElementNull(indexed);
+ assertTypeDynamic(indexed);
+
+ assertElementNull(indexed.target);
+ assertTypeDynamic(indexed.target);
+
+ assertElementNull(indexed.index);
+ assertTypeDynamic(indexed.index);
+
+ assertElement(assignment.rightHandSide, findElement.topGet('c'));
+ assertType(assignment.rightHandSide, 'int');
+ }
+
+ test_unresolved_assignment_left_indexed2_simple() async {
+ addTestFile(r'''
+A a;
+int c;
+main() {
+ a[b] = c;
+}
+class A {}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var assignment = findNode.assignment('a[b] = c');
+ assertElementNull(assignment);
+ if (useCFE) {
+ assertType(assignment, 'int');
+ }
+
+ IndexExpression indexed = assignment.leftHandSide;
+ assertElementNull(indexed);
+ assertTypeDynamic(indexed);
+
+ assertElement(indexed.target, findElement.topGet('a'));
+ assertType(indexed.target, 'A');
+
+ assertElementNull(indexed.index);
+ assertTypeDynamic(indexed.index);
+
+ assertElement(assignment.rightHandSide, findElement.topGet('c'));
+ assertType(assignment.rightHandSide, 'int');
+ }
+
+ test_unresolved_assignment_left_indexed3_simple() async {
+ addTestFile(r'''
+A a;
+int c;
+main() {
+ a[b] = c;
+}
+class A {
+ operator[]=(double b) {}
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var assignment = findNode.assignment('a[b] = c');
+ assertElementNull(assignment);
+ if (useCFE) {
+ assertType(assignment, 'int');
+ }
+
+ IndexExpression indexed = assignment.leftHandSide;
+ assertElement(indexed, findElement.method('[]='));
+ assertTypeDynamic(indexed);
+
+ assertElement(indexed.target, findElement.topGet('a'));
+ assertType(indexed.target, 'A');
+
+ assertElementNull(indexed.index);
+ assertTypeDynamic(indexed.index);
+
+ assertElement(assignment.rightHandSide, findElement.topGet('c'));
+ assertType(assignment.rightHandSide, 'int');
+ }
+
+ test_unresolved_assignment_left_indexed4_simple() async {
+ addTestFile(r'''
+double b;
+int c;
+main() {
+ a[b] = c;
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var assignment = findNode.assignment('a[b] = c');
+ assertElementNull(assignment);
+ if (useCFE) {
+ assertType(assignment, 'int');
+ }
+
+ IndexExpression indexed = assignment.leftHandSide;
+ assertElementNull(indexed);
+ assertTypeDynamic(indexed);
+
+ assertElementNull(indexed.target);
+ assertTypeDynamic(indexed.target);
+
+ assertElement(indexed.index, findElement.topGet('b'));
+ assertType(indexed.index, 'double');
+
+ assertElement(assignment.rightHandSide, findElement.topGet('c'));
+ assertType(assignment.rightHandSide, 'int');
+ }
+
+ test_unresolved_assignment_left_prefixed1_simple() async {
+ addTestFile(r'''
+int c;
+main() {
+ a.b = c;
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var assignment = findNode.assignment('a.b = c');
+ assertElementNull(assignment);
+ if (useCFE) {
+ assertType(assignment, 'int');
+ }
+
+ PrefixedIdentifier prefixed = assignment.leftHandSide;
+ assertElementNull(prefixed);
+ assertTypeDynamic(prefixed);
+
+ assertElementNull(prefixed.prefix);
+ assertTypeDynamic(prefixed.prefix);
+
+ assertElementNull(prefixed.identifier);
+ assertTypeDynamic(prefixed.identifier);
+
+ assertElement(assignment.rightHandSide, findElement.topGet('c'));
+ assertType(assignment.rightHandSide, 'int');
+ }
+
+ test_unresolved_assignment_left_prefixed2_simple() async {
+ addTestFile(r'''
+class A {}
+A a;
+int c;
+main() {
+ a.b = c;
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var assignment = findNode.assignment('a.b = c');
+ assertElementNull(assignment);
+ if (useCFE) {
+ assertType(assignment, 'int');
+ }
+
+ PrefixedIdentifier prefixed = assignment.leftHandSide;
+ assertElementNull(prefixed);
+ assertTypeDynamic(prefixed);
+
+ assertElement(prefixed.prefix, findElement.topGet('a'));
+ assertType(prefixed.prefix, 'A');
+
+ assertElementNull(prefixed.identifier);
+ assertTypeDynamic(prefixed.identifier);
+
+ assertElement(assignment.rightHandSide, findElement.topGet('c'));
+ assertType(assignment.rightHandSide, 'int');
+ }
+
+ test_unresolved_assignment_left_property1_simple() async {
+ addTestFile(r'''
+int d;
+main() {
+ a.b.c = d;
+}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var assignment = findNode.assignment('a.b.c = d');
+ assertElementNull(assignment);
+ if (useCFE) {
+ assertType(assignment, 'int');
+ }
+
+ PropertyAccess access = assignment.leftHandSide;
+ assertTypeDynamic(access);
+
+ PrefixedIdentifier prefixed = access.target;
+ assertElementNull(prefixed);
+ assertTypeDynamic(prefixed);
+
+ assertElementNull(prefixed.prefix);
+ assertTypeDynamic(prefixed.prefix);
+
+ assertElementNull(prefixed.identifier);
+ assertTypeDynamic(prefixed.identifier);
+
+ assertElementNull(access.propertyName);
+ assertTypeDynamic(access.propertyName);
+
+ assertElement(assignment.rightHandSide, findElement.topGet('d'));
+ assertType(assignment.rightHandSide, 'int');
+ }
+
+ test_unresolved_assignment_left_property2_simple() async {
+ addTestFile(r'''
+A a;
+int d;
+main() {
+ a.b.c = d;
+}
+class A {}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+
+ var assignment = findNode.assignment('a.b.c = d');
+ assertElementNull(assignment);
+ if (useCFE) {
+ assertType(assignment, 'int');
+ }
+
+ PropertyAccess access = assignment.leftHandSide;
+ assertTypeDynamic(access);
+
+ PrefixedIdentifier prefixed = access.target;
+ assertElementNull(prefixed);
+ assertTypeDynamic(prefixed);
+
+ assertElement(prefixed.prefix, findElement.topGet('a'));
+ assertType(prefixed.prefix, 'A');
+
+ assertElementNull(prefixed.identifier);
+ assertTypeDynamic(prefixed.identifier);
+
+ assertElementNull(access.propertyName);
+ assertTypeDynamic(access.propertyName);
+
+ assertElement(assignment.rightHandSide, findElement.topGet('d'));
+ assertType(assignment.rightHandSide, 'int');
+ }
+
+ test_unresolved_assignment_left_property3_simple() async {
+ addTestFile(r'''
+A a;
+int d;
+main() {
+ a.b.c = d;
+}
+class A { B b; }
+class B {}
+''');
+ await resolveTestFile();
+ expect(result.errors, isNotEmpty);
+ var bElement = findElement.field('b');
+
+ var assignment = findNode.assignment('a.b.c = d');
+ assertElementNull(assignment);
+ if (useCFE) {
+ assertType(assignment, 'int');
+ }
+
+ PropertyAccess access = assignment.leftHandSide;
+ assertTypeDynamic(access);
+
+ PrefixedIdentifier prefixed = access.target;
+ assertElement(prefixed, bElement.getter);
+ assertType(prefixed, 'B');
+
+ assertElement(prefixed.prefix, findElement.topGet('a'));
+ assertType(prefixed.prefix, 'A');
+
+ assertElement(prefixed.identifier, bElement.getter);
+ assertType(prefixed.identifier, 'B');
+
+ assertElementNull(access.propertyName);
+ assertTypeDynamic(access.propertyName);
+
+ assertElement(assignment.rightHandSide, findElement.topGet('d'));
+ assertType(assignment.rightHandSide, 'int');
+ }
+
test_unresolved_instanceCreation_name_11() async {
addTestFile(r'''
int arg1, arg2;
@@ -6005,7 +6395,7 @@
new Foo<int, double>(arg1, p2: arg2);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
List<Statement> statements = _getMainStatements(result);
@@ -6043,7 +6433,7 @@
new foo.Bar<int, double>(arg1, p2: arg2);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
List<Statement> statements = _getMainStatements(result);
@@ -6094,7 +6484,7 @@
new foo.Bar<int, double>(arg1, p2: arg2);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
var unitElement = result.unit.element;
@@ -6145,7 +6535,7 @@
new foo.Bar<int, double>.baz(arg1, p2: arg2);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
List<Statement> statements = _getMainStatements(result);
@@ -6200,7 +6590,7 @@
new foo.Bar<int, double>.baz(arg1, p2: arg2);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
var unitElement = result.unit.element;
@@ -6255,7 +6645,7 @@
new foo.Random<int, double>.baz(arg1, p2: arg2);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
var unitElement = result.unit.element;
@@ -6306,7 +6696,7 @@
bar<int, double>(arg1, p2: arg2);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
List<Statement> statements = _getMainStatements(result);
@@ -6335,7 +6725,7 @@
foo.bar<int, double>(arg1, p2: arg2);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
TopLevelVariableElement foo = _getTopLevelVariable(result, 'foo');
@@ -6378,7 +6768,7 @@
foo.bar<int, double>(arg1, p2: arg2);
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
List<Statement> statements = _getMainStatements(result);
@@ -6409,7 +6799,7 @@
foo.bar;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
TopLevelVariableElement foo = _getTopLevelVariable(result, 'foo');
@@ -6436,7 +6826,7 @@
foo.bar;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
List<Statement> statements = _getMainStatements(result);
@@ -6461,7 +6851,7 @@
foo.bar.baz;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
List<Statement> statements = _getMainStatements(result);
@@ -6496,7 +6886,7 @@
foo.bar.baz;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
TopLevelVariableElement foo = _getTopLevelVariable(result, 'foo');
@@ -6533,7 +6923,7 @@
foo.hashCode.baz;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
PropertyAccessorElement objectHashCode =
@@ -6571,7 +6961,7 @@
foo;
}
''');
- result = await driver.getResult(testFile);
+ await resolveTestFile();
expect(result.errors, isNotEmpty);
List<Statement> statements = _getMainStatements(result);
@@ -6720,3 +7110,70 @@
*/
String _p(String path) => provider.convertPath(path);
}
+
+class FindElement {
+ final AnalysisResult result;
+
+ FindElement(this.result);
+
+ CompilationUnitElement get unitElement => result.unit.element;
+
+ FieldElement field(String name) {
+ for (var class_ in unitElement.types) {
+ for (var field in class_.fields) {
+ if (field.name == name) {
+ return field;
+ }
+ }
+ }
+ fail('Not found class field: $name');
+ }
+
+ MethodElement method(String name) {
+ for (var class_ in unitElement.types) {
+ for (var method in class_.methods) {
+ if (method.name == name) {
+ return method;
+ }
+ }
+ }
+ fail('Not found class method: $name');
+ }
+
+ PropertyAccessorElement topGet(String name) {
+ return topVar(name).getter;
+ }
+
+ TopLevelVariableElement topVar(String name) {
+ for (var variable in unitElement.topLevelVariables) {
+ if (variable.name == name) {
+ return variable;
+ }
+ }
+ fail('Not found top-level variable: $name');
+ }
+}
+
+class FindNode {
+ final AnalysisResult result;
+
+ FindNode(this.result);
+
+ AssignmentExpression assignment(String search) {
+ return _node(search).getAncestor((n) => n is AssignmentExpression);
+ }
+
+ SimpleIdentifier simple(String search) {
+ return _node(search);
+ }
+
+ AstNode _node(String search) {
+ var content = result.content;
+ var index = content.indexOf(search);
+ if (content.indexOf(search, index + 1) != -1) {
+ fail('The pattern |$search| is not unique in:\n$content');
+ }
+ expect(index, greaterThanOrEqualTo(0));
+ return new NodeLocator(index).searchWithin(result.unit);
+ }
+}