Index: pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart |
diff --git a/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart b/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c9a0794b016817738cc1ff8dc77b75b7928588da |
--- /dev/null |
+++ b/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart |
@@ -0,0 +1,641 @@ |
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
+// 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 'package:analyzer_plugin/protocol/protocol_common.dart'; |
+import 'package:analyzer_plugin/utilities/completion/completion_core.dart'; |
+import 'package:analyzer_plugin/utilities/completion/inherited_reference_contributor.dart'; |
+import 'package:test/test.dart'; |
+import 'package:test_reflective_loader/test_reflective_loader.dart'; |
+ |
+import 'completion_contributor_util.dart'; |
+ |
+main() { |
+ defineReflectiveSuite(() { |
+ defineReflectiveTests(InheritedReferenceContributorTest); |
+ }); |
+} |
+ |
+@reflectiveTest |
+class InheritedReferenceContributorTest extends DartCompletionContributorTest { |
+ @override |
+ bool get isNullExpectedReturnTypeConsideredDynamic => false; |
+ |
+ @override |
+ CompletionContributor createContributor() { |
+ return new InheritedReferenceContributor(); |
+ } |
+ |
+ /// Sanity check. Permutations tested in local_ref_contributor. |
+ test_ArgDefaults_inherited_method_with_required_named() async { |
+ addMetaPackageSource(); |
+ resolveSource( |
+ '/testB.dart', |
+ ''' |
+import 'package:meta/meta.dart'; |
+ |
+lib libB; |
+class A { |
+ bool foo(int bar, {bool boo, @required int baz}) => false; |
+}'''); |
+ addTestSource(''' |
+import "/testB.dart"; |
+class B extends A { |
+ b() => f^ |
+} |
+'''); |
+ await computeSuggestions(); |
+ |
+ assertSuggestMethod('foo', 'A', 'bool', |
+ defaultArgListString: 'bar, baz: null'); |
+ } |
+ |
+ test_AwaitExpression_inherited() async { |
+ // SimpleIdentifier AwaitExpression ExpressionStatement |
+ resolveSource( |
+ '/testB.dart', |
+ ''' |
+lib libB; |
+class A { |
+ Future y() async {return 0;} |
+}'''); |
+ addTestSource(''' |
+import "/testB.dart"; |
+class B extends A { |
+ Future a() async {return 0;} |
+ foo() async {await ^} |
+} |
+'''); |
+ |
+ await computeSuggestions(); |
+ expect(replacementOffset, completionOffset); |
+ expect(replacementLength, 0); |
+ assertNotSuggested('a'); |
+ assertNotSuggested('foo'); |
+ assertNotSuggested('B'); |
+ assertNotSuggested('A'); |
+ assertNotSuggested('Object'); |
+ assertSuggestMethod('y', 'A', 'dynamic'); |
+ } |
+ |
+ test_Block_inherited_imported() async { |
+ // Block BlockFunctionBody MethodDeclaration ClassDeclaration |
+ resolveSource( |
+ '/testB.dart', |
+ ''' |
+ lib B; |
+ class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; } |
+ class E extends F { var e1; e2() { } } |
+ class I { int i1; i2() { } } |
+ class M { var m1; int m2() { } }'''); |
+ addTestSource(''' |
+ import "/testB.dart"; |
+ class A extends E implements I with M {a() {^}}'''); |
+ await computeSuggestions(); |
+ expect(replacementOffset, completionOffset); |
+ expect(replacementLength, 0); |
+ assertSuggestField('e1', null); |
+ assertSuggestField('f1', null); |
+ assertSuggestField('i1', 'int'); |
+ assertSuggestField('m1', null); |
+ assertSuggestGetter('f3', null); |
+ assertSuggestSetter('f4'); |
+ assertSuggestMethod('e2', 'E', null); |
+ assertSuggestMethod('f2', 'F', null); |
+ assertSuggestMethod('i2', 'I', null); |
+ assertSuggestMethod('m2', 'M', 'int'); |
+ assertNotSuggested('=='); |
+ } |
+ |
+ test_Block_inherited_local() async { |
+ // Block BlockFunctionBody MethodDeclaration ClassDeclaration |
+ addTestSource(''' |
+class F { var f1; f2() { } get f3 => 0; set f4(fx) { } } |
+class E extends F { var e1; e2() { } } |
+class I { int i1; i2() { } } |
+class M { var m1; int m2() { } } |
+class A extends E implements I with M {a() {^}}'''); |
+ await computeSuggestions(); |
+ |
+ expect(replacementOffset, completionOffset); |
+ expect(replacementLength, 0); |
+ assertSuggestField('e1', null); |
+ assertSuggestField('f1', null); |
+ assertSuggestField('i1', 'int'); |
+ assertSuggestField('m1', null); |
+ assertSuggestGetter('f3', null); |
+ assertSuggestSetter('f4'); |
+ assertSuggestMethod('e2', 'E', null); |
+ assertSuggestMethod('f2', 'F', null); |
+ assertSuggestMethod('i2', 'I', null); |
+ assertSuggestMethod('m2', 'M', 'int'); |
+ } |
+ |
+ test_inherited() async { |
+ resolveSource( |
+ '/testB.dart', |
+ ''' |
+lib libB; |
+class A2 { |
+ int x; |
+ int y() {return 0;} |
+ int x2; |
+ int y2() {return 0;} |
+}'''); |
+ addTestSource(''' |
+import "/testB.dart"; |
+class A1 { |
+ int x; |
+ int y() {return 0;} |
+ int x1; |
+ int y1() {return 0;} |
+} |
+class B extends A1 with A2 { |
+ int a; |
+ int b() {return 0;} |
+ foo() {^} |
+} |
+'''); |
+ |
+ await computeSuggestions(); |
+ expect(replacementOffset, completionOffset); |
+ expect(replacementLength, 0); |
+ assertNotSuggested('Object'); |
+ assertNotSuggested('B'); |
+ assertNotSuggested('a'); |
+ assertNotSuggested('b'); |
+ assertNotSuggested('foo'); |
+ assertNotSuggested('A'); |
+ assertSuggestField('x', 'int'); |
+ assertSuggestMethod('y', 'A2', 'int'); |
+ assertSuggestField('x1', 'int'); |
+ assertSuggestMethod('y1', 'A1', 'int'); |
+ assertSuggestField('x2', 'int'); |
+ assertSuggestMethod('y2', 'A2', 'int'); |
+ } |
+ |
+ test_method_in_class() async { |
+ addTestSource(''' |
+class A { |
+ void m(x, int y) {} |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ assertNotSuggested('m'); |
+ } |
+ |
+ test_method_parameters_mixed_required_and_named() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+class A { |
+ void m(x, {int y}) {} |
+} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void'); |
+ expect(suggestion.parameterNames, hasLength(2)); |
+ expect(suggestion.parameterNames[0], 'x'); |
+ expect(suggestion.parameterTypes[0], 'dynamic'); |
+ expect(suggestion.parameterNames[1], 'y'); |
+ expect(suggestion.parameterTypes[1], 'int'); |
+ expect(suggestion.requiredParameterCount, 1); |
+ expect(suggestion.hasNamedParameters, true); |
+ } |
+ |
+ test_method_parameters_mixed_required_and_named_local() async { |
+ addTestSource(''' |
+class A { |
+ void m(x, {int y}) {} |
+} |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void'); |
+ expect(suggestion.parameterNames, hasLength(2)); |
+ expect(suggestion.parameterNames[0], 'x'); |
+ expect(suggestion.parameterTypes[0], 'dynamic'); |
+ expect(suggestion.parameterNames[1], 'y'); |
+ expect(suggestion.parameterTypes[1], 'int'); |
+ expect(suggestion.requiredParameterCount, 1); |
+ expect(suggestion.hasNamedParameters, true); |
+ } |
+ |
+ test_method_parameters_mixed_required_and_positional() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+class A { |
+ void m(x, [int y]) {} |
+} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void'); |
+ expect(suggestion.parameterNames, hasLength(2)); |
+ expect(suggestion.parameterNames[0], 'x'); |
+ expect(suggestion.parameterTypes[0], 'dynamic'); |
+ expect(suggestion.parameterNames[1], 'y'); |
+ expect(suggestion.parameterTypes[1], 'int'); |
+ expect(suggestion.requiredParameterCount, 1); |
+ expect(suggestion.hasNamedParameters, false); |
+ } |
+ |
+ test_method_parameters_mixed_required_and_positional_local() async { |
+ addTestSource(''' |
+class A { |
+ void m(x, [int y]) {} |
+} |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void'); |
+ expect(suggestion.parameterNames, hasLength(2)); |
+ expect(suggestion.parameterNames[0], 'x'); |
+ expect(suggestion.parameterTypes[0], 'dynamic'); |
+ expect(suggestion.parameterNames[1], 'y'); |
+ expect(suggestion.parameterTypes[1], 'int'); |
+ expect(suggestion.requiredParameterCount, 1); |
+ expect(suggestion.hasNamedParameters, false); |
+ } |
+ |
+ test_method_parameters_named() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+class A { |
+ void m({x, int y}) {} |
+} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void'); |
+ expect(suggestion.parameterNames, hasLength(2)); |
+ expect(suggestion.parameterNames[0], 'x'); |
+ expect(suggestion.parameterTypes[0], 'dynamic'); |
+ expect(suggestion.parameterNames[1], 'y'); |
+ expect(suggestion.parameterTypes[1], 'int'); |
+ expect(suggestion.requiredParameterCount, 0); |
+ expect(suggestion.hasNamedParameters, true); |
+ } |
+ |
+ test_method_parameters_named_local() async { |
+ addTestSource(''' |
+class A { |
+ void m({x, int y}) {} |
+} |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void'); |
+ expect(suggestion.parameterNames, hasLength(2)); |
+ expect(suggestion.parameterNames[0], 'x'); |
+ expect(suggestion.parameterTypes[0], 'dynamic'); |
+ expect(suggestion.parameterNames[1], 'y'); |
+ expect(suggestion.parameterTypes[1], 'int'); |
+ expect(suggestion.requiredParameterCount, 0); |
+ expect(suggestion.hasNamedParameters, true); |
+ } |
+ |
+ test_method_parameters_none() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+class A { |
+ void m() {} |
+} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void'); |
+ expect(suggestion.parameterNames, isEmpty); |
+ expect(suggestion.parameterTypes, isEmpty); |
+ expect(suggestion.requiredParameterCount, 0); |
+ expect(suggestion.hasNamedParameters, false); |
+ } |
+ |
+ test_method_parameters_none_local() async { |
+ addTestSource(''' |
+class A { |
+ void m() {} |
+} |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void'); |
+ expect(suggestion.parameterNames, isEmpty); |
+ expect(suggestion.parameterTypes, isEmpty); |
+ expect(suggestion.requiredParameterCount, 0); |
+ expect(suggestion.hasNamedParameters, false); |
+ } |
+ |
+ test_method_parameters_positional() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+class A { |
+ void m([x, int y]) {} |
+} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void'); |
+ expect(suggestion.parameterNames, hasLength(2)); |
+ expect(suggestion.parameterNames[0], 'x'); |
+ expect(suggestion.parameterTypes[0], 'dynamic'); |
+ expect(suggestion.parameterNames[1], 'y'); |
+ expect(suggestion.parameterTypes[1], 'int'); |
+ expect(suggestion.requiredParameterCount, 0); |
+ expect(suggestion.hasNamedParameters, false); |
+ } |
+ |
+ test_method_parameters_positional_local() async { |
+ addTestSource(''' |
+class A { |
+ void m([x, int y]) {} |
+} |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void'); |
+ expect(suggestion.parameterNames, hasLength(2)); |
+ expect(suggestion.parameterNames[0], 'x'); |
+ expect(suggestion.parameterTypes[0], 'dynamic'); |
+ expect(suggestion.parameterNames[1], 'y'); |
+ expect(suggestion.parameterTypes[1], 'int'); |
+ expect(suggestion.requiredParameterCount, 0); |
+ expect(suggestion.hasNamedParameters, false); |
+ } |
+ |
+ test_method_parameters_required() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+class A { |
+ void m(x, int y) {} |
+} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void'); |
+ expect(suggestion.parameterNames, hasLength(2)); |
+ expect(suggestion.parameterNames[0], 'x'); |
+ expect(suggestion.parameterTypes[0], 'dynamic'); |
+ expect(suggestion.parameterNames[1], 'y'); |
+ expect(suggestion.parameterTypes[1], 'int'); |
+ expect(suggestion.requiredParameterCount, 2); |
+ expect(suggestion.hasNamedParameters, false); |
+ } |
+ |
+ test_mixin_ordering() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+class B {} |
+class M1 { |
+ void m() {} |
+} |
+class M2 { |
+ void m() {} |
+} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class C extends B with M1, M2 { |
+ void f() { |
+ ^ |
+ } |
+} |
+'''); |
+ await computeSuggestions(); |
+ assertSuggestMethod('m', 'M1', 'void'); |
+ } |
+ |
+ test_no_parameters_field() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+class A { |
+ int x; |
+} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestField('x', 'int'); |
+ assertHasNoParameterInfo(suggestion); |
+ } |
+ |
+ test_no_parameters_getter() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+class A { |
+ int get x => null; |
+} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestGetter('x', 'int'); |
+ assertHasNoParameterInfo(suggestion); |
+ } |
+ |
+ test_no_parameters_setter() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+class A { |
+ set x(int value) {}; |
+} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ CompletionSuggestion suggestion = assertSuggestSetter('x'); |
+ assertHasNoParameterInfo(suggestion); |
+ } |
+ |
+ test_ouside_class() async { |
+ resolveSource( |
+ '/testB.dart', |
+ ''' |
+lib libB; |
+class A2 { |
+ int x; |
+ int y() {return 0;} |
+ int x2; |
+ int y2() {return 0;} |
+}'''); |
+ addTestSource(''' |
+import "/testB.dart"; |
+class A1 { |
+ int x; |
+ int y() {return 0;} |
+ int x1; |
+ int y1() {return 0;} |
+} |
+class B extends A1 with A2 { |
+ int a; |
+ int b() {return 0;} |
+} |
+foo() {^} |
+'''); |
+ |
+ await computeSuggestions(); |
+ expect(replacementOffset, completionOffset); |
+ expect(replacementLength, 0); |
+ assertNotSuggested('Object'); |
+ assertNotSuggested('B'); |
+ assertNotSuggested('a'); |
+ assertNotSuggested('b'); |
+ assertNotSuggested('foo'); |
+ assertNotSuggested('A'); |
+ assertNotSuggested('x'); |
+ assertNotSuggested('y'); |
+ assertNotSuggested('x1'); |
+ assertNotSuggested('y1'); |
+ assertNotSuggested('x2'); |
+ assertNotSuggested('y2'); |
+ } |
+ |
+ test_static_field() async { |
+ resolveSource( |
+ '/testB.dart', |
+ ''' |
+lib libB; |
+class A2 { |
+ int x; |
+ int y() {return 0;} |
+ int x2; |
+ int y2() {return 0;} |
+}'''); |
+ addTestSource(''' |
+import "/testB.dart"; |
+class A1 { |
+ int x; |
+ int y() {return 0;} |
+ int x1; |
+ int y1() {return 0;} |
+} |
+class B extends A1 with A2 { |
+ int a; |
+ int b() {return 0;} |
+ static foo = ^ |
+} |
+'''); |
+ |
+ await computeSuggestions(); |
+ expect(replacementOffset, completionOffset); |
+ expect(replacementLength, 0); |
+ assertNotSuggested('Object'); |
+ assertNotSuggested('B'); |
+ assertNotSuggested('a'); |
+ assertNotSuggested('b'); |
+ assertNotSuggested('foo'); |
+ assertNotSuggested('A'); |
+ assertNotSuggested('x'); |
+ assertNotSuggested('y'); |
+ assertNotSuggested('x1'); |
+ assertNotSuggested('y1'); |
+ assertNotSuggested('x2'); |
+ assertNotSuggested('y2'); |
+ } |
+ |
+ test_static_method() async { |
+ resolveSource( |
+ '/testB.dart', |
+ ''' |
+lib libB; |
+class A2 { |
+ int x; |
+ int y() {return 0;} |
+ int x2; |
+ int y2() {return 0;} |
+}'''); |
+ addTestSource(''' |
+import "/testB.dart"; |
+class A1 { |
+ int x; |
+ int y() {return 0;} |
+ int x1; |
+ int y1() {return 0;} |
+} |
+class B extends A1 with A2 { |
+ int a; |
+ int b() {return 0;} |
+ static foo() {^} |
+} |
+'''); |
+ |
+ await computeSuggestions(); |
+ expect(replacementOffset, completionOffset); |
+ expect(replacementLength, 0); |
+ assertNotSuggested('Object'); |
+ assertNotSuggested('B'); |
+ assertNotSuggested('a'); |
+ assertNotSuggested('b'); |
+ assertNotSuggested('foo'); |
+ assertNotSuggested('A'); |
+ assertNotSuggested('x'); |
+ assertNotSuggested('y'); |
+ assertNotSuggested('x1'); |
+ assertNotSuggested('y1'); |
+ assertNotSuggested('x2'); |
+ assertNotSuggested('y2'); |
+ } |
+} |