| Index: pkg/analysis_services/test/correction/fix_test.dart
|
| diff --git a/pkg/analysis_services/test/correction/fix_test.dart b/pkg/analysis_services/test/correction/fix_test.dart
|
| index d0e4f12e186512ed9f2aca38b6503d8866684bf8..f5f688f6888b28b7ea0d1dfb807f24641bf4289e 100644
|
| --- a/pkg/analysis_services/test/correction/fix_test.dart
|
| +++ b/pkg/analysis_services/test/correction/fix_test.dart
|
| @@ -59,7 +59,7 @@ class FixProcessorTest extends AbstractSingleUnitTest {
|
|
|
| void assertNoFix(FixKind kind) {
|
| AnalysisError error = _findErrorToFix();
|
| - List<Fix> fixes = computeFixes(searchEngine, testFile, testUnit, error);
|
| + List<Fix> fixes = computeFixes(searchEngine, testUnit, error);
|
| for (Fix fix in fixes) {
|
| if (fix.kind == kind) {
|
| throw fail('Unexpected fix $kind in\n${fixes.join('\n')}');
|
| @@ -242,6 +242,94 @@ class B extends A {
|
| assertNoFix(FixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION);
|
| }
|
|
|
| + void test_createConstructorSuperImplicit() {
|
| + _indexTestUnit('''
|
| +class A {
|
| + A(p1, int p2, List<String> p3, [int p4]);
|
| +}
|
| +class B extends A {
|
| + int existingField;
|
| +
|
| + void existingMethod() {}
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_CONSTRUCTOR_SUPER, '''
|
| +class A {
|
| + A(p1, int p2, List<String> p3, [int p4]);
|
| +}
|
| +class B extends A {
|
| + int existingField;
|
| +
|
| + B(p1, int p2, List<String> p3) : super(p1, p2, p3);
|
| +
|
| + void existingMethod() {}
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_createConstructorSuperImplicit_fieldInitializer() {
|
| + _indexTestUnit('''
|
| +class A {
|
| + int _field;
|
| + A(this._field);
|
| +}
|
| +class B extends A {
|
| + int existingField;
|
| +
|
| + void existingMethod() {}
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_CONSTRUCTOR_SUPER, '''
|
| +class A {
|
| + int _field;
|
| + A(this._field);
|
| +}
|
| +class B extends A {
|
| + int existingField;
|
| +
|
| + B(int field) : super(field);
|
| +
|
| + void existingMethod() {}
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_createConstructorSuperImplicit_named() {
|
| + _indexTestUnit('''
|
| +class A {
|
| + A.named(p1, int p2);
|
| +}
|
| +class B extends A {
|
| + int existingField;
|
| +
|
| + void existingMethod() {}
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_CONSTRUCTOR_SUPER, '''
|
| +class A {
|
| + A.named(p1, int p2);
|
| +}
|
| +class B extends A {
|
| + int existingField;
|
| +
|
| + B.named(p1, int p2) : super.named(p1, p2);
|
| +
|
| + void existingMethod() {}
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_createConstructorSuperImplicit_private() {
|
| + _indexTestUnit('''
|
| +class A {
|
| + A._named(p);
|
| +}
|
| +class B extends A {
|
| +}
|
| +''');
|
| + assertNoFix(FixKind.CREATE_CONSTRUCTOR_SUPER);
|
| + }
|
| +
|
| void test_createConstructor_insteadOfSyntheticDefault() {
|
| _indexTestUnit('''
|
| class A {
|
| @@ -290,6 +378,455 @@ main() {
|
| ''');
|
| }
|
|
|
| + void test_createMissingOverrides_functionType() {
|
| + _indexTestUnit('''
|
| +abstract class A {
|
| + forEach(int f(double p1, String p2));
|
| +}
|
| +
|
| +class B extends A {
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
|
| +abstract class A {
|
| + forEach(int f(double p1, String p2));
|
| +}
|
| +
|
| +class B extends A {
|
| + @override
|
| + forEach(int f(double p1, String p2)) {
|
| + // TODO: implement forEach
|
| + }
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_createMissingOverrides_generics() {
|
| + _indexTestUnit('''
|
| +class Iterator<T> {
|
| +}
|
| +
|
| +abstract class IterableMixin<T> {
|
| + Iterator<T> get iterator;
|
| +}
|
| +
|
| +class Test extends IterableMixin<int> {
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
|
| +class Iterator<T> {
|
| +}
|
| +
|
| +abstract class IterableMixin<T> {
|
| + Iterator<T> get iterator;
|
| +}
|
| +
|
| +class Test extends IterableMixin<int> {
|
| + // TODO: implement iterator
|
| + @override
|
| + Iterator<int> get iterator => null;
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_createMissingOverrides_getter() {
|
| + _indexTestUnit('''
|
| +abstract class A {
|
| + get g1;
|
| + int get g2;
|
| +}
|
| +
|
| +class B extends A {
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
|
| +abstract class A {
|
| + get g1;
|
| + int get g2;
|
| +}
|
| +
|
| +class B extends A {
|
| + // TODO: implement g1
|
| + @override
|
| + get g1 => null;
|
| +
|
| + // TODO: implement g2
|
| + @override
|
| + int get g2 => null;
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_createMissingOverrides_importPrefix() {
|
| + _indexTestUnit('''
|
| +import 'dart:async' as aaa;
|
| +abstract class A {
|
| + Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
|
| +}
|
| +
|
| +class B extends A {
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
|
| +import 'dart:async' as aaa;
|
| +abstract class A {
|
| + Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
|
| +}
|
| +
|
| +class B extends A {
|
| + @override
|
| + Map<aaa.Future, List<aaa.Future>> g(aaa.Future p) {
|
| + // TODO: implement g
|
| + }
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_createMissingOverrides_method() {
|
| + _indexTestUnit('''
|
| +abstract class A {
|
| + m1();
|
| + int m2();
|
| + String m3(int p1, double p2, Map<int, List<String>> p3);
|
| + String m4(p1, p2);
|
| + String m5(p1, [int p2 = 2, int p3, p4 = 4]);
|
| + String m6(p1, {int p2: 2, int p3, p4: 4});
|
| +}
|
| +
|
| +class B extends A {
|
| +}
|
| +''');
|
| + String expectedCode = '''
|
| +abstract class A {
|
| + m1();
|
| + int m2();
|
| + String m3(int p1, double p2, Map<int, List<String>> p3);
|
| + String m4(p1, p2);
|
| + String m5(p1, [int p2 = 2, int p3, p4 = 4]);
|
| + String m6(p1, {int p2: 2, int p3, p4: 4});
|
| +}
|
| +
|
| +class B extends A {
|
| + @override
|
| + m1() {
|
| + // TODO: implement m1
|
| + }
|
| +
|
| + @override
|
| + int m2() {
|
| + // TODO: implement m2
|
| + }
|
| +
|
| + @override
|
| + String m3(int p1, double p2, Map<int, List<String>> p3) {
|
| + // TODO: implement m3
|
| + }
|
| +
|
| + @override
|
| + String m4(p1, p2) {
|
| + // TODO: implement m4
|
| + }
|
| +
|
| + @override
|
| + String m5(p1, [int p2 = 2, int p3, p4 = 4]) {
|
| + // TODO: implement m5
|
| + }
|
| +
|
| + @override
|
| + String m6(p1, {int p2: 2, int p3, p4: 4}) {
|
| + // TODO: implement m6
|
| + }
|
| +}
|
| +''';
|
| + assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, expectedCode);
|
| + // end position should be on "m1", not on "m2", "m3", etc
|
| + {
|
| + Position endPosition = change.endPosition;
|
| + expect(endPosition, isNotNull);
|
| + expect(endPosition.file, testFile);
|
| + int endOffset = endPosition.offset;
|
| + String endString = expectedCode.substring(endOffset, endOffset + 25);
|
| + expect(endString, contains('m1'));
|
| + expect(endString, isNot(contains('m2')));
|
| + expect(endString, isNot(contains('m3')));
|
| + expect(endString, isNot(contains('m4')));
|
| + expect(endString, isNot(contains('m5')));
|
| + expect(endString, isNot(contains('m6')));
|
| + }
|
| + }
|
| +
|
| + void test_createMissingOverrides_operator() {
|
| + _indexTestUnit('''
|
| +abstract class A {
|
| + int operator [](int index);
|
| + void operator []=(int index, String value);
|
| +}
|
| +
|
| +class B extends A {
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
|
| +abstract class A {
|
| + int operator [](int index);
|
| + void operator []=(int index, String value);
|
| +}
|
| +
|
| +class B extends A {
|
| + @override
|
| + int operator [](int index) {
|
| + // TODO: implement []
|
| + }
|
| +
|
| + @override
|
| + void operator []=(int index, String value) {
|
| + // TODO: implement []=
|
| + }
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_createMissingOverrides_setter() {
|
| + _indexTestUnit('''
|
| +abstract class A {
|
| + set s1(x);
|
| + set s2(int x);
|
| + void set s3(String x);
|
| +}
|
| +
|
| +class B extends A {
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
|
| +abstract class A {
|
| + set s1(x);
|
| + set s2(int x);
|
| + void set s3(String x);
|
| +}
|
| +
|
| +class B extends A {
|
| + @override
|
| + set s1(x) {
|
| + // TODO: implement s1
|
| + }
|
| +
|
| + @override
|
| + set s2(int x) {
|
| + // TODO: implement s2
|
| + }
|
| +
|
| + @override
|
| + void set s3(String x) {
|
| + // TODO: implement s3
|
| + }
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_createNoSuchMethod() {
|
| + _indexTestUnit('''
|
| +abstract class A {
|
| + m1();
|
| + int m2();
|
| +}
|
| +
|
| +class B extends A {
|
| + existing() {}
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_NO_SUCH_METHOD, '''
|
| +abstract class A {
|
| + m1();
|
| + int m2();
|
| +}
|
| +
|
| +class B extends A {
|
| + existing() {}
|
| +
|
| + noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_creationFunction_forFunctionType_cascadeSecond() {
|
| + _indexTestUnit('''
|
| +class A {
|
| + B ma() => null;
|
| +}
|
| +class B {
|
| + useFunction(int g(double a, String b)) {}
|
| +}
|
| +
|
| +main() {
|
| + A a = new A();
|
| + a..ma().useFunction(test);
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_FUNCTION, '''
|
| +class A {
|
| + B ma() => null;
|
| +}
|
| +class B {
|
| + useFunction(int g(double a, String b)) {}
|
| +}
|
| +
|
| +main() {
|
| + A a = new A();
|
| + a..ma().useFunction(test);
|
| +}
|
| +
|
| +int test(double a, String b) {
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_creationFunction_forFunctionType_dynamicArgument() {
|
| + _indexTestUnit('''
|
| +main() {
|
| + useFunction(test);
|
| +}
|
| +useFunction(int g(a, b)) {}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_FUNCTION, '''
|
| +main() {
|
| + useFunction(test);
|
| +}
|
| +useFunction(int g(a, b)) {}
|
| +
|
| +int test(a, b) {
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_creationFunction_forFunctionType_function() {
|
| + _indexTestUnit('''
|
| +main() {
|
| + useFunction(test);
|
| +}
|
| +useFunction(int g(double a, String b)) {}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_FUNCTION, '''
|
| +main() {
|
| + useFunction(test);
|
| +}
|
| +useFunction(int g(double a, String b)) {}
|
| +
|
| +int test(double a, String b) {
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_creationFunction_forFunctionType_method_enclosingClass_static() {
|
| + _indexTestUnit('''
|
| +class A {
|
| + static foo() {
|
| + useFunction(test);
|
| + }
|
| +}
|
| +useFunction(int g(double a, String b)) {}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_METHOD, '''
|
| +class A {
|
| + static foo() {
|
| + useFunction(test);
|
| + }
|
| +
|
| + static int test(double a, String b) {
|
| + }
|
| +}
|
| +useFunction(int g(double a, String b)) {}
|
| +''');
|
| + }
|
| +
|
| + void test_creationFunction_forFunctionType_method_enclosingClass_static2() {
|
| + _indexTestUnit('''
|
| +class A {
|
| + var f;
|
| + A() : f = useFunction(test);
|
| +}
|
| +useFunction(int g(double a, String b)) {}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_METHOD, '''
|
| +class A {
|
| + var f;
|
| + A() : f = useFunction(test);
|
| +
|
| + static int test(double a, String b) {
|
| + }
|
| +}
|
| +useFunction(int g(double a, String b)) {}
|
| +''');
|
| + }
|
| +
|
| + void test_creationFunction_forFunctionType_method_targetClass() {
|
| + _indexTestUnit('''
|
| +main(A a) {
|
| + useFunction(a.test);
|
| +}
|
| +class A {
|
| +}
|
| +useFunction(int g(double a, String b)) {}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_METHOD, '''
|
| +main(A a) {
|
| + useFunction(a.test);
|
| +}
|
| +class A {
|
| + int test(double a, String b) {
|
| + }
|
| +}
|
| +useFunction(int g(double a, String b)) {}
|
| +''');
|
| + }
|
| +
|
| + void
|
| + test_creationFunction_forFunctionType_method_targetClass_hasOtherMember() {
|
| + _indexTestUnit('''
|
| +main(A a) {
|
| + useFunction(a.test);
|
| +}
|
| +class A {
|
| + m() {}
|
| +}
|
| +useFunction(int g(double a, String b)) {}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_METHOD, '''
|
| +main(A a) {
|
| + useFunction(a.test);
|
| +}
|
| +class A {
|
| + m() {}
|
| +
|
| + int test(double a, String b) {
|
| + }
|
| +}
|
| +useFunction(int g(double a, String b)) {}
|
| +''');
|
| + }
|
| +
|
| + void test_creationFunction_forFunctionType_notFunctionType() {
|
| + _indexTestUnit('''
|
| +main(A a) {
|
| + useFunction(a.test);
|
| +}
|
| +typedef A();
|
| +useFunction(g) {}
|
| +''');
|
| + assertNoFix(FixKind.CREATE_METHOD);
|
| + assertNoFix(FixKind.CREATE_FUNCTION);
|
| + }
|
| +
|
| + void test_creationFunction_forFunctionType_unknownTarget() {
|
| + _indexTestUnit('''
|
| +main(A a) {
|
| + useFunction(a.test);
|
| +}
|
| +class A {
|
| +}
|
| +useFunction(g) {}
|
| +''');
|
| + assertNoFix(FixKind.CREATE_METHOD);
|
| + }
|
| +
|
| void test_expectedToken_semicolon() {
|
| _indexTestUnit('''
|
| main() {
|
| @@ -465,6 +1002,56 @@ const a = const A();
|
| ''');
|
| }
|
|
|
| + void test_undefinedMethod_createQualified_fromClass() {
|
| + _indexTestUnit('''
|
| +class A {
|
| +}
|
| +main() {
|
| + A.myUndefinedMethod();
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_METHOD, '''
|
| +class A {
|
| + static void myUndefinedMethod() {
|
| + }
|
| +}
|
| +main() {
|
| + A.myUndefinedMethod();
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_undefinedMethod_createQualified_fromClass_hasOtherMember() {
|
| + _indexTestUnit('''
|
| +class A {
|
| + foo() {}
|
| +}
|
| +main() {
|
| + A.myUndefinedMethod();
|
| +}
|
| +''');
|
| + assertHasFix(FixKind.CREATE_METHOD, '''
|
| +class A {
|
| + foo() {}
|
| +
|
| + static void myUndefinedMethod() {
|
| + }
|
| +}
|
| +main() {
|
| + A.myUndefinedMethod();
|
| +}
|
| +''');
|
| + }
|
| +
|
| + void test_undefinedMethod_createQualified_fromClass_unresolved() {
|
| + _indexTestUnit('''
|
| +main() {
|
| + NoSuchClass.myUndefinedMethod();
|
| +}
|
| +''');
|
| + assertNoFix(FixKind.CREATE_METHOD);
|
| + }
|
| +
|
| void test_useEffectiveIntegerDivision() {
|
| _indexTestUnit('''
|
| main() {
|
| @@ -496,7 +1083,7 @@ main() {
|
| * Computes fixes and verifies that there is a fix of the given kind.
|
| */
|
| Fix _assertHasFix(FixKind kind, AnalysisError error) {
|
| - List<Fix> fixes = computeFixes(searchEngine, testFile, testUnit, error);
|
| + List<Fix> fixes = computeFixes(searchEngine, testUnit, error);
|
| for (Fix fix in fixes) {
|
| if (fix.kind == kind) {
|
| return fix;
|
|
|