| Index: pkg/analyzer/test/src/summary/top_level_inference_test.dart
|
| diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
|
| index 7d2be5059875cc4443e6f82f9e91629f0e8eca61..999e1ceb2e3fffc6ce8d9b30fff3d7772f86d5a3 100644
|
| --- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
|
| +++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
|
| @@ -9,11 +9,13 @@ import 'package:analyzer/src/dart/analysis/driver.dart';
|
| import 'package:test_reflective_loader/test_reflective_loader.dart';
|
|
|
| import '../dart/analysis/base.dart';
|
| +import '../task/strong/strong_test_helper.dart';
|
| import 'element_text.dart';
|
|
|
| main() {
|
| defineReflectiveSuite(() {
|
| defineReflectiveTests(TopLevelInferenceTest);
|
| + defineReflectiveTests(TopLevelInferenceErrorsTest);
|
| // defineReflectiveTests(ApplyCheckElementTextReplacements);
|
| });
|
| }
|
| @@ -26,6 +28,326 @@ class ApplyCheckElementTextReplacements {
|
| }
|
|
|
| @reflectiveTest
|
| +class TopLevelInferenceErrorsTest extends AbstractStrongTest {
|
| + @override
|
| + bool get enableNewAnalysisDriver => true;
|
| +
|
| + test_initializer_additive() async {
|
| + await _assertErrorOnlyLeft(['+', '-']);
|
| + }
|
| +
|
| + test_initializer_assign() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +var t1 = /*error:TOP_LEVEL_UNSUPPORTED*/a += 1;
|
| +var t2 = (/*error:TOP_LEVEL_UNSUPPORTED*/a = 2);
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_binary_onlyLeft() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +var t = (/*error:TOP_LEVEL_UNSUPPORTED*/a = 1) + (a = 2);
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_bitwise() async {
|
| + await _assertErrorOnlyLeft(['&', '|', '^']);
|
| + }
|
| +
|
| + test_initializer_boolean() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +var t1 = ((a = 1) == 0) || ((a = 2) == 0);
|
| +var t2 = ((a = 1) == 0) && ((a = 2) == 0);
|
| +var t3 = !((a = 1) == 0);
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_cascade() async {
|
| + var content = r'''
|
| +var a = 0;
|
| +var t = (/*error:TOP_LEVEL_UNSUPPORTED*/a = 1)..isEven;
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_classField_assign() async {
|
| + var content = r'''
|
| +class A {
|
| + static var a = 1;
|
| + static var t = /*error:TOP_LEVEL_UNSUPPORTED*/a += 1;
|
| +}
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_conditional() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +var b = true;
|
| +var t = b ?
|
| + (/*error:TOP_LEVEL_UNSUPPORTED*/a = 1) :
|
| + (/*error:TOP_LEVEL_UNSUPPORTED*/a = 2);
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_dependencyCycle() async {
|
| + var content = r'''
|
| +var a = /*error:TOP_LEVEL_CYCLE*/b;
|
| +var b = /*error:TOP_LEVEL_CYCLE*/a;
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_equality() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +var t1 = ((a = 1) == 0) == ((a = 2) == 0);
|
| +var t2 = ((a = 1) == 0) != ((a = 2) == 0);
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_functionLiteral_blockBody() async {
|
| + var content = r'''
|
| +var t = /*error:TOP_LEVEL_FUNCTION_LITERAL_BLOCK*/
|
| + /*info:INFERRED_TYPE_CLOSURE*/
|
| + (int p) {};
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_functionLiteral_expressionBody() async {
|
| + var content = r'''
|
| +var a = 0;
|
| +var t = (int p) => (/*error:TOP_LEVEL_UNSUPPORTED*/a = 1);
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_functionLiteral_parameters_withoutType() async {
|
| + var content = r'''
|
| +var t = (int a,
|
| + /*error:TOP_LEVEL_FUNCTION_LITERAL_PARAMETER*/b,
|
| + int c,
|
| + /*error:TOP_LEVEL_FUNCTION_LITERAL_PARAMETER*/d) => 0;
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_hasTypeAnnotation() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +int t = (a = 1);
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_identifier() async {
|
| + var content = r'''
|
| +int top_function() => 0;
|
| +var top_variable = 0;
|
| +int get top_getter => 0;
|
| +class A {
|
| + static var static_field = 0;
|
| + static int get static_getter => 0;
|
| + static int static_method() => 0;
|
| + int instance_method() => 0;
|
| +}
|
| +var t1 = top_function;
|
| +var t2 = top_variable;
|
| +var t3 = top_getter;
|
| +var t4 = A.static_field;
|
| +var t5 = A.static_getter;
|
| +var t6 = A.static_method;
|
| +var t7 = new A().instance_method;
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_identifier_error() async {
|
| + var content = r'''
|
| +var a = 0;
|
| +var b = (/*error:TOP_LEVEL_UNSUPPORTED*/a = 1);
|
| +var c = /*error:TOP_LEVEL_IDENTIFIER_NO_TYPE*/b;
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_ifNull() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +var t = /*error:TOP_LEVEL_UNSUPPORTED*/a ?? 2;
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_instanceCreation_withoutTypeParameters() async {
|
| + var content = r'''
|
| +class A {}
|
| +var t = new A();
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_instanceCreation_withTypeParameters() async {
|
| + var content = r'''
|
| +class A<T> {}
|
| +var t1 = new /*error:TOP_LEVEL_TYPE_ARGUMENTS*/A();
|
| +var t2 = new A<int>();
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_instanceGetter() async {
|
| + var content = r'''
|
| +class A {
|
| + int f = 1;
|
| +}
|
| +var a = new A()./*error:TOP_LEVEL_INSTANCE_GETTER*/f;
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_methodInvocation_function() async {
|
| + var content = r'''
|
| +int f1() => null;
|
| +T f2<T>() => null;
|
| +var t1 = f1();
|
| +var t2 = /*error:TOP_LEVEL_TYPE_ARGUMENTS*/f2();
|
| +var t3 = f2<int>();
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_methodInvocation_method() async {
|
| + var content = r'''
|
| +class A {
|
| + int m1() => null;
|
| + T m2<T>() => null;
|
| +}
|
| +var a = new A();
|
| +var t1 = a.m1();
|
| +var t2 = a./*error:TOP_LEVEL_TYPE_ARGUMENTS*/m2();
|
| +var t3 = a.m2<int>();
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_multiplicative() async {
|
| + await _assertErrorOnlyLeft(['*', '/', '%', '~/']);
|
| + }
|
| +
|
| + test_initializer_postfixIncDec() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +var t1 = a++;
|
| +var t2 = a--;
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_prefixIncDec() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +var t1 = ++a;
|
| +var t2 = --a;
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_relational() async {
|
| + await _assertErrorOnlyLeft(['>', '>=', '<', '<=']);
|
| + }
|
| +
|
| + test_initializer_shift() async {
|
| + await _assertErrorOnlyLeft(['<<', '>>']);
|
| + }
|
| +
|
| + test_initializer_typedList() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +var t = <int>[a = 1];
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_typedMap() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +var t = <int, int>{(a = 1) : (a = 2)};
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_untypedList() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +var t = /*info:INFERRED_TYPE_LITERAL*/[
|
| + /*error:TOP_LEVEL_UNSUPPORTED*/a = 1,
|
| + 2, 3];
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_initializer_untypedMap() async {
|
| + var content = r'''
|
| +var a = 1;
|
| +var t = /*info:INFERRED_TYPE_LITERAL*/{
|
| + (/*error:TOP_LEVEL_UNSUPPORTED*/a = 1) :
|
| + (/*error:TOP_LEVEL_UNSUPPORTED*/a = 2)};
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + test_override_conflictFieldType() async {
|
| + var content = r'''
|
| +abstract class A {
|
| + int aaa;
|
| +}
|
| +abstract class B {
|
| + String aaa;
|
| +}
|
| +class C implements A, B {
|
| + /*error:INVALID_METHOD_OVERRIDE*/var aaa;
|
| +}
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + @failingTest
|
| + test_override_conflictParameterType_method() async {
|
| + var content = r'''
|
| +abstract class A {
|
| + void mmm(int a);
|
| +}
|
| +abstract class B {
|
| + void mmm(String a);
|
| +}
|
| +class C implements A, B {
|
| + void mmm(/*error:TOP_LEVEL_INFERENCE_ERROR*/a) {}
|
| +}
|
| +''';
|
| + await checkFile(content);
|
| + }
|
| +
|
| + Future<Null> _assertErrorOnlyLeft(List<String> operators) async {
|
| + var err = '/*error:TOP_LEVEL_UNSUPPORTED*/';
|
| + String code = 'var a = 1;\n';
|
| + for (var i = 0; i < operators.length; i++) {
|
| + String operator = operators[i];
|
| + code += 'var t$i = (${err}a = 1) $operator (a = 2);\n';
|
| + }
|
| + await checkFile(code);
|
| + }
|
| +}
|
| +
|
| +@reflectiveTest
|
| class TopLevelInferenceTest extends BaseAnalysisDriverTest {
|
| void addFile(String path, String code) {
|
| provider.newFile(_p(path), code);
|
| @@ -139,6 +461,19 @@ num V;
|
| ''');
|
| }
|
|
|
| + test_initializer_equality() async {
|
| + var library = await _encodeDecodeLibrary(r'''
|
| +var vEq = 1 == 2;
|
| +var vNotEq = 1 != 2;
|
| +''');
|
| + checkElementText(
|
| + library,
|
| + r'''
|
| +bool vEq;
|
| +bool vNotEq;
|
| +''');
|
| + }
|
| +
|
| test_initializer_error_assign() async {
|
| var library = await _encodeDecodeLibrary(r'''
|
| var a = 1;
|
| @@ -930,6 +1265,22 @@ int vFloorDivide;
|
| ''');
|
| }
|
|
|
| + @failingTest
|
| + test_initializer_onlyLeft() async {
|
| + var library = await _encodeDecodeLibrary(r'''
|
| +var a = 1;
|
| +var vEq = a == ((a = 2) == 0);
|
| +var vNotEq = a != ((a = 2) == 0);
|
| +''');
|
| + checkElementText(
|
| + library,
|
| + r'''
|
| +int a;
|
| +bool vEq;
|
| +bool vNotEq;
|
| +''');
|
| + }
|
| +
|
| test_initializer_parenthesized() async {
|
| var library = await _encodeDecodeLibrary(r'''
|
| var V = (42);
|
|
|