Index: pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart |
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart |
similarity index 80% |
copy from pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart |
copy to pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart |
index 8d176b8ebd9580d11c3202c78ad4761d41b2fcd0..231ce1d56ddb257ce15053df93a06ab7d83f0905 100644 |
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart |
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart |
@@ -1,270 +1,271 @@ |
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
+// Copyright (c) 2014, 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. |
-library test.services.completion.contributor.dart.type_member; |
+library test.services.completion.contributor.dart.imported_ref; |
-import 'dart:async'; |
- |
-import 'package:analysis_server/plugin/protocol/protocol.dart'; |
+import 'package:analysis_server/plugin/protocol/protocol.dart' |
+ hide Element, ElementKind; |
+import 'package:analysis_server/src/protocol_server.dart'; |
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart'; |
-import 'package:analysis_server/src/services/completion/dart/type_member_contributor.dart'; |
+import 'package:analysis_server/src/services/completion/dart/imported_reference_contributor.dart'; |
+import 'package:analyzer/src/generated/ast.dart'; |
+import 'package:analyzer/src/generated/engine.dart'; |
+import 'package:analyzer/src/generated/source.dart'; |
import 'package:test_reflective_loader/test_reflective_loader.dart'; |
import 'package:unittest/unittest.dart'; |
+import '../../../abstract_context.dart'; |
import '../../../utils.dart'; |
import 'completion_contributor_util.dart'; |
main() { |
initializeTestEnvironment(); |
- defineReflectiveTests(TypeMemberContributorTest); |
+ defineReflectiveTests(ImportedReferenceContributorTest); |
} |
@reflectiveTest |
-class TypeMemberContributorTest extends DartCompletionContributorTest { |
- /** |
- * Check whether a declaration of the form [shadower] in a derived class |
- * shadows a declaration of the form [shadowee] in a base class, for the |
- * purposes of what is shown during completion. [shouldBeShadowed] indicates |
- * whether shadowing is expected. |
- */ |
- Future check_shadowing( |
- String shadower, String shadowee, bool shouldBeShadowed) async { |
- addTestSource(''' |
-class Base { |
- $shadowee |
-} |
-class Derived extends Base { |
- $shadower |
-} |
-void f(Derived d) { |
- d.^ |
-} |
-'''); |
- await computeSuggestions(); |
- List<CompletionSuggestion> suggestionsForX = suggestions |
- .where((CompletionSuggestion s) => s.completion == 'x') |
- .toList(); |
- expect(suggestionsForX, hasLength(1)); |
- if (shouldBeShadowed) { |
- expect(suggestionsForX[0].declaringType, 'Derived'); |
- } else { |
- expect(suggestionsForX[0].declaringType, 'Base'); |
- } |
- } |
- |
- fail_test_PrefixedIdentifier_trailingStmt_const_untyped() async { |
- // SimpleIdentifier PrefixedIdentifier ExpressionStatement |
- addTestSource('const g = "hello"; f() {g.^ int y = 0;}'); |
- await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
- } |
+class ImportedReferenceContributorTest extends DartCompletionContributorTest { |
+ @override |
+ bool get isNullExpectedReturnTypeConsideredDynamic => false; |
@override |
DartCompletionContributor createContributor() { |
- return new TypeMemberContributor(); |
+ return new ImportedReferenceContributor(); |
} |
- test_enumConst() async { |
- addTestSource('enum E { one, two } main() {E.^}'); |
+ fail_enum_deprecated() async { |
+ addSource('/libA.dart', 'library A; @deprecated enum E { one, two }'); |
+ addTestSource('import "/libA.dart"; main() {^}'); |
await computeSuggestions(); |
- assertNotSuggested('E'); |
- // Suggested by StaticMemberContributor |
+ // TODO(danrube) investigate why suggestion/element is not deprecated |
+ // when AST node has correct @deprecated annotation |
+ assertSuggestEnum('E', isDeprecated: true); |
assertNotSuggested('one'); |
assertNotSuggested('two'); |
- assertNotSuggested('index'); |
- assertNotSuggested('values'); |
} |
- test_enumConst2() async { |
- addTestSource('enum E { one, two } main() {E.o^}'); |
+ test_enum() async { |
+ addSource('/libA.dart', 'library A; enum E { one, two }'); |
+ addTestSource('import "/libA.dart"; main() {^}'); |
await computeSuggestions(); |
- assertNotSuggested('E'); |
- // Suggested by StaticMemberContributor |
+ assertSuggestEnum('E'); |
assertNotSuggested('one'); |
assertNotSuggested('two'); |
- assertNotSuggested('index'); |
- assertNotSuggested('values'); |
- } |
- |
- test_enumConst3() async { |
- addTestSource('enum E { one, two } main() {E.^ int g;}'); |
- await computeSuggestions(); |
- assertNotSuggested('E'); |
- // Suggested by StaticMemberContributor |
- assertNotSuggested('one'); |
- assertNotSuggested('two'); |
- assertNotSuggested('index'); |
- assertNotSuggested('values'); |
- } |
- |
- test_enumConst_index() async { |
- addTestSource('enum E { one, two } main() {E.one.^}'); |
- await computeSuggestions(); |
- assertNotSuggested('E'); |
- assertNotSuggested('one'); |
- assertNotSuggested('two'); |
- assertSuggestField('index', 'int'); |
- assertNotSuggested('values'); |
} |
- test_enumConst_index2() async { |
- addTestSource('enum E { one, two } main() {E.one.i^}'); |
+ test_function_parameters_mixed_required_and_named() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+int m(x, {int y}) {} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
await computeSuggestions(); |
- assertNotSuggested('E'); |
- assertNotSuggested('one'); |
- assertNotSuggested('two'); |
- assertSuggestField('index', 'int'); |
- assertNotSuggested('values'); |
+ CompletionSuggestion suggestion = assertSuggestFunction('m', 'int'); |
+ 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_enumConst_index3() async { |
- addTestSource('enum E { one, two } main() {E.one.^ int g;}'); |
+ test_function_parameters_mixed_required_and_positional() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+void m(x, [int y]) {} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
+} |
+'''); |
await computeSuggestions(); |
- assertNotSuggested('E'); |
- assertNotSuggested('one'); |
- assertNotSuggested('two'); |
- assertSuggestField('index', 'int'); |
- assertNotSuggested('values'); |
+ CompletionSuggestion suggestion = assertSuggestFunction('m', '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_generic_field() async { |
+ test_function_parameters_named() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+void m({x, int y}) {} |
+'''); |
addTestSource(''' |
-class C<T> { |
- T t; |
-} |
-void f(C<int> c) { |
- c.^ |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
} |
'''); |
await computeSuggestions(); |
- assertSuggestField('t', 'int'); |
+ CompletionSuggestion suggestion = assertSuggestFunction('m', '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_generic_getter() async { |
+ test_function_parameters_none() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+void m() {} |
+'''); |
addTestSource(''' |
-class C<T> { |
- T get t => null; |
-} |
-void f(C<int> c) { |
- c.^ |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
} |
'''); |
+ |
await computeSuggestions(); |
- assertSuggestGetter('t', 'int'); |
+ CompletionSuggestion suggestion = assertSuggestFunction('m', 'void'); |
+ expect(suggestion.parameterNames, isEmpty); |
+ expect(suggestion.parameterTypes, isEmpty); |
+ expect(suggestion.requiredParameterCount, 0); |
+ expect(suggestion.hasNamedParameters, false); |
} |
- test_generic_method() async { |
+ test_function_parameters_positional() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+void m([x, int y]) {} |
+'''); |
addTestSource(''' |
-class C<T> { |
- T m(T t) {} |
-} |
-void f(C<int> c) { |
- c.^ |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
} |
'''); |
await computeSuggestions(); |
- CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'int'); |
- expect(suggestion.parameterTypes[0], 'int'); |
- expect(suggestion.element.returnType, 'int'); |
- expect(suggestion.element.parameters, '(int t)'); |
+ CompletionSuggestion suggestion = assertSuggestFunction('m', '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_generic_setter() async { |
+ test_function_parameters_required() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+void m(x, int y) {} |
+'''); |
addTestSource(''' |
-class C<T> { |
- set t(T value) {} |
-} |
-void f(C<int> c) { |
- c.^ |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
} |
'''); |
await computeSuggestions(); |
- // TODO(paulberry): modify assertSuggestSetter so that we can pass 'int' |
- // as a parmeter to it, and it will check the appropriate field in |
- // the suggestion object. |
- CompletionSuggestion suggestion = assertSuggestSetter('t'); |
- expect(suggestion.element.parameters, '(int value)'); |
+ CompletionSuggestion suggestion = assertSuggestFunction('m', '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_keyword() async { |
- addTestSource('class C { static C get instance => null; } main() {C.in^}'); |
- await computeSuggestions(); |
- // Suggested by StaticMemberContributor |
- assertNotSuggested('instance'); |
- } |
+ test_InstanceCreationExpression() async { |
+ resolveSource( |
+ '/testA.dart', |
+ ''' |
+class A {foo(){var f; {var x;}}} |
+class B {B(this.x, [String boo]) { } int x;} |
+class C {C.bar({boo: 'hoo', int z: 0}) { } }'''); |
+ addTestSource(''' |
+import "/testA.dart"; |
+import "dart:math" as math; |
+main() {new ^ String x = "hello";}'''); |
- test_libraryPrefix() async { |
- // SimpleIdentifier PrefixedIdentifier ExpressionStatement |
- addTestSource('import "dart:async" as bar; foo() {bar.^}'); |
await computeSuggestions(); |
- // Suggested by LibraryMemberContributor |
- assertNotSuggested('Future'); |
- assertNotSuggested('loadLibrary'); |
- } |
+ CompletionSuggestion suggestion; |
- test_libraryPrefix2() async { |
- // SimpleIdentifier MethodInvocation ExpressionStatement |
- addTestSource('import "dart:async" as bar; foo() {bar.^ print("f")}'); |
- await computeSuggestions(); |
- // Suggested by LibraryMemberContributor |
- assertNotSuggested('Future'); |
- } |
+ suggestion = assertSuggestConstructor('Object'); |
+ expect(suggestion.element.parameters, '()'); |
+ expect(suggestion.parameterNames, hasLength(0)); |
+ expect(suggestion.requiredParameterCount, 0); |
+ expect(suggestion.hasNamedParameters, false); |
- test_libraryPrefix3() async { |
- // SimpleIdentifier MethodInvocation ExpressionStatement |
- addTestSource('import "dart:async" as bar; foo() {new bar.F^ print("f")}'); |
- await computeSuggestions(); |
- // Suggested by LibraryMemberContributor |
- assertNotSuggested('Future'); |
- assertNotSuggested('Future.delayed'); |
- } |
+ suggestion = assertSuggestConstructor('A'); |
+ expect(suggestion.element.parameters, '()'); |
+ expect(suggestion.parameterNames, hasLength(0)); |
+ expect(suggestion.requiredParameterCount, 0); |
+ expect(suggestion.hasNamedParameters, false); |
- test_libraryPrefix_deferred() async { |
- // SimpleIdentifier PrefixedIdentifier ExpressionStatement |
- addTestSource('import "dart:async" deferred as bar; foo() {bar.^}'); |
- await computeSuggestions(); |
- // Suggested by LibraryMemberContributor |
- assertNotSuggested('Future'); |
- assertNotSuggested('loadLibrary'); |
- } |
+ suggestion = assertSuggestConstructor('B'); |
+ expect(suggestion.element.parameters, '(int x, [String boo])'); |
+ expect(suggestion.parameterNames, hasLength(2)); |
+ expect(suggestion.parameterNames[0], 'x'); |
+ expect(suggestion.parameterTypes[0], 'int'); |
+ expect(suggestion.parameterNames[1], 'boo'); |
+ expect(suggestion.parameterTypes[1], 'String'); |
+ expect(suggestion.requiredParameterCount, 1); |
+ expect(suggestion.hasNamedParameters, false); |
- test_libraryPrefix_with_exports() async { |
- addSource('/libA.dart', 'library libA; class A { }'); |
- addSource('/libB.dart', 'library libB; export "/libA.dart"; class B { }'); |
- addTestSource('import "/libB.dart" as foo; main() {foo.^} class C { }'); |
- await computeSuggestions(); |
- // Suggested by LibraryMemberContributor |
- assertNotSuggested('B'); |
- assertNotSuggested('A'); |
- } |
+ suggestion = assertSuggestConstructor('C.bar'); |
+ expect(suggestion.element.parameters, "({dynamic boo: 'hoo', int z: 0})"); |
+ expect(suggestion.parameterNames, hasLength(2)); |
+ expect(suggestion.parameterNames[0], 'boo'); |
+ expect(suggestion.parameterTypes[0], 'dynamic'); |
+ expect(suggestion.parameterNames[1], 'z'); |
+ expect(suggestion.parameterTypes[1], 'int'); |
+ expect(suggestion.requiredParameterCount, 0); |
+ expect(suggestion.hasNamedParameters, true); |
- test_local() async { |
- addTestSource('foo() {String x = "bar"; x.^}'); |
- await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ // Suggested by LibraryPrefixContributor |
+ assertNotSuggested('math'); |
} |
- test_local_is() async { |
- addTestSource('foo() {var x; if (x is String) x.^}'); |
- await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
- } |
+ test_internal_sdk_libs() async { |
+ addTestSource('main() {p^}'); |
- test_local_propogatedType() async { |
- addTestSource('foo() {var x = "bar"; x.^}'); |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertSuggest('print'); |
+ // Not imported, so not suggested |
+ assertNotSuggested('pow'); |
+ // Do not suggest completions from internal SDK library |
+ assertNotSuggested('printToConsole'); |
} |
test_method_parameters_mixed_required_and_named() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+void m(x, {int y}) {} |
+'''); |
addTestSource(''' |
-class C { |
- void m(x, {int y}) {} |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
} |
-void main() {new C().^}'''); |
+'''); |
await computeSuggestions(); |
- CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void'); |
+ CompletionSuggestion suggestion = assertSuggestFunction('m', 'void'); |
expect(suggestion.parameterNames, hasLength(2)); |
expect(suggestion.parameterNames[0], 'x'); |
expect(suggestion.parameterTypes[0], 'dynamic'); |
@@ -275,13 +276,19 @@ void main() {new C().^}'''); |
} |
test_method_parameters_mixed_required_and_positional() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+void m(x, [int y]) {} |
+'''); |
addTestSource(''' |
-class C { |
- void m(x, [int y]) {} |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
} |
-void main() {new C().^}'''); |
+'''); |
await computeSuggestions(); |
- CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void'); |
+ CompletionSuggestion suggestion = assertSuggestFunction('m', 'void'); |
expect(suggestion.parameterNames, hasLength(2)); |
expect(suggestion.parameterNames[0], 'x'); |
expect(suggestion.parameterTypes[0], 'dynamic'); |
@@ -292,13 +299,19 @@ void main() {new C().^}'''); |
} |
test_method_parameters_named() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+void m({x, int y}) {} |
+'''); |
addTestSource(''' |
-class C { |
- void m({x, int y}) {} |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
} |
-void main() {new C().^}'''); |
+'''); |
await computeSuggestions(); |
- CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void'); |
+ CompletionSuggestion suggestion = assertSuggestFunction('m', 'void'); |
expect(suggestion.parameterNames, hasLength(2)); |
expect(suggestion.parameterNames[0], 'x'); |
expect(suggestion.parameterTypes[0], 'dynamic'); |
@@ -309,13 +322,20 @@ void main() {new C().^}'''); |
} |
test_method_parameters_none() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+void m() {} |
+'''); |
addTestSource(''' |
-class C { |
- void m() {} |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
} |
-void main() {new C().^}'''); |
+'''); |
+ |
await computeSuggestions(); |
- CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void'); |
+ CompletionSuggestion suggestion = assertSuggestFunction('m', 'void'); |
expect(suggestion.parameterNames, isEmpty); |
expect(suggestion.parameterTypes, isEmpty); |
expect(suggestion.requiredParameterCount, 0); |
@@ -323,13 +343,19 @@ void main() {new C().^}'''); |
} |
test_method_parameters_positional() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+void m([x, int y]) {} |
+'''); |
addTestSource(''' |
-class C { |
- void m([x, int y]) {} |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
} |
-void main() {new C().^}'''); |
+'''); |
await computeSuggestions(); |
- CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void'); |
+ CompletionSuggestion suggestion = assertSuggestFunction('m', 'void'); |
expect(suggestion.parameterNames, hasLength(2)); |
expect(suggestion.parameterNames[0], 'x'); |
expect(suggestion.parameterTypes[0], 'dynamic'); |
@@ -340,13 +366,19 @@ void main() {new C().^}'''); |
} |
test_method_parameters_required() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+void m(x, int y) {} |
+'''); |
addTestSource(''' |
-class C { |
- void m(x, int y) {} |
+import '/libA.dart'; |
+class B { |
+ main() {^} |
} |
-void main() {new C().^}'''); |
+'''); |
await computeSuggestions(); |
- CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void'); |
+ CompletionSuggestion suggestion = assertSuggestFunction('m', 'void'); |
expect(suggestion.parameterNames, hasLength(2)); |
expect(suggestion.parameterNames[0], 'x'); |
expect(suggestion.parameterTypes[0], 'dynamic'); |
@@ -356,273 +388,131 @@ void main() {new C().^}'''); |
expect(suggestion.hasNamedParameters, false); |
} |
- test_no_parameters_field() async { |
- addTestSource(''' |
-class C { |
- int x; |
-} |
-void main() {new C().^}'''); |
- await computeSuggestions(); |
- CompletionSuggestion suggestion = assertSuggestField('x', 'int'); |
- assertHasNoParameterInfo(suggestion); |
- } |
- |
- test_no_parameters_getter() async { |
- addTestSource(''' |
-class C { |
- int get x => null; |
+ test_mixin_ordering() async { |
+ addSource( |
+ '/libA.dart', |
+ ''' |
+class B {} |
+class M1 { |
+ void m() {} |
} |
-void main() {int y = new C().^}'''); |
- await computeSuggestions(); |
- CompletionSuggestion suggestion = assertSuggestGetter('x', 'int'); |
- assertHasNoParameterInfo(suggestion); |
- } |
- |
- test_no_parameters_setter() async { |
- addTestSource(''' |
-class C { |
- set x(int value) {}; |
+class M2 { |
+ void m() {} |
} |
-void main() {int y = new C().^}'''); |
- await computeSuggestions(); |
- CompletionSuggestion suggestion = assertSuggestSetter('x'); |
- assertHasNoParameterInfo(suggestion); |
- } |
- |
- test_only_instance() async { |
- // SimpleIdentifier PropertyAccess ExpressionStatement |
+'''); |
addTestSource(''' |
-class C { |
- int f1; |
- static int f2; |
- m1() {} |
- static m2() {} |
-} |
-void main() {new C().^}'''); |
- await computeSuggestions(); |
- assertSuggestField('f1', 'int'); |
- assertNotSuggested('f2'); |
- assertSuggestMethod('m1', 'C', null); |
- assertNotSuggested('m2'); |
+import '/libA.dart'; |
+class C extends B with M1, M2 { |
+ void f() { |
+ ^ |
} |
- |
- test_only_instance2() async { |
- // SimpleIdentifier MethodInvocation ExpressionStatement |
- addTestSource(''' |
-class C { |
- int f1; |
- static int f2; |
- m1() {} |
- static m2() {} |
} |
-void main() {new C().^ print("something");}'''); |
+'''); |
await computeSuggestions(); |
- assertSuggestField('f1', 'int'); |
- assertNotSuggested('f2'); |
- assertSuggestMethod('m1', 'C', null); |
- assertNotSuggested('m2'); |
+ assertNotSuggested('m'); |
} |
- test_only_static() async { |
- // SimpleIdentifier PrefixedIdentifier ExpressionStatement |
- addTestSource(''' |
-class C { |
- int f1; |
- static int f2; |
- m1() {} |
- static m2() {} |
-} |
-void main() {C.^}'''); |
- await computeSuggestions(); |
- assertNotSuggested('f1'); |
- // Suggested by StaticMemberContributor |
- assertNotSuggested('f2'); |
- assertNotSuggested('m1'); |
- assertNotSuggested('m2'); |
- } |
+ /** |
+ * Ensure that completions in one context don't appear in another |
+ */ |
+ test_multiple_contexts() async { |
+ // Create a 2nd context with source |
+ var context2 = AnalysisEngine.instance.createAnalysisContext(); |
+ context2.sourceFactory = |
+ new SourceFactory([AbstractContextTest.SDK_RESOLVER, resourceResolver]); |
+ String content2 = 'class ClassFromAnotherContext { }'; |
+ Source source2 = |
+ provider.newFile('/context2/foo.dart', content2).createSource(); |
+ ChangeSet changeSet = new ChangeSet(); |
+ changeSet.addedSource(source2); |
+ context2.applyChanges(changeSet); |
+ context2.setContents(source2, content2); |
+ |
+ // Resolve the source in the 2nd context and update the index |
+ var result = context2.performAnalysisTask(); |
+ while (result.hasMoreWork) { |
+ result.changeNotices.forEach((ChangeNotice notice) { |
+ CompilationUnit unit = notice.resolvedDartUnit; |
+ if (unit != null) { |
+ index.index(context2, unit); |
+ } |
+ }); |
+ result = context2.performAnalysisTask(); |
+ } |
- test_only_static2() async { |
- // SimpleIdentifier MethodInvocation ExpressionStatement |
+ // Check that source in 2nd context does not appear in completion in 1st |
+ addSource( |
+ '/context1/libA.dart', |
+ ''' |
+ library libA; |
+ class ClassInLocalContext {int x;}'''); |
+ testFile = '/context1/completionTest.dart'; |
addTestSource(''' |
-class C { |
- int f1; |
- static int f2; |
- m1() {} |
- static m2() {} |
-} |
-void main() {C.^ print("something");}'''); |
- await computeSuggestions(); |
- assertNotSuggested('f1'); |
- // Suggested by StaticMemberContributor |
- assertNotSuggested('f2'); |
- assertNotSuggested('m1'); |
- assertNotSuggested('m2'); |
- } |
+ import "/context1/libA.dart"; |
+ import "/foo.dart"; |
+ main() {C^} |
+ '''); |
- test_param() async { |
- addTestSource('foo(String x) {x.^}'); |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertSuggestClass('ClassInLocalContext'); |
+ // Assert contributor does not include results from 2nd context. |
+ assertNotSuggested('ClassFromAnotherContext'); |
} |
- test_param_is() async { |
- addTestSource('foo(x) {if (x is String) x.^}'); |
- await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
- } |
- |
- test_shadowing_field_over_field() => |
- check_shadowing('int x;', 'int x;', true); |
- |
- test_shadowing_field_over_getter() => |
- check_shadowing('int x;', 'int get x => null;', true); |
- |
- test_shadowing_field_over_method() => |
- check_shadowing('int x;', 'void x() {}', true); |
- |
- test_shadowing_field_over_setter() => |
- check_shadowing('int x;', 'set x(int value) {}', true); |
- |
- test_shadowing_getter_over_field() => |
- check_shadowing('int get x => null;', 'int x;', false); |
- |
- test_shadowing_getter_over_getter() => |
- check_shadowing('int get x => null;', 'int get x => null;', true); |
- |
- test_shadowing_getter_over_method() => |
- check_shadowing('int get x => null;', 'void x() {}', true); |
- |
- test_shadowing_getter_over_setter() => |
- check_shadowing('int get x => null;', 'set x(int value) {}', false); |
- |
- test_shadowing_method_over_field() => |
- check_shadowing('void x() {}', 'int x;', true); |
- |
- test_shadowing_method_over_getter() => |
- check_shadowing('void x() {}', 'int get x => null;', true); |
- |
- test_shadowing_method_over_method() => |
- check_shadowing('void x() {}', 'void x() {}', true); |
- |
- test_shadowing_method_over_setter() => |
- check_shadowing('void x() {}', 'set x(int value) {}', true); |
- |
- test_shadowing_mixin_order() async { |
- addTestSource(''' |
-class Base { |
-} |
-class Mixin1 { |
- void f() {} |
-} |
-class Mixin2 { |
- void f() {} |
-} |
-class Derived extends Base with Mixin1, Mixin2 { |
-} |
-void test(Derived d) { |
- d.^ |
-} |
+ test_no_parameters_field() async { |
+ addSource( |
+ '/libA.dart', |
+ ''' |
+int x; |
'''); |
- await computeSuggestions(); |
- // Note: due to dartbug.com/22069, analyzer currently analyzes mixins in |
- // reverse order. The correct order is that Derived inherits from |
- // "Base with Mixin1, Mixin2", which inherits from "Base with Mixin1", |
- // which inherits from "Base". So the definition of f in Mixin2 should |
- // shadow the definition in Mixin1. |
- assertSuggestMethod('f', 'Mixin2', 'void'); |
- } |
- |
- test_shadowing_mixin_over_superclass() async { |
addTestSource(''' |
-class Base { |
- void f() {} |
-} |
-class Mixin { |
- void f() {} |
-} |
-class Derived extends Base with Mixin { |
-} |
-void test(Derived d) { |
- d.^ |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
} |
'''); |
await computeSuggestions(); |
- assertSuggestMethod('f', 'Mixin', 'void'); |
+ CompletionSuggestion suggestion = assertSuggestTopLevelVar('x', null); |
+ assertHasNoParameterInfo(suggestion); |
} |
- test_shadowing_setter_over_field() => |
- check_shadowing('set x(int value) {}', 'int x;', false); |
- |
- test_shadowing_setter_over_getter() => |
- check_shadowing('set x(int value) {}', 'int get x => null;', false); |
- |
- test_shadowing_setter_over_method() => |
- check_shadowing('set x(int value) {}', 'void x() {}', true); |
- |
- test_shadowing_setter_over_setter() => |
- check_shadowing('set x(int value) {}', 'set x(int value) {}', true); |
- |
- test_shadowing_superclass_over_interface() async { |
+ test_no_parameters_getter() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+int get x => null; |
+'''); |
addTestSource(''' |
-class Base { |
- void f() {} |
-} |
-class Interface { |
- void f() {} |
-} |
-class Derived extends Base implements Interface { |
-} |
-void test(Derived d) { |
- d.^ |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
} |
'''); |
await computeSuggestions(); |
- assertSuggestMethod('f', 'Base', 'void'); |
+ CompletionSuggestion suggestion = assertSuggestGetter('x', 'int'); |
+ assertHasNoParameterInfo(suggestion); |
} |
- test_super() async { |
- // SimpleIdentifier MethodInvocation ExpressionStatement |
+ test_no_parameters_setter() async { |
+ addSource( |
+ '/libA.dart', |
+ ''' |
+set x(int value) {}; |
+'''); |
addTestSource(''' |
-class C3 { |
- int fi3; |
- static int fs3; |
- m() {} |
- mi3() {} |
- static ms3() {} |
-} |
-class C2 { |
- int fi2; |
- static int fs2; |
- m() {} |
- mi2() {} |
- static ms2() {} |
+import '/libA.dart'; |
+class B extends A { |
+ main() {^} |
} |
-class C1 extends C2 implements C3 { |
- int fi1; |
- static int fs1; |
- m() {super.^} |
- mi1() {} |
- static ms1() {} |
-}'''); |
+'''); |
await computeSuggestions(); |
- assertNotSuggested('fi1'); |
- assertNotSuggested('fs1'); |
- assertNotSuggested('mi1'); |
- assertNotSuggested('ms1'); |
- assertSuggestField('fi2', 'int'); |
- assertNotSuggested('fs2'); |
- assertSuggestMethod('mi2', 'C2', null); |
- assertNotSuggested('ms2'); |
- assertSuggestMethod('m', 'C2', null, relevance: DART_RELEVANCE_HIGH); |
- assertNotSuggested('fi3'); |
- assertNotSuggested('fs3'); |
- assertNotSuggested('mi3'); |
- assertNotSuggested('ms3'); |
+ CompletionSuggestion suggestion = assertSuggestSetter('x'); |
+ assertHasNoParameterInfo(suggestion); |
} |
test_ArgumentList() async { |
// ArgumentList MethodInvocation ExpressionStatement Block |
- addSource( |
+ resolveSource( |
'/libA.dart', |
''' |
library A; |
@@ -633,15 +523,16 @@ class C1 extends C2 implements C3 { |
class B { } |
String bar() => true; |
void main() {expect(^)}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
assertNotSuggested('bar'); |
- assertNotSuggested('hasLength'); |
- assertNotSuggested('identical'); |
+ assertSuggestFunction('hasLength', 'bool'); |
+ assertSuggestFunction('identical', 'bool'); |
assertNotSuggested('B'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('main'); |
assertNotSuggested('baz'); |
assertNotSuggested('print'); |
@@ -649,7 +540,7 @@ class C1 extends C2 implements C3 { |
test_ArgumentList_imported_function() async { |
// ArgumentList MethodInvocation ExpressionStatement Block |
- addSource( |
+ resolveSource( |
'/libA.dart', |
''' |
library A; |
@@ -661,15 +552,16 @@ class C1 extends C2 implements C3 { |
class B { } |
String bar() => true; |
void main() {expect(^)}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
assertNotSuggested('bar'); |
- assertNotSuggested('hasLength'); |
- assertNotSuggested('identical'); |
+ assertSuggestFunction('hasLength', 'bool'); |
+ assertSuggestFunction('identical', 'bool'); |
assertNotSuggested('B'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('main'); |
assertNotSuggested('baz'); |
assertNotSuggested('print'); |
@@ -690,16 +582,19 @@ class C1 extends C2 implements C3 { |
class B { } |
String bar() => true; |
void main() {new A(^)}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
assertNotSuggested('bar'); |
- assertNotSuggested('hasLength'); |
- assertNotSuggested('identical'); |
+ assertSuggestFunction('hasLength', 'bool', |
+ kind: CompletionSuggestionKind.IDENTIFIER); |
+ assertSuggestFunction('identical', 'bool', |
+ kind: CompletionSuggestionKind.IDENTIFIER); |
assertNotSuggested('B'); |
- assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER); |
+ assertSuggestClass('Object', kind: CompletionSuggestionKind.IDENTIFIER); |
assertNotSuggested('main'); |
assertNotSuggested('baz'); |
assertNotSuggested('print'); |
@@ -721,16 +616,19 @@ class C1 extends C2 implements C3 { |
class B { } |
String bar() => true; |
void main() {new A(^)}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
assertNotSuggested('bar'); |
- assertNotSuggested('hasLength'); |
- assertNotSuggested('identical'); |
+ assertSuggestFunction('hasLength', 'bool', |
+ kind: CompletionSuggestionKind.IDENTIFIER); |
+ assertSuggestFunction('identical', 'bool', |
+ kind: CompletionSuggestionKind.IDENTIFIER); |
assertNotSuggested('B'); |
- assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER); |
+ assertSuggestClass('Object', kind: CompletionSuggestionKind.IDENTIFIER); |
assertNotSuggested('main'); |
assertNotSuggested('baz'); |
assertNotSuggested('print'); |
@@ -738,7 +636,7 @@ class C1 extends C2 implements C3 { |
test_ArgumentList_local_function() async { |
// ArgumentList MethodInvocation ExpressionStatement Block |
- addSource( |
+ resolveSource( |
'/libA.dart', |
''' |
library A; |
@@ -750,15 +648,16 @@ class C1 extends C2 implements C3 { |
class B { } |
String bar() => true; |
void main() {expect(^)}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
assertNotSuggested('bar'); |
- assertNotSuggested('hasLength'); |
- assertNotSuggested('identical'); |
+ assertSuggestFunction('hasLength', 'bool'); |
+ assertSuggestFunction('identical', 'bool'); |
assertNotSuggested('B'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('main'); |
assertNotSuggested('baz'); |
assertNotSuggested('print'); |
@@ -766,7 +665,7 @@ class C1 extends C2 implements C3 { |
test_ArgumentList_local_method() async { |
// ArgumentList MethodInvocation ExpressionStatement Block |
- addSource( |
+ resolveSource( |
'/libA.dart', |
''' |
library A; |
@@ -778,15 +677,16 @@ class C1 extends C2 implements C3 { |
expect(arg) { } |
void foo() {expect(^)}} |
String bar() => true;'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
assertNotSuggested('bar'); |
- assertNotSuggested('hasLength'); |
- assertNotSuggested('identical'); |
+ assertSuggestFunction('hasLength', 'bool'); |
+ assertSuggestFunction('identical', 'bool'); |
assertNotSuggested('B'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('main'); |
assertNotSuggested('baz'); |
assertNotSuggested('print'); |
@@ -807,16 +707,19 @@ class C1 extends C2 implements C3 { |
class B { } |
String bar(f()) => true; |
void main() {bar(^);}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
assertNotSuggested('bar'); |
- assertNotSuggested('hasLength'); |
- assertNotSuggested('identical'); |
+ assertSuggestFunction('hasLength', 'bool', |
+ kind: CompletionSuggestionKind.IDENTIFIER); |
+ assertSuggestFunction('identical', 'bool', |
+ kind: CompletionSuggestionKind.IDENTIFIER); |
assertNotSuggested('B'); |
- assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER); |
+ assertSuggestClass('Object', kind: CompletionSuggestionKind.IDENTIFIER); |
assertNotSuggested('main'); |
assertNotSuggested('baz'); |
assertNotSuggested('print'); |
@@ -836,15 +739,18 @@ class C1 extends C2 implements C3 { |
import '/libA.dart'; |
class B { String bar(f()) => true; } |
void main() {new B().bar(^);}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
- assertNotSuggested('hasLength'); |
- assertNotSuggested('identical'); |
+ assertSuggestFunction('hasLength', 'bool', |
+ kind: CompletionSuggestionKind.IDENTIFIER); |
+ assertSuggestFunction('identical', 'bool', |
+ kind: CompletionSuggestionKind.IDENTIFIER); |
assertNotSuggested('B'); |
- assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER); |
+ assertSuggestClass('Object', kind: CompletionSuggestionKind.IDENTIFIER); |
assertNotSuggested('main'); |
assertNotSuggested('baz'); |
assertNotSuggested('print'); |
@@ -862,11 +768,14 @@ class C1 extends C2 implements C3 { |
import '/libA.dart' |
String bar() => true; |
void main() {expect(foo: ^)}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('bar'); |
- assertNotSuggested('hasLength'); |
+ // An unresolved imported library will produce suggestions |
+ // with a null returnType |
+ assertSuggestFunction('hasLength', null); |
assertNotSuggested('main'); |
} |
@@ -874,12 +783,13 @@ class C1 extends C2 implements C3 { |
// SimpleIdentifier TypeName AsExpression |
addTestSource(''' |
class A {var b; X _c; foo() {var a; (a as ^).foo();}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('b'); |
assertNotSuggested('_c'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('A'); |
assertNotSuggested('=='); |
} |
@@ -888,6 +798,7 @@ class C1 extends C2 implements C3 { |
// SimpleIdentifier VariableDeclaration VariableDeclarationList |
// VariableDeclarationStatement Block |
addTestSource('class A {} main() {int a; int ^b = 1;}'); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -896,13 +807,14 @@ class C1 extends C2 implements C3 { |
// SimpleIdentifier VariableDeclaration VariableDeclarationList |
// VariableDeclarationStatement Block |
addTestSource('class A {} main() {int a; int b = ^}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('a'); |
assertNotSuggested('main'); |
assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
} |
test_AssignmentExpression_type() async { |
@@ -912,11 +824,12 @@ class C1 extends C2 implements C3 { |
class A {} main() { |
int a; |
^ b = 1;}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('A'); |
- assertNotSuggested('int'); |
+ assertSuggestClass('int'); |
// TODO (danrubel) When entering 1st of 2 identifiers on assignment LHS |
// the user may be either (1) entering a type for the assignment |
// or (2) starting a new statement. |
@@ -935,17 +848,18 @@ class C1 extends C2 implements C3 { |
int a; |
^ |
b = 1;}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('A'); |
- assertNotSuggested('int'); |
+ assertSuggestClass('int'); |
// Allow non-types preceding an identifier on LHS of assignment |
// if newline follows first identifier |
// because user is probably starting a new statement |
assertNotSuggested('a'); |
assertNotSuggested('main'); |
- assertNotSuggested('identical'); |
+ assertSuggestFunction('identical', 'bool'); |
} |
test_AssignmentExpression_type_partial() async { |
@@ -955,11 +869,12 @@ class C1 extends C2 implements C3 { |
class A {} main() { |
int a; |
int^ b = 1;}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 3); |
expect(replacementLength, 3); |
assertNotSuggested('A'); |
- assertNotSuggested('int'); |
+ assertSuggestClass('int'); |
// TODO (danrubel) When entering 1st of 2 identifiers on assignment LHS |
// the user may be either (1) entering a type for the assignment |
// or (2) starting a new statement. |
@@ -978,17 +893,18 @@ class C1 extends C2 implements C3 { |
int a; |
i^ |
b = 1;}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
assertNotSuggested('A'); |
- assertNotSuggested('int'); |
+ assertSuggestClass('int'); |
// Allow non-types preceding an identifier on LHS of assignment |
// if newline follows first identifier |
// because user is probably starting a new statement |
assertNotSuggested('a'); |
assertNotSuggested('main'); |
- assertNotSuggested('identical'); |
+ assertSuggestFunction('identical', 'bool'); |
} |
test_AwaitExpression() async { |
@@ -996,24 +912,73 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
class A {int x; int y() => 0;} |
main() async {A a; await ^}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('a'); |
assertNotSuggested('main'); |
assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
+ } |
+ |
+ test_AwaitExpression_function() async { |
+ resolveSource( |
+ '/libA.dart', |
+ ''' |
+Future y() async {return 0;} |
+'''); |
+ addTestSource(''' |
+import '/libA.dart'; |
+class B extends A { |
+ int x; |
+ foo() async {await ^} |
+} |
+'''); |
+ await computeSuggestions(); |
+ expect(replacementOffset, completionOffset); |
+ expect(replacementLength, 0); |
+ assertSuggestFunction('y', 'dynamic'); |
+ assertNotSuggested('A'); |
+ assertSuggestClass('Object'); |
+ } |
+ |
+ test_AwaitExpression_inherited() async { |
+ // SimpleIdentifier AwaitExpression ExpressionStatement |
+ addSource( |
+ '/testB.dart', |
+ ''' |
+lib libB; |
+class A { |
+ Future y() async { return 0; } |
+}'''); |
+ addTestSource(''' |
+import "/testB.dart"; |
+class B extends A { |
+ foo() async {await ^} |
+} |
+'''); |
+ |
+ await computeSuggestions(); |
+ expect(replacementOffset, completionOffset); |
+ expect(replacementLength, 0); |
+ assertNotSuggested('a'); |
+ assertNotSuggested('main'); |
+ assertSuggestClass('A'); |
+ assertSuggestClass('Object'); |
+ assertNotSuggested('y'); |
} |
test_BinaryExpression_LHS() async { |
// SimpleIdentifier BinaryExpression VariableDeclaration |
// VariableDeclarationList VariableDeclarationStatement |
addTestSource('main() {int a = 1, b = ^ + 2;}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('a'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('b'); |
} |
@@ -1021,11 +986,12 @@ class C1 extends C2 implements C3 { |
// SimpleIdentifier BinaryExpression VariableDeclaration |
// VariableDeclarationList VariableDeclarationStatement |
addTestSource('main() {int a = 1, b = 2 + ^;}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('a'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('b'); |
assertNotSuggested('=='); |
} |
@@ -1079,8 +1045,8 @@ class C1 extends C2 implements C3 { |
} |
void b() { }} |
class Z { }'''); |
- await computeSuggestions(); |
+ await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -1095,24 +1061,32 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('x'); |
assertNotSuggested('partT8'); |
- assertNotSuggested('A'); |
+ assertSuggestClass('A', elemFile: '/testAB.dart'); |
assertNotSuggested('_B'); |
- assertNotSuggested('C'); |
+ assertSuggestClass('C'); |
assertNotSuggested('partBoo'); |
// hidden element suggested as low relevance |
// but imported results are partially filtered |
- //assertNotSuggested('D'); |
- //assertNotSuggested( |
+ //assertSuggestClass('D', COMPLETION_RELEVANCE_LOW); |
+ //assertSuggestFunction( |
// 'D1', null, true, COMPLETION_RELEVANCE_LOW); |
assertNotSuggested('D2'); |
- assertNotSuggested('EE'); |
+ assertSuggestClass('EE'); |
// hidden element suggested as low relevance |
- //assertNotSuggested('F'); |
+ //assertSuggestClass('F', COMPLETION_RELEVANCE_LOW); |
+ // Suggested by LibraryPrefixContributor |
assertNotSuggested('g'); |
+ assertSuggestClass('g.G', elemName: 'G'); |
assertNotSuggested('G'); |
- //assertNotSuggested('H'); |
- assertNotSuggested('Object'); |
- assertNotSuggested('min'); |
+ //assertSuggestClass('H', COMPLETION_RELEVANCE_LOW); |
+ assertSuggestClass('Object'); |
+ assertSuggestFunction('min', 'num'); |
+ //assertSuggestFunction( |
+ // 'max', |
+ // 'num', |
+ // false, |
+ // COMPLETION_RELEVANCE_LOW); |
+ assertSuggestTopLevelVar('T1', null); |
assertNotSuggested('_T2'); |
//assertSuggestImportedTopLevelVar('T3', 'int', COMPLETION_RELEVANCE_LOW); |
assertNotSuggested('_T4'); |
@@ -1125,7 +1099,7 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('blog'); |
// TODO (danrubel) suggest HtmlElement as low relevance |
assertNotSuggested('HtmlElement'); |
- assertNotSuggested('Uri'); |
+ assertSuggestClass('Uri'); |
assertNotSuggested('parseIPv6Address'); |
assertNotSuggested('parseHex'); |
} |
@@ -1179,8 +1153,8 @@ class C1 extends C2 implements C3 { |
} |
void b() { }} |
class Z { }'''); |
- await computeSuggestions(); |
+ await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -1195,30 +1169,31 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('x'); |
assertNotSuggested('partT8'); |
- assertNotSuggested('A'); |
+ assertSuggestClass('A'); |
assertNotSuggested('_B'); |
- assertNotSuggested('C'); |
+ assertSuggestClass('C'); |
assertNotSuggested('partBoo'); |
// hidden element suggested as low relevance |
// but imported results are partially filtered |
- //assertNotSuggested('D'); |
- //assertNotSuggested( |
+ //assertSuggestClass('D', COMPLETION_RELEVANCE_LOW); |
+ //assertSuggestFunction( |
// 'D1', null, true, COMPLETION_RELEVANCE_LOW); |
assertNotSuggested('D2'); |
- assertNotSuggested('EE'); |
+ assertSuggestClass('EE'); |
// hidden element suggested as low relevance |
- //assertNotSuggested('F'); |
+ //assertSuggestClass('F', COMPLETION_RELEVANCE_LOW); |
+ // Suggested by LibraryPrefixContributor |
assertNotSuggested('g'); |
- assertNotSuggested('G'); |
- //assertNotSuggested('H'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('g.G', elemName: 'G'); |
+ //assertSuggestClass('H', COMPLETION_RELEVANCE_LOW); |
+ assertSuggestClass('Object'); |
assertNotSuggested('min'); |
- //assertNotSuggested( |
+ //assertSuggestFunction( |
// 'max', |
// 'num', |
// false, |
// COMPLETION_RELEVANCE_LOW); |
- assertNotSuggested('T1'); |
+ assertSuggestTopLevelVar('T1', null); |
assertNotSuggested('_T2'); |
//assertSuggestImportedTopLevelVar('T3', 'int', COMPLETION_RELEVANCE_LOW); |
assertNotSuggested('_T4'); |
@@ -1231,23 +1206,23 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('blog'); |
// TODO (danrubel) suggest HtmlElement as low relevance |
assertNotSuggested('HtmlElement'); |
- assertNotSuggested('Uri'); |
+ assertSuggestClass('Uri'); |
assertNotSuggested('parseIPv6Address'); |
assertNotSuggested('parseHex'); |
} |
test_Block_final2() async { |
addTestSource('main() {final S^ v;}'); |
- await computeSuggestions(); |
- assertNotSuggested('String'); |
+ await computeSuggestions(); |
+ assertSuggestClass('String'); |
} |
test_Block_final3() async { |
addTestSource('main() {final ^ v;}'); |
- await computeSuggestions(); |
- assertNotSuggested('String'); |
+ await computeSuggestions(); |
+ assertSuggestClass('String'); |
} |
test_Block_final_final() async { |
@@ -1282,7 +1257,7 @@ class C1 extends C2 implements C3 { |
import "/testAB.dart"; |
import "/testCD.dart" hide D; |
import "/testEEF.dart" show EE; |
- import "/testG.dart" as g; |
+ import "/testG.dart" as g hide G; |
int T5; |
var _T6; |
String get T7 => 'hello'; |
@@ -1299,8 +1274,8 @@ class C1 extends C2 implements C3 { |
} |
void b() { }} |
class Z { }'''); |
- await computeSuggestions(); |
+ await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -1315,30 +1290,33 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('x'); |
assertNotSuggested('partT8'); |
- assertNotSuggested('A'); |
+ assertSuggestClass('A'); |
assertNotSuggested('_B'); |
- assertNotSuggested('C'); |
+ assertSuggestClass('C'); |
assertNotSuggested('partBoo'); |
// hidden element suggested as low relevance |
// but imported results are partially filtered |
- //assertNotSuggested('D'); |
- //assertNotSuggested( |
+ //assertSuggestClass('D', COMPLETION_RELEVANCE_LOW); |
+ //assertSuggestFunction( |
// 'D1', null, true, COMPLETION_RELEVANCE_LOW); |
assertNotSuggested('D2'); |
- assertNotSuggested('EE'); |
+ assertSuggestClass('EE'); |
// hidden element suggested as low relevance |
- //assertNotSuggested('F'); |
+ //assertSuggestClass('F', COMPLETION_RELEVANCE_LOW); |
+ // Suggested by LibraryPrefixContributor |
assertNotSuggested('g'); |
assertNotSuggested('G'); |
- //assertNotSuggested('H'); |
- assertNotSuggested('Object'); |
+ // Hidden elements not suggested |
+ assertNotSuggested('g.G'); |
+ //assertSuggestClass('H', COMPLETION_RELEVANCE_LOW); |
+ assertSuggestClass('Object'); |
assertNotSuggested('min'); |
- //assertNotSuggested( |
+ //assertSuggestFunction( |
// 'max', |
// 'num', |
// false, |
// COMPLETION_RELEVANCE_LOW); |
- assertNotSuggested('T1'); |
+ assertSuggestTopLevelVar('T1', null); |
assertNotSuggested('_T2'); |
//assertSuggestImportedTopLevelVar('T3', 'int', COMPLETION_RELEVANCE_LOW); |
assertNotSuggested('_T4'); |
@@ -1351,7 +1329,7 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('blog'); |
// TODO (danrubel) suggest HtmlElement as low relevance |
assertNotSuggested('HtmlElement'); |
- assertNotSuggested('Uri'); |
+ assertSuggestClass('Uri'); |
assertNotSuggested('parseIPv6Address'); |
assertNotSuggested('parseHex'); |
} |
@@ -1405,8 +1383,8 @@ class C1 extends C2 implements C3 { |
} |
void b() { }} |
class Z { }'''); |
- await computeSuggestions(); |
+ await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -1421,30 +1399,31 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('x'); |
assertNotSuggested('partT8'); |
- assertNotSuggested('A'); |
+ assertSuggestClass('A'); |
assertNotSuggested('_B'); |
- assertNotSuggested('C'); |
+ assertSuggestClass('C'); |
assertNotSuggested('partBoo'); |
// hidden element suggested as low relevance |
// but imported results are partially filtered |
- //assertNotSuggested('D'); |
- //assertNotSuggested( |
+ //assertSuggestClass('D', COMPLETION_RELEVANCE_LOW); |
+ //assertSuggestFunction( |
// 'D1', null, true, COMPLETION_RELEVANCE_LOW); |
assertNotSuggested('D2'); |
- assertNotSuggested('EE'); |
+ assertSuggestClass('EE'); |
// hidden element suggested as low relevance |
- //assertNotSuggested('F'); |
+ //assertSuggestClass('F', COMPLETION_RELEVANCE_LOW); |
+ // Suggested by LibraryPrefixContributor |
assertNotSuggested('g'); |
- assertNotSuggested('G'); |
- //assertNotSuggested('H'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('g.G', elemName: 'G'); |
+ //assertSuggestClass('H', COMPLETION_RELEVANCE_LOW); |
+ assertSuggestClass('Object'); |
assertNotSuggested('min'); |
- //assertNotSuggested( |
+ //assertSuggestFunction( |
// 'max', |
// 'num', |
// false, |
// COMPLETION_RELEVANCE_LOW); |
- assertNotSuggested('T1'); |
+ assertSuggestTopLevelVar('T1', null); |
assertNotSuggested('_T2'); |
//assertSuggestImportedTopLevelVar('T3', 'int', COMPLETION_RELEVANCE_LOW); |
assertNotSuggested('_T4'); |
@@ -1457,13 +1436,13 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('blog'); |
// TODO (danrubel) suggest HtmlElement as low relevance |
assertNotSuggested('HtmlElement'); |
- assertNotSuggested('Uri'); |
+ assertSuggestClass('Uri'); |
assertNotSuggested('parseIPv6Address'); |
assertNotSuggested('parseHex'); |
} |
test_Block_identifier_partial() async { |
- addSource( |
+ resolveSource( |
'/testAB.dart', |
''' |
export "dart:math" hide max; |
@@ -1481,7 +1460,7 @@ class C1 extends C2 implements C3 { |
'/testEEF.dart', |
''' |
class EE { } |
- class F { }'''); |
+ class DF { }'''); |
addSource('/testG.dart', 'class G { }'); |
addSource( |
'/testH.dart', |
@@ -1501,7 +1480,6 @@ class C1 extends C2 implements C3 { |
class X {a() {var f; {var x;} D^ var r;} void b() { }} |
class Z { }'''); |
await computeSuggestions(); |
- |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
@@ -1515,24 +1493,24 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('x'); |
// imported elements are portially filtered |
- //assertNotSuggested('A'); |
+ //assertSuggestClass('A'); |
assertNotSuggested('_B'); |
- //assertNotSuggested('C'); |
- // hidden element suggested as low relevance |
+ // hidden element not suggested |
assertNotSuggested('D'); |
- assertNotSuggested('D1'); |
+ assertSuggestFunction('D1', 'dynamic', |
+ isDeprecated: true, relevance: DART_RELEVANCE_LOW); |
assertNotSuggested('D2'); |
- // unimported elements suggested with low relevance |
+ // Not imported, so not suggested |
assertNotSuggested('D3'); |
- //assertNotSuggested('EE'); |
- // hidden element suggested as low relevance |
- //assertNotSuggested('F'); |
- //assertNotSuggested('g'); |
- assertNotSuggested('G'); |
- //assertNotSuggested('H'); |
- //assertNotSuggested('Object'); |
- //assertNotSuggested('min'); |
- //assertNotSuggested( |
+ //assertSuggestClass('EE'); |
+ // hidden element not suggested |
+ assertNotSuggested('DF'); |
+ //assertSuggestLibraryPrefix('g'); |
+ assertSuggestClass('g.G', elemName: 'G'); |
+ //assertSuggestClass('H', COMPLETION_RELEVANCE_LOW); |
+ //assertSuggestClass('Object'); |
+ //assertSuggestFunction('min', 'num', false); |
+ //assertSuggestFunction( |
// 'max', |
// 'num', |
// false, |
@@ -1561,8 +1539,8 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
import "/testB.dart"; |
class A extends E implements I with M {a() {^}}'''); |
- await computeSuggestions(); |
+ await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
// TODO (danrubel) prefer fields over getters |
@@ -1577,7 +1555,7 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('e2'); |
assertNotSuggested('f2'); |
assertNotSuggested('i2'); |
- //assertNotSuggested('m2'); |
+ //assertNotSuggested('m2', null, null); |
assertNotSuggested('=='); |
} |
@@ -1589,6 +1567,7 @@ class C1 extends C2 implements C3 { |
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); |
@@ -1652,56 +1631,76 @@ class C1 extends C2 implements C3 { |
} |
void b() { }} |
class Z { }'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
+ |
assertNotSuggested('partT8'); |
assertNotSuggested('partBoo'); |
assertNotSuggested('parseIPv6Address'); |
assertNotSuggested('parseHex'); |
} |
+ test_Block_partial_results() async { |
+ // Block BlockFunctionBody MethodDeclaration |
+ addSource( |
+ '/testAB.dart', |
+ ''' |
+ export "dart:math" hide max; |
+ class A {int x;} |
+ @deprecated D1() {int x;} |
+ class _B { }'''); |
+ addSource( |
+ '/testCD.dart', |
+ ''' |
+ String T1; |
+ var _T2; |
+ class C { } |
+ class D { }'''); |
+ addSource( |
+ '/testEEF.dart', |
+ ''' |
+ class EE { } |
+ class F { }'''); |
+ addSource('/testG.dart', 'class G { }'); |
+ addSource( |
+ '/testH.dart', |
+ ''' |
+ class H { } |
+ int T3; |
+ var _T4;'''); // not imported |
+ addTestSource(''' |
+ import "/testAB.dart"; |
+ import "/testCD.dart" hide D; |
+ import "/testEEF.dart" show EE; |
+ import "/testG.dart" as g; |
+ int T5; |
+ var _T6; |
+ Z D2() {int x;} |
+ class X {a() {var f; {var x;} ^ var r;} void b() { }} |
+ class Z { }'''); |
+ await computeSuggestions(); |
+ assertSuggestClass('C'); |
+ assertNotSuggested('H'); |
+ } |
+ |
test_Block_unimported() async { |
addPackageSource('myBar', 'bar.dart', 'class Foo2 { Foo2() { } }'); |
addSource( |
'/proj/testAB.dart', 'import "package:myBar/bar.dart"; class Foo { }'); |
testFile = '/proj/completionTest.dart'; |
addTestSource('class C {foo(){F^}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
+ // Not imported, so not suggested |
assertNotSuggested('Foo'); |
- // TODO(danrubel) implement |
assertNotSuggested('Foo2'); |
assertNotSuggested('Future'); |
} |
- test_CascadeExpression_method1() async { |
- // PropertyAccess CascadeExpression ExpressionStatement Block |
- addSource( |
- '/testB.dart', |
- ''' |
- class B { }'''); |
- addTestSource(''' |
- import "/testB.dart"; |
- class A {var b; X _c;} |
- class X{} |
- // looks like a cascade to the parser |
- // but the user is trying to get completions for a non-cascade |
- main() {A a; a.^.z()}'''); |
- await computeSuggestions(); |
- expect(replacementOffset, completionOffset); |
- expect(replacementLength, 0); |
- assertSuggestField('b', null); |
- assertSuggestField('_c', 'X'); |
- assertNotSuggested('Object'); |
- assertNotSuggested('A'); |
- assertNotSuggested('B'); |
- assertNotSuggested('X'); |
- assertNotSuggested('z'); |
- assertNotSuggested('=='); |
- } |
- |
test_CascadeExpression_selector1() async { |
// PropertyAccess CascadeExpression ExpressionStatement Block |
addSource( |
@@ -1715,11 +1714,12 @@ class C1 extends C2 implements C3 { |
// looks like a cascade to the parser |
// but the user is trying to get completions for a non-cascade |
main() {A a; a.^.z}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertSuggestField('b', null); |
- assertSuggestField('_c', 'X'); |
+ assertNotSuggested('b'); |
+ assertNotSuggested('_c'); |
assertNotSuggested('Object'); |
assertNotSuggested('A'); |
assertNotSuggested('B'); |
@@ -1739,11 +1739,12 @@ class C1 extends C2 implements C3 { |
class A {var b; X _c;} |
class X{} |
main() {A a; a..^z}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 1); |
- assertSuggestField('b', null); |
- assertSuggestField('_c', 'X'); |
+ assertNotSuggested('b'); |
+ assertNotSuggested('_c'); |
assertNotSuggested('Object'); |
assertNotSuggested('A'); |
assertNotSuggested('B'); |
@@ -1763,11 +1764,12 @@ class C1 extends C2 implements C3 { |
class A {var b; X _c;} |
class X{} |
main() {A a; a..^ return}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertSuggestField('b', null); |
- assertSuggestField('_c', 'X'); |
+ assertNotSuggested('b'); |
+ assertNotSuggested('_c'); |
assertNotSuggested('Object'); |
assertNotSuggested('A'); |
assertNotSuggested('B'); |
@@ -1782,6 +1784,7 @@ class C1 extends C2 implements C3 { |
class A {var b; X _c;} |
class X{} |
main() {A a; a^..b}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
@@ -1791,18 +1794,19 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('A'); |
assertNotSuggested('X'); |
// top level results are partially filtered |
- //assertNotSuggested('Object'); |
+ //assertSuggestClass('Object'); |
assertNotSuggested('=='); |
} |
test_CatchClause_onType() async { |
// TypeName CatchClause TryStatement |
addTestSource('class A {a() {try{var x;} on ^ {}}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('a'); |
assertNotSuggested('x'); |
} |
@@ -1810,36 +1814,39 @@ class C1 extends C2 implements C3 { |
test_CatchClause_onType_noBrackets() async { |
// TypeName CatchClause TryStatement |
addTestSource('class A {a() {try{var x;} on ^}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('x'); |
} |
test_CatchClause_typed() async { |
// Block CatchClause TryStatement |
addTestSource('class A {a() {try{var x;} on E catch (e) {^}}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('e'); |
assertNotSuggested('a'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('x'); |
} |
test_CatchClause_untyped() async { |
// Block CatchClause TryStatement |
addTestSource('class A {a() {try{var x;} catch (e, s) {^}}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('e'); |
assertNotSuggested('s'); |
assertNotSuggested('a'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('x'); |
} |
@@ -1854,13 +1861,19 @@ class C1 extends C2 implements C3 { |
@deprecated class A {^} |
class _B {} |
A T;'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('A'); |
assertNotSuggested('_B'); |
- assertNotSuggested('Object'); |
+ CompletionSuggestion suggestionO = assertSuggestClass('Object'); |
+ if (suggestionO != null) { |
+ expect(suggestionO.element.isDeprecated, isFalse); |
+ expect(suggestionO.element.isPrivate, isFalse); |
+ } |
assertNotSuggested('T'); |
+ // Suggested by LibraryPrefixContributor |
assertNotSuggested('x'); |
} |
@@ -1875,13 +1888,15 @@ class C1 extends C2 implements C3 { |
class A {final ^} |
class _B {} |
A T;'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('A'); |
assertNotSuggested('_B'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('T'); |
+ // Suggested by LibraryPrefixContributor |
assertNotSuggested('x'); |
} |
@@ -1896,13 +1911,15 @@ class C1 extends C2 implements C3 { |
class A {final ^ A(){}} |
class _B {} |
A T;'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('A'); |
assertNotSuggested('_B'); |
- assertNotSuggested('String'); |
+ assertSuggestClass('String'); |
assertNotSuggested('T'); |
+ // Suggested by LibraryPrefixContributor |
assertNotSuggested('x'); |
} |
@@ -1917,13 +1934,15 @@ class C1 extends C2 implements C3 { |
class A {final S^ A();} |
class _B {} |
A Sew;'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
assertNotSuggested('A'); |
assertNotSuggested('_B'); |
- assertNotSuggested('String'); |
+ assertSuggestClass('String'); |
assertNotSuggested('Sew'); |
+ // Suggested by LibraryPrefixContributor |
assertNotSuggested('Soo'); |
} |
@@ -1938,13 +1957,15 @@ class C1 extends C2 implements C3 { |
class A {final ^ final foo;} |
class _B {} |
A T;'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('A'); |
assertNotSuggested('_B'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('T'); |
+ // Suggested by LibraryPrefixContributor |
assertNotSuggested('x'); |
} |
@@ -1959,13 +1980,15 @@ class C1 extends C2 implements C3 { |
class A {final ^ var foo;} |
class _B {} |
A T;'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('A'); |
assertNotSuggested('_B'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('T'); |
+ // Suggested by LibraryPrefixContributor |
assertNotSuggested('x'); |
} |
@@ -1994,6 +2017,7 @@ class C1 extends C2 implements C3 { |
import "/testAB.dart" hide ^; |
import "/testCD.dart"; |
class X {}'''); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -2025,6 +2049,7 @@ class C1 extends C2 implements C3 { |
import "/testAB.dart" show ^; |
import "/testCD.dart"; |
class X {}'''); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -2043,6 +2068,7 @@ class C1 extends C2 implements C3 { |
F2() { } |
class B {int x;} |
class C {foo(){var f; {var x;} return a ? T1 : T^}}'''); |
+ |
await computeSuggestions(); |
// top level results are partially filtered based on first char |
assertNotSuggested('T2'); |
@@ -2052,7 +2078,7 @@ class C1 extends C2 implements C3 { |
test_ConditionalExpression_elseExpression_empty() async { |
// SimpleIdentifier ConditionalExpression ReturnStatement |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
int T1; |
@@ -2064,6 +2090,7 @@ class C1 extends C2 implements C3 { |
F2() { } |
class B {int x;} |
class C {foo(){var f; {var x;} return a ? T1 : ^}}'''); |
+ |
await computeSuggestions(); |
assertNotSuggested('x'); |
assertNotSuggested('f'); |
@@ -2071,8 +2098,8 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('C'); |
assertNotSuggested('F2'); |
assertNotSuggested('T2'); |
- assertNotSuggested('A'); |
- assertNotSuggested('F1'); |
+ assertSuggestClass('A'); |
+ assertSuggestFunction('F1', 'dynamic'); |
// TODO (danrubel) getter is being suggested instead of top level var |
//assertSuggestImportedTopLevelVar('T1', 'int'); |
} |
@@ -2091,6 +2118,7 @@ class C1 extends C2 implements C3 { |
F2() { } |
class B {int x;} |
class C {foo(){var f; {var x;} return a ? T^}}'''); |
+ |
await computeSuggestions(); |
// top level results are partially filtered based on first char |
assertNotSuggested('T2'); |
@@ -2100,7 +2128,7 @@ class C1 extends C2 implements C3 { |
test_ConditionalExpression_partial_thenExpression_empty() async { |
// SimpleIdentifier ConditionalExpression ReturnStatement |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
int T1; |
@@ -2112,6 +2140,7 @@ class C1 extends C2 implements C3 { |
F2() { } |
class B {int x;} |
class C {foo(){var f; {var x;} return a ? ^}}'''); |
+ |
await computeSuggestions(); |
assertNotSuggested('x'); |
assertNotSuggested('f'); |
@@ -2119,8 +2148,8 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('C'); |
assertNotSuggested('F2'); |
assertNotSuggested('T2'); |
- assertNotSuggested('A'); |
- assertNotSuggested('F1'); |
+ assertSuggestClass('A'); |
+ assertSuggestFunction('F1', 'dynamic'); |
// TODO (danrubel) getter is being suggested instead of top level var |
//assertSuggestImportedTopLevelVar('T1', 'int'); |
} |
@@ -2139,6 +2168,7 @@ class C1 extends C2 implements C3 { |
F2() { } |
class B {int x;} |
class C {foo(){var f; {var x;} return a ? T^ : c}}'''); |
+ |
await computeSuggestions(); |
// top level results are partially filtered based on first char |
assertNotSuggested('T2'); |
@@ -2160,6 +2190,7 @@ class C1 extends C2 implements C3 { |
import "/testB.dart"; |
var m; |
main() {new X.^}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -2186,6 +2217,7 @@ class C1 extends C2 implements C3 { |
import "/testB.dart"; |
var m; |
main() {new X.^}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -2203,6 +2235,7 @@ class C1 extends C2 implements C3 { |
// InstanceCreationExpression |
addTestSource(''' |
main() {new String.fr^omCharCodes([]);}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 2); |
expect(replacementLength, 13); |
@@ -2223,6 +2256,7 @@ class C1 extends C2 implements C3 { |
F1() { } |
class X {X.c(); X._d(); z() {}} |
main() {new X.^}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -2243,6 +2277,7 @@ class C1 extends C2 implements C3 { |
F1() { } |
class X {factory X.c(); factory X._d(); z() {}} |
main() {new X.^}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -2261,20 +2296,21 @@ class C1 extends C2 implements C3 { |
foo() { } |
void bar() { } |
class A {a(blat: ^) { }}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('foo'); |
assertNotSuggested('a'); |
assertNotSuggested('A'); |
- assertNotSuggested('String'); |
- assertNotSuggested('identical'); |
+ assertSuggestClass('String'); |
+ assertSuggestFunction('identical', 'bool'); |
assertNotSuggested('bar'); |
} |
test_ExpressionStatement_identifier() async { |
// SimpleIdentifier ExpressionStatement Block |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
_B F1() { } |
@@ -2285,11 +2321,12 @@ class C1 extends C2 implements C3 { |
typedef int F2(int blat); |
class Clz = Object with Object; |
class C {foo(){^} void bar() {}}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('A'); |
- assertNotSuggested('F1'); |
+ assertSuggestClass('A'); |
+ assertSuggestFunction('F1', '_B'); |
assertNotSuggested('C'); |
assertNotSuggested('foo'); |
assertNotSuggested('bar'); |
@@ -2310,6 +2347,7 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
import "/testA.dart"; |
class C {a() {C ^}}'''); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -2321,6 +2359,7 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
import "/testA.dart"; |
class C {A ^}'''); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -2332,6 +2371,7 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
import "/testA.dart"; |
class C {var ^}'''); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -2348,65 +2388,71 @@ class C1 extends C2 implements C3 { |
test_ForEachStatement_body_typed() async { |
// Block ForEachStatement |
addTestSource('main(args) {for (int foo in bar) {^}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('args'); |
assertNotSuggested('foo'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
} |
test_ForEachStatement_body_untyped() async { |
// Block ForEachStatement |
addTestSource('main(args) {for (foo in bar) {^}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('args'); |
assertNotSuggested('foo'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
} |
test_ForEachStatement_iterable() async { |
// SimpleIdentifier ForEachStatement Block |
addTestSource('main(args) {for (int foo in ^) {}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('args'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
} |
test_ForEachStatement_loopVariable() async { |
// SimpleIdentifier ForEachStatement Block |
addTestSource('main(args) {for (^ in args) {}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('args'); |
- assertNotSuggested('String'); |
+ assertSuggestClass('String'); |
} |
test_ForEachStatement_loopVariable_type() async { |
// SimpleIdentifier ForEachStatement Block |
addTestSource('main(args) {for (^ foo in args) {}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('args'); |
assertNotSuggested('foo'); |
- assertNotSuggested('String'); |
+ assertSuggestClass('String'); |
} |
test_ForEachStatement_loopVariable_type2() async { |
// DeclaredIdentifier ForEachStatement Block |
addTestSource('main(args) {for (S^ foo in args) {}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
assertNotSuggested('args'); |
assertNotSuggested('foo'); |
- assertNotSuggested('String'); |
+ assertSuggestClass('String'); |
} |
test_FormalParameterList() async { |
@@ -2415,13 +2461,14 @@ class C1 extends C2 implements C3 { |
foo() { } |
void bar() { } |
class A {a(^) { }}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('foo'); |
assertNotSuggested('a'); |
assertNotSuggested('A'); |
- assertNotSuggested('String'); |
+ assertSuggestClass('String'); |
assertNotSuggested('identical'); |
assertNotSuggested('bar'); |
} |
@@ -2429,16 +2476,18 @@ class C1 extends C2 implements C3 { |
test_ForStatement_body() async { |
// Block ForStatement |
addTestSource('main(args) {for (int i; i < 10; ++i) {^}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('i'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
} |
test_ForStatement_condition() async { |
// SimpleIdentifier ForStatement |
addTestSource('main() {for (int index = 0; i^)}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
@@ -2448,17 +2497,19 @@ class C1 extends C2 implements C3 { |
test_ForStatement_initializer() async { |
// SimpleIdentifier ForStatement |
addTestSource('main() {List a; for (^)}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('a'); |
- assertNotSuggested('Object'); |
- assertNotSuggested('int'); |
+ assertSuggestClass('Object'); |
+ assertSuggestClass('int'); |
} |
test_ForStatement_updaters() async { |
// SimpleIdentifier ForStatement |
addTestSource('main() {for (int index = 0; index < 10; i^)}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
@@ -2470,6 +2521,7 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
void bar() { } |
main() {for (int index = 0; index < 10; ++i^)}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
@@ -2480,7 +2532,7 @@ class C1 extends C2 implements C3 { |
test_FunctionDeclaration_returnType_afterComment() async { |
// ClassDeclaration CompilationUnit |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
int T1; |
@@ -2494,14 +2546,15 @@ class C1 extends C2 implements C3 { |
typedef D2(); |
class C2 { } |
/* */ ^ zoo(z) { } String name;'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('Object'); |
- assertNotSuggested('T1'); |
+ assertSuggestClass('Object'); |
+ assertSuggestTopLevelVar('T1', 'int'); |
assertNotSuggested('F1'); |
- assertNotSuggested('D1'); |
- assertNotSuggested('C1'); |
+ assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
+ assertSuggestClass('C1'); |
assertNotSuggested('T2'); |
assertNotSuggested('F2'); |
assertNotSuggested('D2'); |
@@ -2511,7 +2564,7 @@ class C1 extends C2 implements C3 { |
test_FunctionDeclaration_returnType_afterComment2() async { |
// FunctionDeclaration ClassDeclaration CompilationUnit |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
int T1; |
@@ -2525,14 +2578,15 @@ class C1 extends C2 implements C3 { |
typedef D2(); |
class C2 { } |
/** */ ^ zoo(z) { } String name;'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('Object'); |
- assertNotSuggested('T1'); |
+ assertSuggestClass('Object'); |
+ assertSuggestTopLevelVar('T1', 'int'); |
assertNotSuggested('F1'); |
- assertNotSuggested('D1'); |
- assertNotSuggested('C1'); |
+ assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
+ assertSuggestClass('C1'); |
assertNotSuggested('T2'); |
assertNotSuggested('F2'); |
assertNotSuggested('D2'); |
@@ -2542,7 +2596,7 @@ class C1 extends C2 implements C3 { |
test_FunctionDeclaration_returnType_afterComment3() async { |
// FunctionDeclaration ClassDeclaration CompilationUnit |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
int T1; |
@@ -2557,14 +2611,15 @@ class C1 extends C2 implements C3 { |
/// some dartdoc |
class C2 { } |
^ zoo(z) { } String name;'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('Object'); |
- assertNotSuggested('T1'); |
+ assertSuggestClass('Object'); |
+ assertSuggestTopLevelVar('T1', 'int'); |
assertNotSuggested('F1'); |
- assertNotSuggested('D1'); |
- assertNotSuggested('C1'); |
+ assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
+ assertSuggestClass('C1'); |
assertNotSuggested('T2'); |
assertNotSuggested('F2'); |
assertNotSuggested('D2'); |
@@ -2576,28 +2631,29 @@ class C1 extends C2 implements C3 { |
// Block BlockFunctionBody FunctionExpression |
addTestSource(''' |
void bar() { } |
- String foo(List args) {x.then((R b) {^}'''); |
- await computeSuggestions(); |
+ String foo(List args) {x.then((R b) {^});}'''); |
+ await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('foo'); |
assertNotSuggested('bar'); |
assertNotSuggested('args'); |
assertNotSuggested('b'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
} |
test_IfStatement() async { |
// SimpleIdentifier IfStatement |
addTestSource(''' |
class A {var b; X _c; foo() {A a; if (true) ^}}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('b'); |
assertNotSuggested('_c'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('A'); |
assertNotSuggested('=='); |
} |
@@ -2607,25 +2663,27 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
class A {int x; int y() => 0;} |
main(){var a; if (^)}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('a'); |
assertNotSuggested('main'); |
assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
} |
test_IfStatement_empty() async { |
// SimpleIdentifier IfStatement |
addTestSource(''' |
class A {var b; X _c; foo() {A a; if (^) something}}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('b'); |
assertNotSuggested('_c'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('A'); |
assertNotSuggested('=='); |
} |
@@ -2634,10 +2692,11 @@ class C1 extends C2 implements C3 { |
// SimpleIdentifier PrefixIdentifier IfStatement |
addTestSource(''' |
main() {var a; if (a.^) something}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertSuggestMethod('toString', 'Object', 'String'); |
+ assertNotSuggested('toString'); |
assertNotSuggested('Object'); |
assertNotSuggested('A'); |
assertNotSuggested('=='); |
@@ -2648,13 +2707,14 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
import "dart^"; |
main() {}'''); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
test_IndexExpression() async { |
// ExpressionStatement Block |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
int T1; |
@@ -2666,6 +2726,7 @@ class C1 extends C2 implements C3 { |
F2() { } |
class B {int x;} |
class C {foo(){var f; {var x;} f[^]}}'''); |
+ |
await computeSuggestions(); |
assertNotSuggested('x'); |
assertNotSuggested('f'); |
@@ -2673,8 +2734,8 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('C'); |
assertNotSuggested('F2'); |
assertNotSuggested('T2'); |
- assertNotSuggested('A'); |
- assertNotSuggested('F1'); |
+ assertSuggestClass('A'); |
+ assertSuggestFunction('F1', 'dynamic'); |
// TODO (danrubel) getter is being suggested instead of top level var |
//assertSuggestImportedTopLevelVar('T1', 'int'); |
} |
@@ -2693,6 +2754,7 @@ class C1 extends C2 implements C3 { |
F2() { } |
class B {int x;} |
class C {foo(){var f; {var x;} f[T^]}}'''); |
+ |
await computeSuggestions(); |
// top level results are partially filtered based on first char |
assertNotSuggested('T2'); |
@@ -2715,12 +2777,14 @@ class C1 extends C2 implements C3 { |
F2() { } |
class B {B(this.x, [String boo]) { } int x;} |
class C {foo(){var f; {var x;} new ^}}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('Object'); |
- assertNotSuggested('Future'); |
- assertNotSuggested('A'); |
+ assertSuggestConstructor('Object'); |
+ assertSuggestConstructor('Future'); |
+ assertSuggestConstructor('A'); |
+ // Suggested by ConstructorContributor |
assertNotSuggested('B'); |
assertNotSuggested('C'); |
assertNotSuggested('f'); |
@@ -2728,7 +2792,7 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('foo'); |
assertNotSuggested('F1'); |
assertNotSuggested('F2'); |
- assertNotSuggested('T1'); |
+ assertSuggestTopLevelVar('T1', null); |
assertNotSuggested('T2'); |
} |
@@ -2736,9 +2800,11 @@ class C1 extends C2 implements C3 { |
// SimpleIdentifier TypeName ConstructorName InstanceCreationExpression |
addSource('/testAB.dart', 'class Foo { }'); |
addTestSource('class C {foo(){new F^}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
+ // Not imported, so not suggested |
assertNotSuggested('Future'); |
assertNotSuggested('Foo'); |
} |
@@ -2759,12 +2825,13 @@ class C1 extends C2 implements C3 { |
typedef D2(); |
class C2 { } |
main() {String name; print("hello \$^");}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('Object'); |
- // TODO(danrubel) should return top level var rather than getter |
- assertNotSuggested('F1'); |
+ assertSuggestTopLevelVar('T1', null); |
+ assertSuggestFunction('F1', null); |
assertNotSuggested('D1'); |
assertNotSuggested('C1'); |
assertNotSuggested('T2'); |
@@ -2790,13 +2857,17 @@ class C1 extends C2 implements C3 { |
typedef D2(); |
class C2 { } |
main() {String name; print("hello \${^}");}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('Object'); |
- assertNotSuggested('F1'); |
- assertNotSuggested('D1'); |
- assertNotSuggested('C1'); |
+ assertSuggestClass('Object'); |
+ // Simulate unresolved imported library |
+ // in which case suggestions will have null (unresolved) returnType |
+ assertSuggestTopLevelVar('T1', null); |
+ assertSuggestFunction('F1', null); |
+ assertSuggestFunctionTypeAlias('D1', 'null'); |
+ assertSuggestClass('C1'); |
assertNotSuggested('T2'); |
assertNotSuggested('F2'); |
assertNotSuggested('D2'); |
@@ -2807,19 +2878,21 @@ class C1 extends C2 implements C3 { |
test_InterpolationExpression_block2() async { |
// SimpleIdentifier InterpolationExpression StringInterpolation |
addTestSource('main() {String name; print("hello \${n^}");}'); |
+ |
await computeSuggestions(); |
assertNotSuggested('name'); |
// top level results are partially filtered |
- //assertNotSuggested('Object'); |
+ //assertSuggestClass('Object'); |
} |
test_InterpolationExpression_prefix_selector() async { |
// SimpleIdentifier PrefixedIdentifier InterpolationExpression |
addTestSource('main() {String name; print("hello \${name.^}");}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
assertNotSuggested('name'); |
assertNotSuggested('Object'); |
assertNotSuggested('=='); |
@@ -2828,6 +2901,7 @@ class C1 extends C2 implements C3 { |
test_InterpolationExpression_prefix_selector2() async { |
// SimpleIdentifier PrefixedIdentifier InterpolationExpression |
addTestSource('main() {String name; print("hello \$name.^");}'); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -2835,10 +2909,11 @@ class C1 extends C2 implements C3 { |
test_InterpolationExpression_prefix_target() async { |
// SimpleIdentifier PrefixedIdentifier InterpolationExpression |
addTestSource('main() {String name; print("hello \${nam^e.length}");}'); |
+ |
await computeSuggestions(); |
assertNotSuggested('name'); |
// top level results are partially filtered |
- //assertNotSuggested('Object'); |
+ //assertSuggestClass('Object'); |
assertNotSuggested('length'); |
} |
@@ -2854,10 +2929,11 @@ class C1 extends C2 implements C3 { |
import "/testB.dart"; |
class Y {Y.c(); Y._d(); z() {}} |
main() {var x; if (x is ^) { }}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('X'); |
+ assertSuggestClass('X'); |
assertNotSuggested('Y'); |
assertNotSuggested('x'); |
assertNotSuggested('main'); |
@@ -2871,6 +2947,7 @@ class C1 extends C2 implements C3 { |
void bar() { } |
class A {int x; int y() => 0;} |
main(){var a; if (^ is A)}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -2879,7 +2956,7 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('foo'); |
assertNotSuggested('bar'); |
assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
} |
test_IsExpression_type() async { |
@@ -2887,13 +2964,14 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
class A {int x; int y() => 0;} |
main(){var a; if (a is ^)}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('a'); |
assertNotSuggested('main'); |
assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
} |
test_IsExpression_type_partial() async { |
@@ -2901,17 +2979,18 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
class A {int x; int y() => 0;} |
main(){var a; if (a is Obj^)}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 3); |
expect(replacementLength, 3); |
assertNotSuggested('a'); |
assertNotSuggested('main'); |
assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
} |
- test_keyword2() async { |
- addSource( |
+ test_keyword() async { |
+ resolveSource( |
'/testB.dart', |
''' |
lib B; |
@@ -2924,14 +3003,16 @@ class C1 extends C2 implements C3 { |
String newer() {} |
var m; |
main() {new^ X.c();}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 3); |
expect(replacementLength, 3); |
assertNotSuggested('c'); |
assertNotSuggested('_d'); |
// Imported suggestion are filtered by 1st character |
- assertNotSuggested('nowIsIt'); |
- assertNotSuggested('T1'); |
+ assertSuggestFunction('nowIsIt', 'dynamic'); |
+ assertSuggestTopLevelVar('T1', 'int'); |
+ assertSuggestTopLevelVar('newT1', 'int'); |
assertNotSuggested('z'); |
assertNotSuggested('m'); |
assertNotSuggested('newer'); |
@@ -2940,26 +3021,36 @@ class C1 extends C2 implements C3 { |
test_Literal_list() async { |
// ']' ListLiteral ArgumentList MethodInvocation |
addTestSource('main() {var Some; print([^]);}'); |
+ |
await computeSuggestions(); |
assertNotSuggested('Some'); |
- assertNotSuggested('String'); |
+ assertSuggestClass('String'); |
} |
test_Literal_list2() async { |
// SimpleIdentifier ListLiteral ArgumentList MethodInvocation |
addTestSource('main() {var Some; print([S^]);}'); |
+ |
await computeSuggestions(); |
assertNotSuggested('Some'); |
- assertNotSuggested('String'); |
+ assertSuggestClass('String'); |
} |
test_Literal_string() async { |
// SimpleStringLiteral ExpressionStatement Block |
addTestSource('class A {a() {"hel^lo"}}'); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
+ test_localVariableDeclarationName() async { |
+ addTestSource('main() {String m^}'); |
+ await computeSuggestions(); |
+ assertNotSuggested('main'); |
+ assertNotSuggested('min'); |
+ } |
+ |
test_MapLiteralEntry() async { |
// MapLiteralEntry MapLiteral VariableDeclaration |
addSource( |
@@ -2976,13 +3067,15 @@ class C1 extends C2 implements C3 { |
typedef D2(); |
class C2 { } |
foo = {^'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('Object'); |
- assertNotSuggested('F1'); |
- assertNotSuggested('D1'); |
- assertNotSuggested('C1'); |
+ assertSuggestClass('Object'); |
+ assertSuggestTopLevelVar('T1', null); |
+ assertSuggestFunction('F1', null); |
+ assertSuggestFunctionTypeAlias('D1', 'null'); |
+ assertSuggestClass('C1'); |
assertNotSuggested('T2'); |
assertNotSuggested('F2'); |
assertNotSuggested('D2'); |
@@ -3005,15 +3098,19 @@ class C1 extends C2 implements C3 { |
typedef D2(); |
class C2 { } |
foo = {T^'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
+ // Simulate unresolved imported library, |
+ // in which case suggestions will have null return types (unresolved) |
+ assertSuggestTopLevelVar('T1', null); |
assertNotSuggested('T2'); |
} |
test_MapLiteralEntry2() async { |
// SimpleIdentifier MapLiteralEntry MapLiteral VariableDeclaration |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
int T1; |
@@ -3027,15 +3124,18 @@ class C1 extends C2 implements C3 { |
typedef D2(); |
class C2 { } |
foo = {7:T^};'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
+ assertSuggestTopLevelVar('T1', 'int'); |
assertNotSuggested('T2'); |
} |
test_MethodDeclaration_body_getters() async { |
// Block BlockFunctionBody MethodDeclaration |
addTestSource('class A {@deprecated X get f => 0; Z a() {^} get _g => 1;}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -3067,6 +3167,7 @@ class C1 extends C2 implements C3 { |
static a3() {} |
static var a4; |
static a() {^}}'''); |
+ |
await computeSuggestions(); |
assertNotSuggested('a1'); |
assertNotSuggested('a2'); |
@@ -3085,18 +3186,20 @@ class C1 extends C2 implements C3 { |
test_MethodDeclaration_members() async { |
// Block BlockFunctionBody MethodDeclaration |
addTestSource('class A {@deprecated X f; Z _a() {^} var _g;}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('_a'); |
assertNotSuggested('f'); |
assertNotSuggested('_g'); |
- assertNotSuggested('bool'); |
+ assertSuggestClass('bool'); |
} |
test_MethodDeclaration_parameters_named() async { |
// Block BlockFunctionBody MethodDeclaration |
addTestSource('class A {@deprecated Z a(X x, _, b, {y: boo}) {^}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -3104,7 +3207,7 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('x'); |
assertNotSuggested('y'); |
assertNotSuggested('b'); |
- assertNotSuggested('int'); |
+ assertSuggestClass('int'); |
assertNotSuggested('_'); |
} |
@@ -3114,6 +3217,7 @@ class C1 extends C2 implements C3 { |
foo() { } |
void bar() { } |
class A {Z a(X x, [int y=1]) {^}}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -3122,12 +3226,12 @@ class C1 extends C2 implements C3 { |
assertNotSuggested('a'); |
assertNotSuggested('x'); |
assertNotSuggested('y'); |
- assertNotSuggested('String'); |
+ assertSuggestClass('String'); |
} |
test_MethodDeclaration_returnType() async { |
// ClassDeclaration CompilationUnit |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
int T1; |
@@ -3140,14 +3244,15 @@ class C1 extends C2 implements C3 { |
F2() { } |
typedef D2(); |
class C2 {^ zoo(z) { } String name; }'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('Object'); |
- assertNotSuggested('T1'); |
+ assertSuggestClass('Object'); |
+ assertSuggestTopLevelVar('T1', 'int'); |
assertNotSuggested('F1'); |
- assertNotSuggested('D1'); |
- assertNotSuggested('C1'); |
+ assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
+ assertSuggestClass('C1'); |
assertNotSuggested('T2'); |
assertNotSuggested('F2'); |
assertNotSuggested('D2'); |
@@ -3157,7 +3262,7 @@ class C1 extends C2 implements C3 { |
test_MethodDeclaration_returnType_afterComment() async { |
// ClassDeclaration CompilationUnit |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
int T1; |
@@ -3170,14 +3275,15 @@ class C1 extends C2 implements C3 { |
F2() { } |
typedef D2(); |
class C2 {/* */ ^ zoo(z) { } String name; }'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('Object'); |
- assertNotSuggested('T1'); |
+ assertSuggestClass('Object'); |
+ assertSuggestTopLevelVar('T1', 'int'); |
assertNotSuggested('F1'); |
- assertNotSuggested('D1'); |
- assertNotSuggested('C1'); |
+ assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
+ assertSuggestClass('C1'); |
assertNotSuggested('T2'); |
assertNotSuggested('F2'); |
assertNotSuggested('D2'); |
@@ -3187,7 +3293,7 @@ class C1 extends C2 implements C3 { |
test_MethodDeclaration_returnType_afterComment2() async { |
// MethodDeclaration ClassDeclaration CompilationUnit |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
int T1; |
@@ -3200,14 +3306,15 @@ class C1 extends C2 implements C3 { |
F2() { } |
typedef D2(); |
class C2 {/** */ ^ zoo(z) { } String name; }'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('Object'); |
- assertNotSuggested('T1'); |
+ assertSuggestClass('Object'); |
+ assertSuggestTopLevelVar('T1', 'int'); |
assertNotSuggested('F1'); |
- assertNotSuggested('D1'); |
- assertNotSuggested('C1'); |
+ assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
+ assertSuggestClass('C1'); |
assertNotSuggested('T2'); |
assertNotSuggested('F2'); |
assertNotSuggested('D2'); |
@@ -3217,7 +3324,7 @@ class C1 extends C2 implements C3 { |
test_MethodDeclaration_returnType_afterComment3() async { |
// MethodDeclaration ClassDeclaration CompilationUnit |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
int T1; |
@@ -3232,14 +3339,15 @@ class C1 extends C2 implements C3 { |
class C2 { |
/// some dartdoc |
^ zoo(z) { } String name; }'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('Object'); |
- assertNotSuggested('T1'); |
+ assertSuggestClass('Object'); |
+ assertSuggestTopLevelVar('T1', 'int'); |
assertNotSuggested('F1'); |
- assertNotSuggested('D1'); |
- assertNotSuggested('C1'); |
+ assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
+ assertSuggestClass('C1'); |
assertNotSuggested('T2'); |
assertNotSuggested('F2'); |
assertNotSuggested('D2'); |
@@ -3259,11 +3367,12 @@ class C1 extends C2 implements C3 { |
set s1(I x) {} set _s2(I x) {x.^ m(null);} |
m(X x) {} I _n(X x) {}} |
class X{}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertSuggestGetter('f', 'X'); |
- assertSuggestGetter('_g', null); |
+ assertNotSuggested('f'); |
+ assertNotSuggested('_g'); |
assertNotSuggested('b'); |
assertNotSuggested('_c'); |
assertNotSuggested('d'); |
@@ -3281,10 +3390,11 @@ class C1 extends C2 implements C3 { |
test_new_instance() async { |
addTestSource('import "dart:math"; class A {x() {new Random().^}}'); |
+ |
await computeSuggestions(); |
- assertSuggestMethod('nextBool', 'Random', 'bool'); |
- assertSuggestMethod('nextDouble', 'Random', 'double'); |
- assertSuggestMethod('nextInt', 'Random', 'int'); |
+ assertNotSuggested('nextBool'); |
+ assertNotSuggested('nextDouble'); |
+ assertNotSuggested('nextInt'); |
assertNotSuggested('Random'); |
assertNotSuggested('Object'); |
assertNotSuggested('A'); |
@@ -3318,16 +3428,20 @@ class C1 extends C2 implements C3 { |
part of libA; |
class B { factory B.bar(int x) => null; } |
main() {new ^}'''); |
+ |
+ await computeLibrariesContaining(); |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
+ // Suggested by ConstructorContributor |
assertNotSuggested('B.bar'); |
- assertNotSuggested('Object'); |
- assertNotSuggested('X.c'); |
+ assertSuggestConstructor('Object'); |
+ assertSuggestConstructor('X.c'); |
assertNotSuggested('X._d'); |
+ // Suggested by LocalLibraryContributor |
assertNotSuggested('A'); |
assertNotSuggested('F1'); |
- assertNotSuggested('T1'); |
+ assertSuggestTopLevelVar('T1', 'int'); |
assertNotSuggested('_d'); |
assertNotSuggested('z'); |
assertNotSuggested('m'); |
@@ -3338,7 +3452,7 @@ class C1 extends C2 implements C3 { |
addSource( |
'/testB.dart', |
''' |
- lib B; |
+ lib libB; |
int T1; |
F1() { } |
class X {X.c(); X._d(); z() {}}'''); |
@@ -3354,16 +3468,20 @@ class C1 extends C2 implements C3 { |
class A { A({String boo: 'hoo'}) { } } |
main() {new ^} |
var m;'''); |
+ |
+ await computeLibrariesContaining(); |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
+ // Suggested by ConstructorContributor |
assertNotSuggested('A'); |
- assertNotSuggested('Object'); |
- assertNotSuggested('X.c'); |
+ assertSuggestConstructor('Object'); |
+ assertSuggestConstructor('X.c'); |
assertNotSuggested('X._d'); |
+ // Suggested by LocalLibraryContributor |
assertNotSuggested('B'); |
assertNotSuggested('F1'); |
- assertNotSuggested('T1'); |
+ assertSuggestTopLevelVar('T1', 'int'); |
assertNotSuggested('_d'); |
assertNotSuggested('z'); |
assertNotSuggested('m'); |
@@ -3392,6 +3510,7 @@ class C1 extends C2 implements C3 { |
static const String scA = 'foo'; |
w() { }} |
main() {A.^}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -3434,19 +3553,20 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
import "/testB.dart"; |
main() {A a; a.^}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('sc'); |
- assertSuggestField('b', null, isDeprecated: true); |
+ assertNotSuggested('b'); |
assertNotSuggested('_c'); |
- assertSuggestGetter('d', 'X'); |
+ assertNotSuggested('d'); |
assertNotSuggested('_e'); |
- assertSuggestGetter('f', 'X'); |
+ assertNotSuggested('f'); |
assertNotSuggested('_g'); |
- assertSuggestSetter('s1'); |
+ assertNotSuggested('s1'); |
assertNotSuggested('_s2'); |
- assertSuggestMethod('m', 'A', null); |
+ assertNotSuggested('m'); |
assertNotSuggested('_n'); |
assertNotSuggested('a'); |
assertNotSuggested('A'); |
@@ -3467,20 +3587,21 @@ class C1 extends C2 implements C3 { |
set s1(I x) {} set _s2(I x) {} |
m(X x) {} I _n(X x) {}} |
class X{}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
assertNotSuggested('sc'); |
- assertSuggestField('b', null); |
- assertSuggestField('_c', 'X'); |
- assertSuggestGetter('d', 'X'); |
- assertSuggestGetter('_e', null); |
- assertSuggestGetter('f', 'X'); |
- assertSuggestGetter('_g', null); |
- assertSuggestSetter('s1'); |
- assertSuggestSetter('_s2'); |
- assertSuggestMethod('m', 'A', null); |
- assertSuggestMethod('_n', 'A', 'I'); |
+ assertNotSuggested('b'); |
+ assertNotSuggested('_c'); |
+ assertNotSuggested('d'); |
+ assertNotSuggested('_e'); |
+ assertNotSuggested('f'); |
+ assertNotSuggested('_g'); |
+ assertNotSuggested('s1'); |
+ assertNotSuggested('_s2'); |
+ assertNotSuggested('m'); |
+ assertNotSuggested('_n'); |
assertNotSuggested('a'); |
assertNotSuggested('A'); |
assertNotSuggested('X'); |
@@ -3491,8 +3612,9 @@ class C1 extends C2 implements C3 { |
test_PrefixedIdentifier_getter() async { |
// SimpleIdentifier PrefixedIdentifier ExpressionStatement |
addTestSource('String get g => "one"; f() {g.^}'); |
+ |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
} |
test_PrefixedIdentifier_library() async { |
@@ -3509,6 +3631,7 @@ class C1 extends C2 implements C3 { |
var T2; |
class A { } |
main() {b.^}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -3537,6 +3660,7 @@ class C1 extends C2 implements C3 { |
var T2; |
class A { } |
foo(b.^ f) {}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -3565,6 +3689,7 @@ class C1 extends C2 implements C3 { |
var T2; |
class A { } |
foo(b.^) {}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -3591,10 +3716,11 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
import "/testB.dart"; |
foo(X x) {x.^}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertSuggestField('y', 'M'); |
+ assertNotSuggested('y'); |
assertNotSuggested('_z'); |
assertNotSuggested('=='); |
} |
@@ -3609,10 +3735,11 @@ class C1 extends C2 implements C3 { |
addTestSource(''' |
import "/testA.dart"; |
class X {foo(){A^.bar}}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
- assertNotSuggested('A'); |
+ assertSuggestClass('A'); |
assertNotSuggested('X'); |
assertNotSuggested('foo'); |
assertNotSuggested('bar'); |
@@ -3622,114 +3749,121 @@ class C1 extends C2 implements C3 { |
test_PrefixedIdentifier_propertyAccess() async { |
// PrefixedIdentifier ExpressionStatement Block BlockFunctionBody |
addTestSource('class A {String x; int get foo {x.^}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertSuggestGetter('isEmpty', 'bool'); |
- assertSuggestMethod('compareTo', 'Comparable', 'int'); |
+ assertNotSuggested('isEmpty'); |
+ assertNotSuggested('compareTo'); |
} |
test_PrefixedIdentifier_propertyAccess_newStmt() async { |
// PrefixedIdentifier ExpressionStatement Block BlockFunctionBody |
addTestSource('class A {String x; int get foo {x.^ int y = 0;}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertSuggestGetter('isEmpty', 'bool'); |
- assertSuggestMethod('compareTo', 'Comparable', 'int'); |
+ assertNotSuggested('isEmpty'); |
+ assertNotSuggested('compareTo'); |
} |
test_PrefixedIdentifier_trailingStmt_const() async { |
// SimpleIdentifier PrefixedIdentifier ExpressionStatement |
addTestSource('const String g = "hello"; f() {g.^ int y = 0;}'); |
+ |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
} |
test_PrefixedIdentifier_trailingStmt_field() async { |
// SimpleIdentifier PrefixedIdentifier ExpressionStatement |
addTestSource('class A {String g; f() {g.^ int y = 0;}}'); |
+ |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
} |
test_PrefixedIdentifier_trailingStmt_function() async { |
// SimpleIdentifier PrefixedIdentifier ExpressionStatement |
addTestSource('String g() => "one"; f() {g.^ int y = 0;}'); |
+ |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
} |
test_PrefixedIdentifier_trailingStmt_functionTypeAlias() async { |
// SimpleIdentifier PrefixedIdentifier ExpressionStatement |
addTestSource('typedef String g(); f() {g.^ int y = 0;}'); |
+ |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
} |
test_PrefixedIdentifier_trailingStmt_getter() async { |
// SimpleIdentifier PrefixedIdentifier ExpressionStatement |
addTestSource('String get g => "one"; f() {g.^ int y = 0;}'); |
+ |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
} |
test_PrefixedIdentifier_trailingStmt_local_typed() async { |
// SimpleIdentifier PrefixedIdentifier ExpressionStatement |
addTestSource('f() {String g; g.^ int y = 0;}'); |
+ |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
} |
test_PrefixedIdentifier_trailingStmt_local_untyped() async { |
// SimpleIdentifier PrefixedIdentifier ExpressionStatement |
addTestSource('f() {var g = "hello"; g.^ int y = 0;}'); |
+ |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
} |
test_PrefixedIdentifier_trailingStmt_method() async { |
// SimpleIdentifier PrefixedIdentifier ExpressionStatement |
addTestSource('class A {String g() {}; f() {g.^ int y = 0;}}'); |
+ |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
} |
test_PrefixedIdentifier_trailingStmt_param() async { |
// SimpleIdentifier PrefixedIdentifier ExpressionStatement |
addTestSource('class A {f(String g) {g.^ int y = 0;}}'); |
- await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
- } |
- test_localVariableDeclarationName() async { |
- addTestSource('main() {String m^}'); |
await computeSuggestions(); |
- assertNotSuggested('main'); |
- assertNotSuggested('min'); |
+ assertNotSuggested('length'); |
} |
test_PrefixedIdentifier_trailingStmt_param2() async { |
// SimpleIdentifier PrefixedIdentifier ExpressionStatement |
addTestSource('f(String g) {g.^ int y = 0;}'); |
+ |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
} |
test_PrefixedIdentifier_trailingStmt_topLevelVar() async { |
// SimpleIdentifier PrefixedIdentifier ExpressionStatement |
addTestSource('String g; f() {g.^ int y = 0;}'); |
+ |
await computeSuggestions(); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
} |
test_PropertyAccess_expression() async { |
// SimpleIdentifier MethodInvocation PropertyAccess ExpressionStatement |
addTestSource('class A {a() {"hello".to^String().length}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 2); |
expect(replacementLength, 8); |
- assertSuggestGetter('length', 'int'); |
+ assertNotSuggested('length'); |
assertNotSuggested('A'); |
assertNotSuggested('a'); |
assertNotSuggested('Object'); |
@@ -3740,6 +3874,7 @@ class C1 extends C2 implements C3 { |
// SimpleIdentifier PropertyAccess ExpressionStatement |
addSource('/testAB.dart', 'class Foo { }'); |
addTestSource('class C {foo(){.^}}'); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -3748,6 +3883,7 @@ class C1 extends C2 implements C3 { |
// SimpleIdentifier PropertyAccess ExpressionStatement |
addSource('/testAB.dart', 'class Foo { }'); |
addTestSource('main() {.^}'); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -3755,10 +3891,11 @@ class C1 extends C2 implements C3 { |
test_PropertyAccess_selector() async { |
// SimpleIdentifier PropertyAccess ExpressionStatement Block |
addTestSource('class A {a() {"hello".length.^}}'); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertSuggestGetter('isEven', 'bool'); |
+ assertNotSuggested('isEven'); |
assertNotSuggested('A'); |
assertNotSuggested('a'); |
assertNotSuggested('Object'); |
@@ -3768,6 +3905,7 @@ class C1 extends C2 implements C3 { |
test_SwitchStatement_c() async { |
// SwitchStatement Block BlockFunctionBody MethodDeclaration |
addTestSource('class A {String g(int x) {switch(x) {c^}}}'); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -3775,16 +3913,18 @@ class C1 extends C2 implements C3 { |
test_SwitchStatement_case() async { |
// SwitchStatement Block BlockFunctionBody MethodDeclaration |
addTestSource('class A {String g(int x) {var t; switch(x) {case 0: ^}}}'); |
+ |
await computeSuggestions(); |
assertNotSuggested('A'); |
assertNotSuggested('g'); |
assertNotSuggested('t'); |
- assertNotSuggested('String'); |
+ assertSuggestClass('String'); |
} |
test_SwitchStatement_empty() async { |
// SwitchStatement Block BlockFunctionBody MethodDeclaration |
addTestSource('class A {String g(int x) {switch(x) {^}}}'); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -3803,19 +3943,20 @@ class C1 extends C2 implements C3 { |
set s1(I x) {} set _s2(I x) {this.^ m(null);} |
m(X x) {} I _n(X x) {}} |
class X{}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertSuggestField('b', null); |
- assertSuggestField('_c', 'X'); |
- assertSuggestGetter('d', 'X'); |
- assertSuggestGetter('_e', null); |
- assertSuggestGetter('f', 'X'); |
- assertSuggestGetter('_g', null); |
- assertSuggestMethod('m', 'A', null); |
- assertSuggestMethod('_n', 'A', 'I'); |
- assertSuggestSetter('s1'); |
- assertSuggestSetter('_s2'); |
+ assertNotSuggested('b'); |
+ assertNotSuggested('_c'); |
+ assertNotSuggested('d'); |
+ assertNotSuggested('_e'); |
+ assertNotSuggested('f'); |
+ assertNotSuggested('_g'); |
+ assertNotSuggested('m'); |
+ assertNotSuggested('_n'); |
+ assertNotSuggested('s1'); |
+ assertNotSuggested('_s2'); |
assertNotSuggested('z'); |
assertNotSuggested('I'); |
assertNotSuggested('A'); |
@@ -3838,19 +3979,20 @@ class C1 extends C2 implements C3 { |
set s1(I x) {} set _s2(I x) {m(null);} |
m(X x) {} I _n(X x) {}} |
class X{}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertSuggestField('b', null); |
- assertSuggestField('_c', 'X'); |
- assertSuggestGetter('d', 'X'); |
- assertSuggestGetter('_e', null); |
- assertSuggestGetter('f', 'X'); |
- assertSuggestGetter('_g', null); |
- assertSuggestMethod('m', 'A', null); |
- assertSuggestMethod('_n', 'A', 'I'); |
- assertSuggestSetter('s1'); |
- assertSuggestSetter('_s2'); |
+ assertNotSuggested('b'); |
+ assertNotSuggested('_c'); |
+ assertNotSuggested('d'); |
+ assertNotSuggested('_e'); |
+ assertNotSuggested('f'); |
+ assertNotSuggested('_g'); |
+ assertNotSuggested('m'); |
+ assertNotSuggested('_n'); |
+ assertNotSuggested('s1'); |
+ assertNotSuggested('_s2'); |
assertNotSuggested('z'); |
assertNotSuggested('I'); |
assertNotSuggested('A'); |
@@ -3873,6 +4015,7 @@ class C1 extends C2 implements C3 { |
set s1(I x) {} set _s2(I x) {m(null);} |
m(X x) {} I _n(X x) {}} |
class X{}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -3910,6 +4053,7 @@ class C1 extends C2 implements C3 { |
set s1(I x) {} set _s2(I x) {m(null);} |
m(X x) {} I _n(X x) {}} |
class X{}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
@@ -3946,6 +4090,7 @@ class C1 extends C2 implements C3 { |
set s1(I x) {} set _s2(I x) {m(null);} |
m(X x) {} I _n(X x) {}} |
class X{}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 1); |
@@ -3982,6 +4127,7 @@ class C1 extends C2 implements C3 { |
set s1(I x) {} set _s2(I x) {m(null);} |
m(X x) {} I _n(X x) {}} |
class X{}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
@@ -4008,6 +4154,7 @@ class C1 extends C2 implements C3 { |
// SimpleIdentifier VariableDeclaration VariableDeclarationList |
// TopLevelVariableDeclaration |
addTestSource('class A {} B ^'); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -4016,13 +4163,14 @@ class C1 extends C2 implements C3 { |
// SimpleIdentifier VariableDeclaration VariableDeclarationList |
// TopLevelVariableDeclaration |
addTestSource('class A {} var ^'); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
test_TypeArgumentList() async { |
// SimpleIdentifier BinaryExpression ExpressionStatement |
- addSource( |
+ resolveSource( |
'/testA.dart', |
''' |
class C1 {int x;} |
@@ -4035,12 +4183,13 @@ class C1 extends C2 implements C3 { |
typedef int T2(int blat); |
class C<E> {} |
main() { C<^> c; }'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('Object'); |
- assertNotSuggested('C1'); |
- assertNotSuggested('T1'); |
+ assertSuggestClass('Object'); |
+ assertSuggestClass('C1'); |
+ assertSuggestFunctionTypeAlias('T1', 'String'); |
assertNotSuggested('C2'); |
assertNotSuggested('T2'); |
assertNotSuggested('F1'); |
@@ -4062,10 +4211,11 @@ class C1 extends C2 implements C3 { |
typedef int T2(int blat); |
class C<E> {} |
main() { C<C^> c; }'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset - 1); |
expect(replacementLength, 1); |
- assertNotSuggested('C1'); |
+ assertSuggestClass('C1'); |
assertNotSuggested('C2'); |
} |
@@ -4083,6 +4233,7 @@ class C1 extends C2 implements C3 { |
import "/testB.dart"; |
class Y {Y.c(); Y._d(); z() {}} |
main() {var ^}'''); |
+ |
await computeSuggestions(); |
assertNoSuggestions(); |
} |
@@ -4090,8 +4241,9 @@ class C1 extends C2 implements C3 { |
test_VariableDeclarationList_final() async { |
// VariableDeclarationList VariableDeclarationStatement Block |
addTestSource('main() {final ^} class C { }'); |
+ |
await computeSuggestions(); |
- assertNotSuggested('Object'); |
+ assertSuggestClass('Object'); |
assertNotSuggested('C'); |
assertNotSuggested('=='); |
} |
@@ -4110,10 +4262,11 @@ class C1 extends C2 implements C3 { |
import "/testB.dart"; |
class Y {Y.c(); Y._d(); z() {}} |
class C {bar(){var f; {var x;} var e = ^}}'''); |
+ |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('X'); |
+ assertSuggestClass('X'); |
assertNotSuggested('_B'); |
assertNotSuggested('Y'); |
assertNotSuggested('C'); |
@@ -4125,7 +4278,7 @@ class C1 extends C2 implements C3 { |
test_VariableDeclarationStatement_RHS_missing_semicolon() async { |
// VariableDeclaration VariableDeclarationList |
// VariableDeclarationStatement |
- addSource( |
+ resolveSource( |
'/testB.dart', |
''' |
lib B; |
@@ -4142,8 +4295,8 @@ class C1 extends C2 implements C3 { |
await computeSuggestions(); |
expect(replacementOffset, completionOffset); |
expect(replacementLength, 0); |
- assertNotSuggested('X'); |
- assertNotSuggested('foo1'); |
+ assertSuggestClass('X'); |
+ assertSuggestFunction('foo1', 'dynamic'); |
assertNotSuggested('bar1'); |
assertNotSuggested('foo2'); |
assertNotSuggested('bar2'); |