| // 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. |
| |
| 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/imported_reference_contributor.dart'; |
| import 'package:analyzer/src/generated/engine.dart'; |
| import 'package:analyzer/src/generated/source.dart'; |
| import 'package:test/test.dart'; |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| |
| import 'completion_contributor_util.dart'; |
| |
| main() { |
| defineReflectiveSuite(() { |
| defineReflectiveTests(ImportedReferenceContributorTest); |
| }); |
| } |
| |
| @reflectiveTest |
| class ImportedReferenceContributorTest extends DartCompletionContributorTest { |
| @override |
| bool get isNullExpectedReturnTypeConsideredDynamic => false; |
| |
| @override |
| DartCompletionContributor createContributor() { |
| return new ImportedReferenceContributor(); |
| } |
| |
| /// Sanity check. Permutations tested in local_ref_contributor. |
| test_ArgDefaults_function_with_required_named() async { |
| addMetaPackageSource(); |
| |
| resolveSource('/testB.dart', ''' |
| lib B; |
| import 'package:meta/meta.dart'; |
| |
| bool foo(int bar, {bool boo, @required int baz}) => false; |
| '''); |
| |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}"; |
| |
| void main() {f^}'''); |
| await computeSuggestions(); |
| |
| assertSuggestFunction('foo', 'bool', |
| defaultArgListString: 'bar, baz: null'); |
| } |
| |
| test_ArgumentList() async { |
| // ArgumentList MethodInvocation ExpressionStatement Block |
| resolveSource('/libA.dart', ''' |
| library A; |
| bool hasLength(int expected) { } |
| void baz() { }'''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B { } |
| String bar() => true; |
| void main() {expect(^)}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
| assertNotSuggested('bar'); |
| assertSuggestFunction('hasLength', 'bool'); |
| assertSuggestFunction('identical', 'bool'); |
| assertNotSuggested('B'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('main'); |
| assertNotSuggested('baz'); |
| assertNotSuggested('print'); |
| } |
| |
| test_ArgumentList_imported_function() async { |
| // ArgumentList MethodInvocation ExpressionStatement Block |
| resolveSource('/libA.dart', ''' |
| library A; |
| bool hasLength(int expected) { } |
| expect(arg) { } |
| void baz() { }'''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}' |
| class B { } |
| String bar() => true; |
| void main() {expect(^)}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
| assertNotSuggested('bar'); |
| assertSuggestFunction('hasLength', 'bool'); |
| assertSuggestFunction('identical', 'bool'); |
| assertNotSuggested('B'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('main'); |
| assertNotSuggested('baz'); |
| assertNotSuggested('print'); |
| } |
| |
| test_ArgumentList_InstanceCreationExpression_functionalArg() async { |
| // ArgumentList InstanceCreationExpression ExpressionStatement Block |
| addSource('/libA.dart', ''' |
| library A; |
| class A { A(f()) { } } |
| bool hasLength(int expected) { } |
| void baz() { }'''); |
| addTestSource(''' |
| import 'dart:async'; |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B { } |
| String bar() => true; |
| void main() {new A(^)}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
| assertNotSuggested('bar'); |
| assertSuggestFunction('hasLength', 'bool', |
| kind: CompletionSuggestionKind.IDENTIFIER); |
| assertSuggestFunction('identical', 'bool', |
| kind: CompletionSuggestionKind.IDENTIFIER); |
| assertNotSuggested('B'); |
| assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER); |
| assertSuggestClass('Object', kind: CompletionSuggestionKind.IDENTIFIER); |
| assertNotSuggested('main'); |
| assertNotSuggested('baz'); |
| assertNotSuggested('print'); |
| } |
| |
| test_ArgumentList_InstanceCreationExpression_typedefArg() async { |
| // ArgumentList InstanceCreationExpression ExpressionStatement Block |
| addSource('/libA.dart', ''' |
| library A; |
| typedef Funct(); |
| class A { A(Funct f) { } } |
| bool hasLength(int expected) { } |
| void baz() { }'''); |
| addTestSource(''' |
| import 'dart:async'; |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B { } |
| String bar() => true; |
| void main() {new A(^)}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
| assertNotSuggested('bar'); |
| assertSuggestFunction('hasLength', 'bool', |
| kind: CompletionSuggestionKind.IDENTIFIER); |
| assertSuggestFunction('identical', 'bool', |
| kind: CompletionSuggestionKind.IDENTIFIER); |
| assertNotSuggested('B'); |
| assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER); |
| assertSuggestClass('Object', kind: CompletionSuggestionKind.IDENTIFIER); |
| assertNotSuggested('main'); |
| assertNotSuggested('baz'); |
| assertNotSuggested('print'); |
| } |
| |
| test_ArgumentList_local_function() async { |
| // ArgumentList MethodInvocation ExpressionStatement Block |
| resolveSource('/libA.dart', ''' |
| library A; |
| bool hasLength(int expected) { } |
| void baz() { }'''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}' |
| expect(arg) { } |
| class B { } |
| String bar() => true; |
| void main() {expect(^)}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
| assertNotSuggested('bar'); |
| assertSuggestFunction('hasLength', 'bool'); |
| assertSuggestFunction('identical', 'bool'); |
| assertNotSuggested('B'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('main'); |
| assertNotSuggested('baz'); |
| assertNotSuggested('print'); |
| } |
| |
| test_ArgumentList_local_method() async { |
| // ArgumentList MethodInvocation ExpressionStatement Block |
| resolveSource('/libA.dart', ''' |
| library A; |
| bool hasLength(int expected) { } |
| void baz() { }'''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}' |
| class B { |
| expect(arg) { } |
| void foo() {expect(^)}} |
| String bar() => true;'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
| assertNotSuggested('bar'); |
| assertSuggestFunction('hasLength', 'bool'); |
| assertSuggestFunction('identical', 'bool'); |
| assertNotSuggested('B'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('main'); |
| assertNotSuggested('baz'); |
| assertNotSuggested('print'); |
| } |
| |
| test_ArgumentList_MethodInvocation_functionalArg() async { |
| // ArgumentList MethodInvocation ExpressionStatement Block |
| addSource('/libA.dart', ''' |
| library A; |
| class A { A(f()) { } } |
| bool hasLength(int expected) { } |
| void baz() { }'''); |
| addTestSource(''' |
| import 'dart:async'; |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B { } |
| String bar(f()) => true; |
| void main() {bar(^);}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNoSuggestions(kind: CompletionSuggestionKind.ARGUMENT_LIST); |
| assertNotSuggested('bar'); |
| assertSuggestFunction('hasLength', 'bool', |
| kind: CompletionSuggestionKind.IDENTIFIER); |
| assertSuggestFunction('identical', 'bool', |
| kind: CompletionSuggestionKind.IDENTIFIER); |
| assertNotSuggested('B'); |
| assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER); |
| assertSuggestClass('Object', kind: CompletionSuggestionKind.IDENTIFIER); |
| assertNotSuggested('main'); |
| assertNotSuggested('baz'); |
| assertNotSuggested('print'); |
| } |
| |
| test_ArgumentList_MethodInvocation_methodArg() async { |
| // ArgumentList MethodInvocation ExpressionStatement Block |
| addSource('/libA.dart', ''' |
| library A; |
| class A { A(f()) { } } |
| bool hasLength(int expected) { } |
| void baz() { }'''); |
| addTestSource(''' |
| import 'dart:async'; |
| import '${convertAbsolutePathToUri('/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); |
| assertSuggestFunction('hasLength', 'bool', |
| kind: CompletionSuggestionKind.IDENTIFIER); |
| assertSuggestFunction('identical', 'bool', |
| kind: CompletionSuggestionKind.IDENTIFIER); |
| assertNotSuggested('B'); |
| assertSuggestClass('A', kind: CompletionSuggestionKind.IDENTIFIER); |
| assertSuggestClass('Object', kind: CompletionSuggestionKind.IDENTIFIER); |
| assertNotSuggested('main'); |
| assertNotSuggested('baz'); |
| assertNotSuggested('print'); |
| } |
| |
| test_ArgumentList_namedParam() async { |
| // SimpleIdentifier NamedExpression ArgumentList MethodInvocation |
| // ExpressionStatement |
| addSource('/libA.dart', ''' |
| library A; |
| bool hasLength(int expected) { }'''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}' |
| String bar() => true; |
| void main() {expect(foo: ^)}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('bar'); |
| // An unresolved imported library will produce suggestions |
| // with a null returnType |
| // The current DartCompletionRequest#resolveExpression resolves |
| // the world (which it should not) and causes the imported library |
| // to be resolved. |
| assertSuggestFunction('hasLength', /* null */ 'bool'); |
| assertNotSuggested('main'); |
| } |
| |
| test_AsExpression() async { |
| // 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'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('A'); |
| assertNotSuggested('=='); |
| } |
| |
| test_AsExpression_type_subtype_extends_filter() async { |
| // SimpleIdentifier TypeName AsExpression IfStatement |
| addSource('/testB.dart', ''' |
| foo() { } |
| class A {} class B extends A {} class C extends B {} |
| class X {X.c(); X._d(); z() {}}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}"; |
| main(){A a; if (a as ^)}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('B'); |
| assertSuggestClass('C'); |
| assertNotSuggested('A'); |
| assertNotSuggested('X'); |
| assertNotSuggested('Object'); |
| assertNotSuggested('a'); |
| assertNotSuggested('main'); |
| } |
| |
| test_AsExpression_type_subtype_implements_filter() async { |
| // SimpleIdentifier TypeName AsExpression IfStatement |
| addSource('/testB.dart', ''' |
| foo() { } |
| class A {} class B implements A {} class C implements B {} |
| class X {X.c(); X._d(); z() {}}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}"; |
| main(){A a; if (a as ^)}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('B'); |
| assertSuggestClass('C'); |
| assertNotSuggested('A'); |
| assertNotSuggested('X'); |
| assertNotSuggested('Object'); |
| assertNotSuggested('a'); |
| assertNotSuggested('main'); |
| } |
| |
| test_AssignmentExpression_name() async { |
| // SimpleIdentifier VariableDeclaration VariableDeclarationList |
| // VariableDeclarationStatement Block |
| addTestSource('class A {} main() {int a; int ^b = 1;}'); |
| |
| await computeSuggestions(); |
| assertNoSuggestions(); |
| } |
| |
| test_AssignmentExpression_RHS() async { |
| // 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'); |
| assertSuggestClass('Object'); |
| } |
| |
| test_AssignmentExpression_type() async { |
| // SimpleIdentifier TypeName VariableDeclarationList |
| // VariableDeclarationStatement Block |
| addTestSource(''' |
| class A {} main() { |
| int a; |
| ^ b = 1;}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('A'); |
| 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. |
| // Consider suggesting only types |
| // if only spaces separates the 1st and 2nd identifiers. |
| //assertNotSuggested('a'); |
| //assertNotSuggested('main'); |
| //assertNotSuggested('identical'); |
| } |
| |
| test_AssignmentExpression_type_newline() async { |
| // SimpleIdentifier TypeName VariableDeclarationList |
| // VariableDeclarationStatement Block |
| addTestSource(''' |
| class A {} main() { |
| int a; |
| ^ |
| b = 1;}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('A'); |
| 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'); |
| assertSuggestFunction('identical', 'bool'); |
| } |
| |
| test_AssignmentExpression_type_partial() async { |
| // SimpleIdentifier TypeName VariableDeclarationList |
| // VariableDeclarationStatement Block |
| addTestSource(''' |
| class A {} main() { |
| int a; |
| int^ b = 1;}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset - 3); |
| expect(replacementLength, 3); |
| assertNotSuggested('A'); |
| 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. |
| // Consider suggesting only types |
| // if only spaces separates the 1st and 2nd identifiers. |
| //assertNotSuggested('a'); |
| //assertNotSuggested('main'); |
| //assertNotSuggested('identical'); |
| } |
| |
| test_AssignmentExpression_type_partial_newline() async { |
| // SimpleIdentifier TypeName VariableDeclarationList |
| // VariableDeclarationStatement Block |
| addTestSource(''' |
| class A {} main() { |
| int a; |
| i^ |
| b = 1;}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset - 1); |
| expect(replacementLength, 1); |
| assertNotSuggested('A'); |
| 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'); |
| assertSuggestFunction('identical', 'bool'); |
| } |
| |
| test_AwaitExpression() async { |
| // SimpleIdentifier AwaitExpression ExpressionStatement |
| 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'); |
| assertSuggestClass('Object'); |
| } |
| |
| test_AwaitExpression_function() async { |
| resolveSource('/libA.dart', ''' |
| Future y() async {return 0;} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/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 "${convertAbsolutePathToUri('/testB.dart')}"; |
| class B extends A { |
| foo() async {await ^} |
| } |
| '''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('a'); |
| assertNotSuggested('main'); |
| assertSuggestClass('A'); |
| if (suggestConstructorsWithoutNew) { |
| assertSuggestConstructor('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'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('b'); |
| } |
| |
| test_BinaryExpression_RHS() async { |
| // SimpleIdentifier BinaryExpression VariableDeclaration |
| // VariableDeclarationList VariableDeclarationStatement |
| addTestSource('main() {int a = 1, b = 2 + ^;}'); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('a'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('b'); |
| assertNotSuggested('=='); |
| } |
| |
| test_Block() async { |
| // Block BlockFunctionBody MethodDeclaration |
| addSource('/testAB.dart', ''' |
| export "dart:math" hide max; |
| class A {int x;} |
| @deprecated D1() {int x;} |
| class _B {boo() { partBoo() {}} }'''); |
| 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 "${convertAbsolutePathToUri('/testAB.dart')}"; |
| import "${convertAbsolutePathToUri('/testCD.dart')}" hide D; |
| import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE; |
| import "${convertAbsolutePathToUri('/testG.dart')}" as g; |
| int T5; |
| var _T6; |
| String get T7 => 'hello'; |
| set T8(int value) { partT8() {} } |
| Z D2() {int x;} |
| class X { |
| int get clog => 8; |
| set blog(value) { } |
| a() { |
| var f; |
| localF(int arg1) { } |
| {var x;} |
| ^ var r; |
| } |
| void b() { }} |
| class Z { }'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| |
| assertNotSuggested('X'); |
| assertNotSuggested('Z'); |
| assertNotSuggested('a'); |
| assertNotSuggested('b'); |
| assertNotSuggested('localF'); |
| assertNotSuggested('f'); |
| // Don't suggest locals out of scope |
| assertNotSuggested('r'); |
| assertNotSuggested('x'); |
| assertNotSuggested('partT8'); |
| |
| assertSuggestClass('A', elemFile: '/testAB.dart'); |
| if (suggestConstructorsWithoutNew) { |
| assertSuggestConstructor('A'); |
| } |
| assertNotSuggested('_B'); |
| assertSuggestClass('C'); |
| assertNotSuggested('partBoo'); |
| // hidden element suggested as low relevance |
| // but imported results are partially filtered |
| //assertSuggestClass('D', COMPLETION_RELEVANCE_LOW); |
| //assertSuggestFunction( |
| // 'D1', null, true, COMPLETION_RELEVANCE_LOW); |
| assertNotSuggested('D2'); |
| assertSuggestClass('EE'); |
| // hidden element suggested as low relevance |
| //assertSuggestClass('F', COMPLETION_RELEVANCE_LOW); |
| // Suggested by LibraryPrefixContributor |
| assertNotSuggested('g'); |
| assertSuggestClass('g.G', elemName: 'G'); |
| assertNotSuggested('G'); |
| //assertSuggestClass('H', COMPLETION_RELEVANCE_LOW); |
| assertSuggestClass('Object'); |
| // assertSuggestFunction('min', 'T'); |
| //assertSuggestFunction( |
| // 'max', |
| // 'num', |
| // false, |
| // COMPLETION_RELEVANCE_LOW); |
| assertSuggestTopLevelVar('T1', null); |
| assertNotSuggested('_T2'); |
| //assertSuggestImportedTopLevelVar('T3', 'int', COMPLETION_RELEVANCE_LOW); |
| assertNotSuggested('_T4'); |
| assertNotSuggested('T5'); |
| assertNotSuggested('_T6'); |
| assertNotSuggested('=='); |
| assertNotSuggested('T7'); |
| assertNotSuggested('T8'); |
| assertNotSuggested('clog'); |
| assertNotSuggested('blog'); |
| // TODO (danrubel) suggest HtmlElement as low relevance |
| assertNotSuggested('HtmlElement'); |
| assertSuggestClass('Uri'); |
| assertNotSuggested('parseIPv6Address'); |
| assertNotSuggested('parseHex'); |
| } |
| |
| test_Block_final() async { |
| // Block BlockFunctionBody MethodDeclaration |
| addSource('/testAB.dart', ''' |
| export "dart:math" hide max; |
| class A {int x;} |
| @deprecated D1() {int x;} |
| class _B {boo() { partBoo() {}} }'''); |
| 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 "${convertAbsolutePathToUri('/testAB.dart')}"; |
| import "${convertAbsolutePathToUri('/testCD.dart')}" hide D; |
| import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE; |
| import "${convertAbsolutePathToUri('/testG.dart')}" as g; |
| int T5; |
| var _T6; |
| String get T7 => 'hello'; |
| set T8(int value) { partT8() {} } |
| Z D2() {int x;} |
| class X { |
| int get clog => 8; |
| set blog(value) { } |
| a() { |
| var f; |
| localF(int arg1) { } |
| {var x;} |
| final ^ |
| } |
| void b() { }} |
| class Z { }'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| |
| assertNotSuggested('X'); |
| assertNotSuggested('Z'); |
| assertNotSuggested('a'); |
| assertNotSuggested('b'); |
| assertNotSuggested('localF'); |
| assertNotSuggested('f'); |
| // Don't suggest locals out of scope |
| assertNotSuggested('r'); |
| assertNotSuggested('x'); |
| assertNotSuggested('partT8'); |
| |
| assertSuggestClass('A'); |
| assertNotSuggested('_B'); |
| assertSuggestClass('C'); |
| assertNotSuggested('partBoo'); |
| // hidden element suggested as low relevance |
| // but imported results are partially filtered |
| //assertSuggestClass('D', COMPLETION_RELEVANCE_LOW); |
| //assertSuggestFunction( |
| // 'D1', null, true, COMPLETION_RELEVANCE_LOW); |
| assertNotSuggested('D2'); |
| assertSuggestClass('EE'); |
| // hidden element suggested as low relevance |
| //assertSuggestClass('F', COMPLETION_RELEVANCE_LOW); |
| // Suggested by LibraryPrefixContributor |
| assertNotSuggested('g'); |
| assertSuggestClass('g.G', elemName: 'G'); |
| //assertSuggestClass('H', COMPLETION_RELEVANCE_LOW); |
| assertSuggestClass('Object'); |
| assertNotSuggested('min'); |
| //assertSuggestFunction( |
| // 'max', |
| // 'num', |
| // false, |
| // COMPLETION_RELEVANCE_LOW); |
| assertNotSuggested('T1'); |
| assertNotSuggested('_T2'); |
| //assertSuggestImportedTopLevelVar('T3', 'int', COMPLETION_RELEVANCE_LOW); |
| assertNotSuggested('_T4'); |
| assertNotSuggested('T5'); |
| assertNotSuggested('_T6'); |
| assertNotSuggested('=='); |
| assertNotSuggested('T7'); |
| assertNotSuggested('T8'); |
| assertNotSuggested('clog'); |
| assertNotSuggested('blog'); |
| // TODO (danrubel) suggest HtmlElement as low relevance |
| assertNotSuggested('HtmlElement'); |
| assertSuggestClass('Uri'); |
| assertNotSuggested('parseIPv6Address'); |
| assertNotSuggested('parseHex'); |
| } |
| |
| test_Block_final2() async { |
| addTestSource('main() {final S^ v;}'); |
| |
| await computeSuggestions(); |
| assertSuggestClass('String'); |
| } |
| |
| test_Block_final3() async { |
| addTestSource('main() {final ^ v;}'); |
| |
| await computeSuggestions(); |
| assertSuggestClass('String'); |
| } |
| |
| test_Block_final_final() async { |
| // Block BlockFunctionBody MethodDeclaration |
| addSource('/testAB.dart', ''' |
| export "dart:math" hide max; |
| class A {int x;} |
| @deprecated D1() {int x;} |
| class _B {boo() { partBoo() {}} }'''); |
| 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 "${convertAbsolutePathToUri('/testAB.dart')}"; |
| import "${convertAbsolutePathToUri('/testCD.dart')}" hide D; |
| import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE; |
| import "${convertAbsolutePathToUri('/testG.dart')}" as g hide G; |
| int T5; |
| var _T6; |
| String get T7 => 'hello'; |
| set T8(int value) { partT8() {} } |
| Z D2() {int x;} |
| class X { |
| int get clog => 8; |
| set blog(value) { } |
| a() { |
| final ^ |
| final var f; |
| localF(int arg1) { } |
| {var x;} |
| } |
| void b() { }} |
| class Z { }'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| |
| assertNotSuggested('X'); |
| assertNotSuggested('Z'); |
| assertNotSuggested('a'); |
| assertNotSuggested('b'); |
| assertNotSuggested('localF'); |
| assertNotSuggested('f'); |
| // Don't suggest locals out of scope |
| assertNotSuggested('r'); |
| assertNotSuggested('x'); |
| assertNotSuggested('partT8'); |
| |
| assertSuggestClass('A'); |
| assertNotSuggested('_B'); |
| assertSuggestClass('C'); |
| assertNotSuggested('partBoo'); |
| // hidden element suggested as low relevance |
| // but imported results are partially filtered |
| //assertSuggestClass('D', COMPLETION_RELEVANCE_LOW); |
| //assertSuggestFunction( |
| // 'D1', null, true, COMPLETION_RELEVANCE_LOW); |
| assertNotSuggested('D2'); |
| assertSuggestClass('EE'); |
| // hidden element suggested as low relevance |
| //assertSuggestClass('F', COMPLETION_RELEVANCE_LOW); |
| // Suggested by LibraryPrefixContributor |
| assertNotSuggested('g'); |
| assertNotSuggested('G'); |
| // Hidden elements not suggested |
| assertNotSuggested('g.G'); |
| //assertSuggestClass('H', COMPLETION_RELEVANCE_LOW); |
| assertSuggestClass('Object'); |
| assertNotSuggested('min'); |
| //assertSuggestFunction( |
| // 'max', |
| // 'num', |
| // false, |
| // COMPLETION_RELEVANCE_LOW); |
| assertNotSuggested('T1'); |
| assertNotSuggested('_T2'); |
| //assertSuggestImportedTopLevelVar('T3', 'int', COMPLETION_RELEVANCE_LOW); |
| assertNotSuggested('_T4'); |
| assertNotSuggested('T5'); |
| assertNotSuggested('_T6'); |
| assertNotSuggested('=='); |
| assertNotSuggested('T7'); |
| assertNotSuggested('T8'); |
| assertNotSuggested('clog'); |
| assertNotSuggested('blog'); |
| // TODO (danrubel) suggest HtmlElement as low relevance |
| assertNotSuggested('HtmlElement'); |
| assertSuggestClass('Uri'); |
| assertNotSuggested('parseIPv6Address'); |
| assertNotSuggested('parseHex'); |
| } |
| |
| test_Block_final_var() async { |
| // Block BlockFunctionBody MethodDeclaration |
| addSource('/testAB.dart', ''' |
| export "dart:math" hide max; |
| class A {int x;} |
| @deprecated D1() {int x;} |
| class _B {boo() { partBoo() {}} }'''); |
| 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 "${convertAbsolutePathToUri('/testAB.dart')}"; |
| import "${convertAbsolutePathToUri('/testCD.dart')}" hide D; |
| import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE; |
| import "${convertAbsolutePathToUri('/testG.dart')}" as g; |
| int T5; |
| var _T6; |
| String get T7 => 'hello'; |
| set T8(int value) { partT8() {} } |
| Z D2() {int x;} |
| class X { |
| int get clog => 8; |
| set blog(value) { } |
| a() { |
| final ^ |
| var f; |
| localF(int arg1) { } |
| {var x;} |
| } |
| void b() { }} |
| class Z { }'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| |
| assertNotSuggested('X'); |
| assertNotSuggested('Z'); |
| assertNotSuggested('a'); |
| assertNotSuggested('b'); |
| assertNotSuggested('localF'); |
| assertNotSuggested('f'); |
| // Don't suggest locals out of scope |
| assertNotSuggested('r'); |
| assertNotSuggested('x'); |
| assertNotSuggested('partT8'); |
| |
| assertSuggestClass('A'); |
| assertNotSuggested('_B'); |
| assertSuggestClass('C'); |
| assertNotSuggested('partBoo'); |
| // hidden element suggested as low relevance |
| // but imported results are partially filtered |
| //assertSuggestClass('D', COMPLETION_RELEVANCE_LOW); |
| //assertSuggestFunction( |
| // 'D1', null, true, COMPLETION_RELEVANCE_LOW); |
| assertNotSuggested('D2'); |
| assertSuggestClass('EE'); |
| // hidden element suggested as low relevance |
| //assertSuggestClass('F', COMPLETION_RELEVANCE_LOW); |
| // Suggested by LibraryPrefixContributor |
| assertNotSuggested('g'); |
| assertSuggestClass('g.G', elemName: 'G'); |
| //assertSuggestClass('H', COMPLETION_RELEVANCE_LOW); |
| assertSuggestClass('Object'); |
| assertNotSuggested('min'); |
| //assertSuggestFunction( |
| // 'max', |
| // 'num', |
| // false, |
| // COMPLETION_RELEVANCE_LOW); |
| assertNotSuggested('T1'); |
| assertNotSuggested('_T2'); |
| //assertSuggestImportedTopLevelVar('T3', 'int', COMPLETION_RELEVANCE_LOW); |
| assertNotSuggested('_T4'); |
| assertNotSuggested('T5'); |
| assertNotSuggested('_T6'); |
| assertNotSuggested('=='); |
| assertNotSuggested('T7'); |
| assertNotSuggested('T8'); |
| assertNotSuggested('clog'); |
| assertNotSuggested('blog'); |
| // TODO (danrubel) suggest HtmlElement as low relevance |
| assertNotSuggested('HtmlElement'); |
| assertSuggestClass('Uri'); |
| assertNotSuggested('parseIPv6Address'); |
| assertNotSuggested('parseHex'); |
| } |
| |
| test_Block_identifier_partial() async { |
| resolveSource('/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 DF { }'''); |
| addSource('/testG.dart', 'class G { }'); |
| addSource('/testH.dart', ''' |
| class H { } |
| class D3 { } |
| int T3; |
| var _T4;'''); // not imported |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testAB.dart')}"; |
| import "${convertAbsolutePathToUri('/testCD.dart')}" hide D; |
| import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE; |
| import "${convertAbsolutePathToUri('/testG.dart')}" as g; |
| int T5; |
| var _T6; |
| Z D2() {int x;} |
| class X {a() {var f; {var x;} D^ var r;} void b() { }} |
| class Z { }'''); |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset - 1); |
| expect(replacementLength, 1); |
| |
| assertNotSuggested('X'); |
| assertNotSuggested('Z'); |
| assertNotSuggested('a'); |
| assertNotSuggested('b'); |
| assertNotSuggested('f'); |
| // Don't suggest locals out of scope |
| assertNotSuggested('r'); |
| assertNotSuggested('x'); |
| |
| // imported elements are portially filtered |
| //assertSuggestClass('A'); |
| assertNotSuggested('_B'); |
| // hidden element not suggested |
| assertNotSuggested('D'); |
| assertSuggestFunction('D1', 'dynamic', |
| isDeprecated: true, relevance: DART_RELEVANCE_LOW); |
| assertNotSuggested('D2'); |
| // Not imported, so not suggested |
| assertNotSuggested('D3'); |
| //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, |
| // COMPLETION_RELEVANCE_LOW); |
| //assertSuggestTopLevelVarGetterSetter('T1', 'String'); |
| assertNotSuggested('_T2'); |
| //assertSuggestImportedTopLevelVar('T3', 'int', COMPLETION_RELEVANCE_LOW); |
| assertNotSuggested('_T4'); |
| //assertNotSuggested('T5'); |
| //assertNotSuggested('_T6'); |
| assertNotSuggested('=='); |
| // TODO (danrubel) suggest HtmlElement as low relevance |
| assertNotSuggested('HtmlElement'); |
| } |
| |
| test_Block_inherited_imported() async { |
| // Block BlockFunctionBody MethodDeclaration ClassDeclaration |
| addSource('/testB.dart', ''' |
| lib B; |
| class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; } |
| class E extends F { var e1; e2() { } } |
| class I { int i1; i2() { } } |
| class M { var m1; int m2() { } }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}"; |
| class A extends E implements I with M {a() {^}}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| // TODO (danrubel) prefer fields over getters |
| // If add `get e1;` to interface I |
| // then suggestions include getter e1 rather than field e1 |
| assertNotSuggested('e1'); |
| assertNotSuggested('f1'); |
| assertNotSuggested('i1'); |
| assertNotSuggested('m1'); |
| assertNotSuggested('f3'); |
| assertNotSuggested('f4'); |
| assertNotSuggested('e2'); |
| assertNotSuggested('f2'); |
| assertNotSuggested('i2'); |
| //assertNotSuggested('m2', null, null); |
| assertNotSuggested('=='); |
| } |
| |
| test_Block_inherited_local() async { |
| // Block BlockFunctionBody MethodDeclaration ClassDeclaration |
| addTestSource(''' |
| class F { var f1; f2() { } get f3 => 0; set f4(fx) { } } |
| class E extends F { var e1; e2() { } } |
| class I { int i1; i2() { } } |
| class M { var m1; int m2() { } } |
| class A extends E implements I with M {a() {^}}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('e1'); |
| assertNotSuggested('f1'); |
| assertNotSuggested('i1'); |
| assertNotSuggested('m1'); |
| assertNotSuggested('f3'); |
| assertNotSuggested('f4'); |
| assertNotSuggested('e2'); |
| assertNotSuggested('f2'); |
| assertNotSuggested('i2'); |
| assertNotSuggested('m2'); |
| } |
| |
| test_Block_local_function() async { |
| addSource('/testAB.dart', ''' |
| export "dart:math" hide max; |
| class A {int x;} |
| @deprecated D1() {int x;} |
| class _B {boo() { partBoo() {}} }'''); |
| 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 "${convertAbsolutePathToUri('/testAB.dart')}"; |
| import "${convertAbsolutePathToUri('/testCD.dart')}" hide D; |
| import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE; |
| import "${convertAbsolutePathToUri('/testG.dart')}" as g; |
| int T5; |
| var _T6; |
| String get T7 => 'hello'; |
| set T8(int value) { partT8() {} } |
| Z D2() {int x;} |
| class X { |
| int get clog => 8; |
| set blog(value) { } |
| a() { |
| var f; |
| localF(int arg1) { } |
| {var x;} |
| p^ var r; |
| } |
| 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 "${convertAbsolutePathToUri('/testB.dart')}"; |
| import "${convertAbsolutePathToUri('/testCD.dart')}" hide D; |
| import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE; |
| import "${convertAbsolutePathToUri('/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'); |
| if (suggestConstructorsWithoutNew) { |
| assertSuggestConstructor('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'); |
| assertNotSuggested('Foo2'); |
| assertNotSuggested('Future'); |
| } |
| |
| test_CascadeExpression_selector1() async { |
| // PropertyAccess CascadeExpression ExpressionStatement Block |
| addSource('/testB.dart', ''' |
| class B { }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/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); |
| assertNotSuggested('b'); |
| assertNotSuggested('_c'); |
| assertNotSuggested('Object'); |
| assertNotSuggested('A'); |
| assertNotSuggested('B'); |
| assertNotSuggested('X'); |
| assertNotSuggested('z'); |
| assertNotSuggested('=='); |
| } |
| |
| test_CascadeExpression_selector2() async { |
| // SimpleIdentifier PropertyAccess CascadeExpression ExpressionStatement |
| addSource('/testB.dart', ''' |
| class B { }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}"; |
| class A {var b; X _c;} |
| class X{} |
| main() {A a; a..^z}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 1); |
| assertNotSuggested('b'); |
| assertNotSuggested('_c'); |
| assertNotSuggested('Object'); |
| assertNotSuggested('A'); |
| assertNotSuggested('B'); |
| assertNotSuggested('X'); |
| assertNotSuggested('z'); |
| assertNotSuggested('=='); |
| } |
| |
| test_CascadeExpression_selector2_withTrailingReturn() async { |
| // PropertyAccess CascadeExpression ExpressionStatement Block |
| addSource('/testB.dart', ''' |
| class B { }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}"; |
| class A {var b; X _c;} |
| class X{} |
| main() {A a; a..^ return}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('b'); |
| assertNotSuggested('_c'); |
| assertNotSuggested('Object'); |
| assertNotSuggested('A'); |
| assertNotSuggested('B'); |
| assertNotSuggested('X'); |
| assertNotSuggested('z'); |
| assertNotSuggested('=='); |
| } |
| |
| test_CascadeExpression_target() async { |
| // SimpleIdentifier CascadeExpression ExpressionStatement |
| addTestSource(''' |
| class A {var b; X _c;} |
| class X{} |
| main() {A a; a^..b}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset - 1); |
| expect(replacementLength, 1); |
| assertNotSuggested('b'); |
| assertNotSuggested('_c'); |
| assertNotSuggested('a'); |
| assertNotSuggested('A'); |
| assertNotSuggested('X'); |
| // top level results are partially filtered |
| //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'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('a'); |
| assertNotSuggested('x'); |
| } |
| |
| 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'); |
| 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'); |
| 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'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('x'); |
| } |
| |
| test_ClassDeclaration_body() async { |
| // ClassDeclaration CompilationUnit |
| addSource('/testB.dart', ''' |
| class B { }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('testB.dart')}" as x; |
| @deprecated class A {^} |
| class _B {} |
| A T;'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('A'); |
| assertNotSuggested('_B'); |
| CompletionSuggestion suggestionO = assertSuggestClass('Object'); |
| if (suggestionO != null) { |
| expect(suggestionO.element.isDeprecated, isFalse); |
| expect(suggestionO.element.isPrivate, isFalse); |
| } |
| assertNotSuggested('T'); |
| // Suggested by LibraryPrefixContributor |
| assertNotSuggested('x'); |
| } |
| |
| test_ClassDeclaration_body_final() async { |
| // ClassDeclaration CompilationUnit |
| addSource('/testB.dart', ''' |
| class B { }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('testB.dart')}" as x; |
| class A {final ^} |
| class _B {} |
| A T;'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('A'); |
| assertNotSuggested('_B'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('T'); |
| // Suggested by LibraryPrefixContributor |
| assertNotSuggested('x'); |
| } |
| |
| test_ClassDeclaration_body_final_field() async { |
| // ClassDeclaration CompilationUnit |
| addSource('/testB.dart', ''' |
| class B { }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('testB.dart')}" as x; |
| class A {final ^ A(){}} |
| class _B {} |
| A T;'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('A'); |
| assertNotSuggested('_B'); |
| assertSuggestClass('String'); |
| assertNotSuggested('T'); |
| // Suggested by LibraryPrefixContributor |
| assertNotSuggested('x'); |
| } |
| |
| test_ClassDeclaration_body_final_field2() async { |
| // ClassDeclaration CompilationUnit |
| addSource('/testB.dart', ''' |
| class B { }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('testB.dart')}" as Soo; |
| class A {final S^ A();} |
| class _B {} |
| A Sew;'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset - 1); |
| expect(replacementLength, 1); |
| assertNotSuggested('A'); |
| assertNotSuggested('_B'); |
| assertSuggestClass('String'); |
| assertNotSuggested('Sew'); |
| // Suggested by LibraryPrefixContributor |
| assertNotSuggested('Soo'); |
| } |
| |
| test_ClassDeclaration_body_final_final() async { |
| // ClassDeclaration CompilationUnit |
| addSource('/testB.dart', ''' |
| class B { }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('testB.dart')}" as x; |
| class A {final ^ final foo;} |
| class _B {} |
| A T;'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('A'); |
| assertNotSuggested('_B'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('T'); |
| // Suggested by LibraryPrefixContributor |
| assertNotSuggested('x'); |
| } |
| |
| test_ClassDeclaration_body_final_var() async { |
| // ClassDeclaration CompilationUnit |
| addSource('/testB.dart', ''' |
| class B { }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('testB.dart')}" as x; |
| class A {final ^ var foo;} |
| class _B {} |
| A T;'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('A'); |
| assertNotSuggested('_B'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('T'); |
| // Suggested by LibraryPrefixContributor |
| assertNotSuggested('x'); |
| } |
| |
| test_Combinator_hide() async { |
| // SimpleIdentifier HideCombinator ImportDirective |
| addSource('/testAB.dart', ''' |
| library libAB; |
| part 'partAB.dart'; |
| class A { } |
| class B { }'''); |
| addSource('/partAB.dart', ''' |
| part of libAB; |
| var T1; |
| PB F1() => new PB(); |
| class PB { }'''); |
| addSource('/testCD.dart', ''' |
| class C { } |
| class D { }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}" hide ^; |
| import "${convertAbsolutePathToUri('/testCD.dart')}"; |
| class X {}'''); |
| |
| await computeSuggestions(); |
| assertNoSuggestions(); |
| } |
| |
| test_Combinator_show() async { |
| // SimpleIdentifier HideCombinator ImportDirective |
| addSource('/testAB.dart', ''' |
| library libAB; |
| part 'partAB.dart'; |
| class A { } |
| class B { }'''); |
| addSource('/partAB.dart', ''' |
| part of libAB; |
| var T1; |
| PB F1() => new PB(); |
| typedef PB2 F2(int blat); |
| class Clz = Object with Object; |
| class PB { }'''); |
| addSource('/testCD.dart', ''' |
| class C { } |
| class D { }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}" show ^; |
| import "${convertAbsolutePathToUri('/testCD.dart')}"; |
| class X {}'''); |
| |
| await computeSuggestions(); |
| assertNoSuggestions(); |
| } |
| |
| test_ConditionalExpression_elseExpression() async { |
| // SimpleIdentifier ConditionalExpression ReturnStatement |
| addSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| class A {int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| 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'); |
| // TODO (danrubel) getter is being suggested instead of top level var |
| //assertSuggestImportedTopLevelVar('T1', 'int'); |
| } |
| |
| test_ConditionalExpression_elseExpression_empty() async { |
| // SimpleIdentifier ConditionalExpression ReturnStatement |
| resolveSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| class A {int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| class B {int x;} |
| class C {foo(){var f; {var x;} return a ? T1 : ^}}'''); |
| |
| await computeSuggestions(); |
| assertNotSuggested('x'); |
| assertNotSuggested('f'); |
| assertNotSuggested('foo'); |
| assertNotSuggested('C'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('T2'); |
| assertSuggestClass('A'); |
| if (suggestConstructorsWithoutNew) { |
| assertSuggestConstructor('A'); |
| } |
| assertSuggestFunction('F1', 'dynamic'); |
| // TODO (danrubel) getter is being suggested instead of top level var |
| //assertSuggestImportedTopLevelVar('T1', 'int'); |
| } |
| |
| test_ConditionalExpression_partial_thenExpression() async { |
| // SimpleIdentifier ConditionalExpression ReturnStatement |
| addSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| class A {int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| 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'); |
| // TODO (danrubel) getter is being suggested instead of top level var |
| //assertSuggestImportedTopLevelVar('T1', 'int'); |
| } |
| |
| test_ConditionalExpression_partial_thenExpression_empty() async { |
| // SimpleIdentifier ConditionalExpression ReturnStatement |
| resolveSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| class A {int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| class B {int x;} |
| class C {foo(){var f; {var x;} return a ? ^}}'''); |
| |
| await computeSuggestions(); |
| assertNotSuggested('x'); |
| assertNotSuggested('f'); |
| assertNotSuggested('foo'); |
| assertNotSuggested('C'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('T2'); |
| assertSuggestClass('A'); |
| if (suggestConstructorsWithoutNew) { |
| assertSuggestConstructor('A'); |
| } |
| assertSuggestFunction('F1', 'dynamic'); |
| // TODO (danrubel) getter is being suggested instead of top level var |
| //assertSuggestImportedTopLevelVar('T1', 'int'); |
| } |
| |
| test_ConditionalExpression_thenExpression() async { |
| // SimpleIdentifier ConditionalExpression ReturnStatement |
| addSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| class A {int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| 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'); |
| // TODO (danrubel) getter is being suggested instead of top level var |
| //assertSuggestImportedTopLevelVar('T1', 'int'); |
| } |
| |
| test_ConstructorName_importedClass() async { |
| // SimpleIdentifier PrefixedIdentifier TypeName ConstructorName |
| // InstanceCreationExpression |
| addSource('/testB.dart', ''' |
| lib B; |
| int T1; |
| F1() { } |
| class X {X.c(); X._d(); z() {}}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}"; |
| var m; |
| main() {new X.^}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| // Suggested by NamedConstructorContributor |
| assertNotSuggested('c'); |
| assertNotSuggested('F1'); |
| assertNotSuggested('T1'); |
| assertNotSuggested('_d'); |
| assertNotSuggested('z'); |
| assertNotSuggested('m'); |
| } |
| |
| test_ConstructorName_importedFactory() async { |
| // SimpleIdentifier PrefixedIdentifier TypeName ConstructorName |
| // InstanceCreationExpression |
| addSource('/testB.dart', ''' |
| lib B; |
| int T1; |
| F1() { } |
| class X {factory X.c(); factory X._d(); z() {}}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}"; |
| var m; |
| main() {new X.^}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| // Suggested by NamedConstructorContributor |
| assertNotSuggested('c'); |
| assertNotSuggested('F1'); |
| assertNotSuggested('T1'); |
| assertNotSuggested('_d'); |
| assertNotSuggested('z'); |
| assertNotSuggested('m'); |
| } |
| |
| test_ConstructorName_importedFactory2() async { |
| // SimpleIdentifier PrefixedIdentifier TypeName ConstructorName |
| // InstanceCreationExpression |
| addTestSource(''' |
| main() {new String.fr^omCharCodes([]);}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset - 2); |
| expect(replacementLength, 13); |
| // Suggested by NamedConstructorContributor |
| assertNotSuggested('fromCharCodes'); |
| assertNotSuggested('isEmpty'); |
| assertNotSuggested('isNotEmpty'); |
| assertNotSuggested('length'); |
| assertNotSuggested('Object'); |
| assertNotSuggested('String'); |
| } |
| |
| test_ConstructorName_localClass() async { |
| // SimpleIdentifier PrefixedIdentifier TypeName ConstructorName |
| // InstanceCreationExpression |
| addTestSource(''' |
| int T1; |
| F1() { } |
| class X {X.c(); X._d(); z() {}} |
| main() {new X.^}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| // Suggested by NamedConstructorContributor |
| assertNotSuggested('c'); |
| assertNotSuggested('_d'); |
| assertNotSuggested('F1'); |
| assertNotSuggested('T1'); |
| assertNotSuggested('z'); |
| assertNotSuggested('m'); |
| } |
| |
| test_ConstructorName_localFactory() async { |
| // SimpleIdentifier PrefixedIdentifier TypeName ConstructorName |
| // InstanceCreationExpression |
| addTestSource(''' |
| int T1; |
| F1() { } |
| class X {factory X.c(); factory X._d(); z() {}} |
| main() {new X.^}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| // Suggested by NamedConstructorContributor |
| assertNotSuggested('c'); |
| assertNotSuggested('_d'); |
| assertNotSuggested('F1'); |
| assertNotSuggested('T1'); |
| assertNotSuggested('z'); |
| assertNotSuggested('m'); |
| } |
| |
| test_DefaultFormalParameter_named_expression() async { |
| // DefaultFormalParameter FormalParameterList MethodDeclaration |
| addTestSource(''' |
| foo() { } |
| void bar() { } |
| class A {a(blat: ^) { }}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('foo'); |
| assertNotSuggested('a'); |
| assertNotSuggested('A'); |
| assertSuggestClass('String'); |
| assertSuggestFunction('identical', 'bool'); |
| assertNotSuggested('bar'); |
| } |
| |
| test_doc_class() async { |
| addSource('/libA.dart', r''' |
| library A; |
| /// My class. |
| /// Short description. |
| /// |
| /// Longer description. |
| class A {} |
| '''); |
| addTestSource( |
| 'import "${convertAbsolutePathToUri('/libA.dart')}"; main() {^}'); |
| |
| await computeSuggestions(); |
| |
| CompletionSuggestion suggestion = assertSuggestClass('A'); |
| expect(suggestion.docSummary, 'My class.\nShort description.'); |
| expect(suggestion.docComplete, |
| 'My class.\nShort description.\n\nLonger description.'); |
| if (suggestConstructorsWithoutNew) { |
| assertSuggestConstructor('A'); |
| } |
| } |
| |
| test_doc_function() async { |
| resolveSource('/libA.dart', r''' |
| library A; |
| /// My function. |
| /// Short description. |
| /// |
| /// Longer description. |
| int myFunc() {} |
| '''); |
| addTestSource( |
| 'import "${convertAbsolutePathToUri('/libA.dart')}"; main() {^}'); |
| |
| await computeSuggestions(); |
| |
| CompletionSuggestion suggestion = assertSuggestFunction('myFunc', 'int'); |
| expect(suggestion.docSummary, 'My function.\nShort description.'); |
| expect(suggestion.docComplete, |
| 'My function.\nShort description.\n\nLonger description.'); |
| } |
| |
| test_doc_function_c_style() async { |
| resolveSource('/libA.dart', r''' |
| library A; |
| /** |
| * My function. |
| * Short description. |
| * |
| * Longer description. |
| */ |
| int myFunc() {} |
| '''); |
| addTestSource( |
| 'import "${convertAbsolutePathToUri('/libA.dart')}"; main() {^}'); |
| |
| await computeSuggestions(); |
| |
| CompletionSuggestion suggestion = assertSuggestFunction('myFunc', 'int'); |
| expect(suggestion.docSummary, 'My function.\nShort description.'); |
| expect(suggestion.docComplete, |
| 'My function.\nShort description.\n\nLonger description.'); |
| } |
| |
| test_enum() async { |
| addSource('/libA.dart', 'library A; enum E { one, two }'); |
| addTestSource( |
| 'import "${convertAbsolutePathToUri('/libA.dart')}"; main() {^}'); |
| await computeSuggestions(); |
| assertSuggestEnum('E'); |
| assertNotSuggested('one'); |
| assertNotSuggested('two'); |
| } |
| |
| test_enum_deprecated() async { |
| addSource('/libA.dart', 'library A; @deprecated enum E { one, two }'); |
| addTestSource( |
| 'import "${convertAbsolutePathToUri('/libA.dart')}"; main() {^}'); |
| await computeSuggestions(); |
| // TODO(danrube) investigate why suggestion/element is not deprecated |
| // when AST node has correct @deprecated annotation |
| assertSuggestEnum('E', isDeprecated: true); |
| assertNotSuggested('one'); |
| assertNotSuggested('two'); |
| } |
| |
| test_enum_filter() async { |
| addSource('/a.dart', ''' |
| enum E { one, two } |
| enum F { three, four } |
| '''); |
| addTestSource(''' |
| import 'a.dart'; |
| |
| void foo({E e}) {} |
| |
| main() { |
| foo(e: ^); |
| } |
| '''); |
| await computeSuggestions(); |
| |
| assertSuggestEnum('E'); |
| assertSuggestEnumConst('E.one', hasTypeBoost: true); |
| assertSuggestEnumConst('E.two', hasTypeBoost: true); |
| |
| assertSuggestEnum('F'); |
| assertSuggestEnumConst('F.three'); |
| assertSuggestEnumConst('F.four'); |
| } |
| |
| test_ExpressionStatement_identifier() async { |
| // SimpleIdentifier ExpressionStatement Block |
| resolveSource('/testA.dart', ''' |
| _B F1() { } |
| class A {int x;} |
| class _B { }'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| typedef int F2(int blat); |
| class Clz = Object with Object; |
| class C {foo(){^} void bar() {}}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('A'); |
| if (suggestConstructorsWithoutNew) { |
| assertSuggestConstructor('A'); |
| } |
| assertSuggestFunction('F1', '_B'); |
| assertNotSuggested('C'); |
| assertNotSuggested('foo'); |
| assertNotSuggested('bar'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('Clz'); |
| assertNotSuggested('C'); |
| assertNotSuggested('x'); |
| assertNotSuggested('_B'); |
| } |
| |
| test_ExpressionStatement_name() async { |
| // ExpressionStatement Block BlockFunctionBody MethodDeclaration |
| addSource('/testA.dart', ''' |
| B T1; |
| class B{}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| class C {a() {C ^}}'''); |
| |
| await computeSuggestions(); |
| assertNoSuggestions(); |
| } |
| |
| test_FieldDeclaration_name_typed() async { |
| // SimpleIdentifier VariableDeclaration VariableDeclarationList |
| // FieldDeclaration |
| addSource('/testA.dart', 'class A { }'); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| class C {A ^}'''); |
| |
| await computeSuggestions(); |
| assertNoSuggestions(); |
| } |
| |
| test_FieldDeclaration_name_var() async { |
| // SimpleIdentifier VariableDeclaration VariableDeclarationList |
| // FieldDeclaration |
| addSource('/testA.dart', 'class A { }'); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| class C {var ^}'''); |
| |
| await computeSuggestions(); |
| assertNoSuggestions(); |
| } |
| |
| test_FieldFormalParameter_in_non_constructor() async { |
| // SimpleIdentifier FieldFormalParameter FormalParameterList |
| addTestSource('class A {B(this.^foo) {}}'); |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 3); |
| assertNoSuggestions(); |
| } |
| |
| 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'); |
| 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'); |
| 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'); |
| 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'); |
| 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'); |
| 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'); |
| assertSuggestClass('String'); |
| } |
| |
| test_FormalParameterList() async { |
| // FormalParameterList MethodDeclaration |
| addTestSource(''' |
| foo() { } |
| void bar() { } |
| class A {a(^) { }}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('foo'); |
| assertNotSuggested('a'); |
| assertNotSuggested('A'); |
| assertSuggestClass('String'); |
| assertNotSuggested('identical'); |
| assertNotSuggested('bar'); |
| } |
| |
| 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'); |
| assertSuggestClass('Object'); |
| } |
| |
| test_ForStatement_condition() async { |
| // SimpleIdentifier ForStatement |
| addTestSource('main() {for (int index = 0; i^)}'); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset - 1); |
| expect(replacementLength, 1); |
| assertNotSuggested('index'); |
| } |
| |
| test_ForStatement_initializer() async { |
| addTestSource(''' |
| import 'dart:math'; |
| main() { |
| List localVar; |
| for (^) {} |
| } |
| '''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('localVar'); |
| assertNotSuggested('PI'); |
| assertSuggestClass('Object'); |
| assertSuggestClass('int'); |
| } |
| |
| test_ForStatement_initializer_variableName_afterType() async { |
| addTestSource('main() { for (String ^) }'); |
| await computeSuggestions(); |
| assertNotSuggested('int'); |
| } |
| |
| test_ForStatement_typing_inKeyword() async { |
| addTestSource('main() { for (var v i^) }'); |
| await computeSuggestions(); |
| assertNotSuggested('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); |
| assertNotSuggested('index'); |
| } |
| |
| test_ForStatement_updaters_prefix_expression() async { |
| // SimpleIdentifier PrefixExpression ForStatement |
| addTestSource(''' |
| void bar() { } |
| main() {for (int index = 0; index < 10; ++i^)}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset - 1); |
| expect(replacementLength, 1); |
| assertNotSuggested('index'); |
| assertNotSuggested('main'); |
| assertNotSuggested('bar'); |
| } |
| |
| test_function_parameters_mixed_required_and_named() async { |
| resolveSource('/libA.dart', ''' |
| int m(x, {int y}) {} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B extends A { |
| main() {^} |
| } |
| '''); |
| await computeSuggestions(); |
| 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_function_parameters_mixed_required_and_positional() async { |
| resolveSource('/libA.dart', ''' |
| void m(x, [int y]) {} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B extends A { |
| main() {^} |
| } |
| '''); |
| await computeSuggestions(); |
| 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_function_parameters_named() async { |
| resolveSource('/libA.dart', ''' |
| void m({x, int y}) {} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B extends A { |
| main() {^} |
| } |
| '''); |
| await computeSuggestions(); |
| 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_function_parameters_none() async { |
| resolveSource('/libA.dart', ''' |
| void m() {} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B extends A { |
| main() {^} |
| } |
| '''); |
| |
| await computeSuggestions(); |
| CompletionSuggestion suggestion = assertSuggestFunction('m', 'void'); |
| expect(suggestion.parameterNames, isEmpty); |
| expect(suggestion.parameterTypes, isEmpty); |
| expect(suggestion.requiredParameterCount, 0); |
| expect(suggestion.hasNamedParameters, false); |
| } |
| |
| test_function_parameters_positional() async { |
| resolveSource('/libA.dart', ''' |
| void m([x, int y]) {} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B extends A { |
| main() {^} |
| } |
| '''); |
| await computeSuggestions(); |
| 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_function_parameters_required() async { |
| resolveSource('/libA.dart', ''' |
| void m(x, int y) {} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B extends A { |
| main() {^} |
| } |
| '''); |
| await computeSuggestions(); |
| 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_FunctionDeclaration_returnType_afterComment() async { |
| // ClassDeclaration CompilationUnit |
| resolveSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| typedef D1(); |
| class C1 {C1(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| typedef D2(); |
| class C2 { } |
| /* */ ^ zoo(z) { } String name;'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('Object'); |
| assertNotSuggested('T1'); |
| assertNotSuggested('F1'); |
| assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
| assertSuggestClass('C1'); |
| assertNotSuggested('T2'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('D2'); |
| assertNotSuggested('C2'); |
| assertNotSuggested('name'); |
| } |
| |
| test_FunctionDeclaration_returnType_afterComment2() async { |
| // FunctionDeclaration ClassDeclaration CompilationUnit |
| resolveSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| typedef D1(); |
| class C1 {C1(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| typedef D2(); |
| class C2 { } |
| /** */ ^ zoo(z) { } String name;'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('Object'); |
| assertNotSuggested('T1'); |
| assertNotSuggested('F1'); |
| assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
| assertSuggestClass('C1'); |
| assertNotSuggested('T2'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('D2'); |
| assertNotSuggested('C2'); |
| assertNotSuggested('name'); |
| } |
| |
| test_FunctionDeclaration_returnType_afterComment3() async { |
| // FunctionDeclaration ClassDeclaration CompilationUnit |
| resolveSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| typedef D1(); |
| class C1 {C1(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| typedef D2(); |
| /// some dartdoc |
| class C2 { } |
| ^ zoo(z) { } String name;'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('Object'); |
| assertNotSuggested('T1'); |
| assertNotSuggested('F1'); |
| assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
| assertSuggestClass('C1'); |
| assertNotSuggested('T2'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('D2'); |
| assertNotSuggested('C2'); |
| assertNotSuggested('name'); |
| } |
| |
| test_FunctionExpression_body_function() async { |
| // Block BlockFunctionBody FunctionExpression |
| addTestSource(''' |
| void bar() { } |
| String foo(List args) {x.then((R b) {^});}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('foo'); |
| assertNotSuggested('bar'); |
| assertNotSuggested('args'); |
| assertNotSuggested('b'); |
| 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'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('A'); |
| assertNotSuggested('=='); |
| } |
| |
| test_IfStatement_condition() async { |
| // SimpleIdentifier IfStatement Block BlockFunctionBody |
| 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'); |
| 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'); |
| assertSuggestClass('Object'); |
| assertNotSuggested('A'); |
| assertNotSuggested('=='); |
| } |
| |
| test_IfStatement_invocation() async { |
| // SimpleIdentifier PrefixIdentifier IfStatement |
| addTestSource(''' |
| main() {var a; if (a.^) something}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('toString'); |
| assertNotSuggested('Object'); |
| assertNotSuggested('A'); |
| assertNotSuggested('=='); |
| } |
| |
| test_IfStatement_typing_isKeyword() async { |
| addTestSource('main() { if (v i^) }'); |
| await computeSuggestions(); |
| assertNotSuggested('int'); |
| } |
| |
| test_implicitCreation() async { |
| configurePreviewDart2(); |
| addSource('/a.dart', ''' |
| class A { |
| A.a1(); |
| A.a2(); |
| } |
| class B { |
| B.b1(); |
| B.b2(); |
| } |
| '''); |
| addTestSource(''' |
| import 'a.dart'; |
| |
| main() { |
| ^; |
| } |
| '''); |
| await computeSuggestions(); |
| |
| assertSuggestClass('A'); |
| assertSuggestConstructor('A.a1'); |
| assertSuggestConstructor('A.a2'); |
| |
| assertSuggestClass('B'); |
| assertSuggestConstructor('B.b1'); |
| assertSuggestConstructor('B.b2'); |
| } |
| |
| test_ImportDirective_dart() async { |
| // SimpleStringLiteral ImportDirective |
| addTestSource(''' |
| import "dart^"; |
| main() {}'''); |
| |
| await computeSuggestions(); |
| assertNoSuggestions(); |
| } |
| |
| test_IndexExpression() async { |
| // ExpressionStatement Block |
| resolveSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| class A {int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| class B {int x;} |
| class C {foo(){var f; {var x;} f[^]}}'''); |
| |
| await computeSuggestions(); |
| assertNotSuggested('x'); |
| assertNotSuggested('f'); |
| assertNotSuggested('foo'); |
| assertNotSuggested('C'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('T2'); |
| assertSuggestClass('A'); |
| if (suggestConstructorsWithoutNew) { |
| assertSuggestConstructor('A'); |
| } |
| assertSuggestFunction('F1', 'dynamic'); |
| // TODO (danrubel) getter is being suggested instead of top level var |
| //assertSuggestImportedTopLevelVar('T1', 'int'); |
| } |
| |
| test_IndexExpression2() async { |
| // SimpleIdentifier IndexExpression ExpressionStatement Block |
| addSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| class A {int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| 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'); |
| // TODO (danrubel) getter is being suggested instead of top level var |
| //assertSuggestImportedTopLevelVar('T1', 'int'); |
| } |
| |
| 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 "${convertAbsolutePathToUri('/testA.dart')}"; |
| import "dart:math" as math; |
| main() {new ^ String x = "hello";}'''); |
| |
| await computeSuggestions(); |
| CompletionSuggestion suggestion; |
| |
| suggestion = assertSuggestConstructor('Object'); |
| expect(suggestion.element.parameters, '()'); |
| expect(suggestion.parameterNames, hasLength(0)); |
| expect(suggestion.requiredParameterCount, 0); |
| expect(suggestion.hasNamedParameters, false); |
| |
| suggestion = assertSuggestConstructor('A'); |
| expect(suggestion.element.parameters, '()'); |
| expect(suggestion.parameterNames, hasLength(0)); |
| expect(suggestion.requiredParameterCount, 0); |
| expect(suggestion.hasNamedParameters, false); |
| |
| 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); |
| |
| 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); |
| |
| // Suggested by LibraryPrefixContributor |
| assertNotSuggested('math'); |
| } |
| |
| test_InstanceCreationExpression_abstractClass() async { |
| addSource('/a.dart', ''' |
| abstract class A { |
| A(); |
| A.generative(); |
| factory A.factory() => null; |
| } |
| '''); |
| addTestSource(''' |
| import 'a.dart'; |
| |
| main() { |
| new ^; |
| } |
| '''); |
| await computeSuggestions(); |
| |
| assertNotSuggested('A'); |
| assertNotSuggested('A.generative'); |
| assertSuggestConstructor('A.factory'); |
| } |
| |
| test_InstanceCreationExpression_abstractClass_implicitConstructor() async { |
| addSource('/a.dart', ''' |
| abstract class A {} |
| '''); |
| addTestSource(''' |
| import 'a.dart'; |
| |
| main() { |
| new ^; |
| } |
| '''); |
| await computeSuggestions(); |
| |
| assertNotSuggested('A'); |
| } |
| |
| test_InstanceCreationExpression_filter() async { |
| configurePreviewDart2(); |
| addSource('/a.dart', ''' |
| class A {} |
| class B extends A {} |
| class C implements A {} |
| class D {} |
| '''); |
| addTestSource(''' |
| import 'a.dart'; |
| |
| main() { |
| A a = new ^ |
| } |
| '''); |
| await computeSuggestions(); |
| |
| assertSuggestConstructor('A', |
| elemOffset: -1, |
| relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_TYPE); |
| assertSuggestConstructor('B', |
| elemOffset: -1, |
| relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE); |
| assertSuggestConstructor('C', |
| elemOffset: -1, |
| relevance: DART_RELEVANCE_DEFAULT + DART_RELEVANCE_BOOST_SUBTYPE); |
| assertSuggestConstructor('D', elemOffset: -1); |
| } |
| |
| test_InstanceCreationExpression_imported() async { |
| // SimpleIdentifier TypeName ConstructorName InstanceCreationExpression |
| addSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| class A {A(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| import "dart:async"; |
| int T2; |
| 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); |
| assertSuggestConstructor('Object'); |
| assertSuggestConstructor('Future'); |
| assertSuggestConstructor('A'); |
| // Suggested by ConstructorContributor |
| assertNotSuggested('B'); |
| assertNotSuggested('C'); |
| assertNotSuggested('f'); |
| assertNotSuggested('x'); |
| assertNotSuggested('foo'); |
| assertNotSuggested('F1'); |
| assertNotSuggested('F2'); |
| // An unresolved imported library will produce suggestions |
| // with a null returnType |
| // The current DartCompletionRequest#resolveExpression resolves |
| // the world (which it should not) and causes the imported library |
| // to be resolved. |
| assertNotSuggested('T1'); |
| assertNotSuggested('T2'); |
| } |
| |
| test_InstanceCreationExpression_unimported() async { |
| // 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'); |
| } |
| |
| test_internal_sdk_libs() async { |
| addTestSource('main() {p^}'); |
| |
| await computeSuggestions(); |
| assertSuggest('print'); |
| // Not imported, so not suggested |
| assertNotSuggested('pow'); |
| // Do not suggest completions from internal SDK library |
| assertNotSuggested('printToConsole'); |
| } |
| |
| test_InterpolationExpression() async { |
| // SimpleIdentifier InterpolationExpression StringInterpolation |
| addSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| typedef D1(); |
| class C1 {C1(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| typedef D2(); |
| class C2 { } |
| main() {String name; print("hello \$^");}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| if (suggestConstructorsWithoutNew) { |
| assertSuggestConstructor('Object'); |
| assertSuggestConstructor('C1'); |
| } else { |
| assertNotSuggested('Object'); |
| assertNotSuggested('C1'); |
| } |
| assertSuggestTopLevelVar('T1', null); |
| assertSuggestFunction('F1', null); |
| assertNotSuggested('D1'); |
| assertNotSuggested('T2'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('D2'); |
| assertNotSuggested('C2'); |
| assertNotSuggested('name'); |
| } |
| |
| test_InterpolationExpression_block() async { |
| // SimpleIdentifier InterpolationExpression StringInterpolation |
| addSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| typedef D1(); |
| class C1 {C1(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| typedef D2(); |
| class C2 { } |
| main() {String name; print("hello \${^}");}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('Object'); |
| // Simulate unresolved imported library |
| // in which case suggestions will have null (unresolved) returnType |
| assertSuggestTopLevelVar('T1', null); |
| assertSuggestFunction('F1', null); |
| assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
| assertSuggestClass('C1'); |
| assertNotSuggested('T2'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('D2'); |
| assertNotSuggested('C2'); |
| assertNotSuggested('name'); |
| } |
| |
| test_InterpolationExpression_block2() async { |
| // SimpleIdentifier InterpolationExpression StringInterpolation |
| addTestSource('main() {String name; print("hello \${n^}");}'); |
| |
| await computeSuggestions(); |
| assertNotSuggested('name'); |
| // top level results are partially filtered |
| //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); |
| assertNotSuggested('length'); |
| assertNotSuggested('name'); |
| assertNotSuggested('Object'); |
| assertNotSuggested('=='); |
| } |
| |
| test_InterpolationExpression_prefix_selector2() async { |
| // SimpleIdentifier PrefixedIdentifier InterpolationExpression |
| addTestSource('main() {String name; print("hello \$name.^");}'); |
| |
| await computeSuggestions(); |
| assertNoSuggestions(); |
| } |
| |
| 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 |
| //assertSuggestClass('Object'); |
| assertNotSuggested('length'); |
| } |
| |
| test_IsExpression() async { |
| // SimpleIdentifier TypeName IsExpression IfStatement |
| addSource('/testB.dart', ''' |
| lib B; |
| foo() { } |
| class X {X.c(); X._d(); z() {}}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}"; |
| class Y {Y.c(); Y._d(); z() {}} |
| main() {var x; if (x is ^) { }}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('X'); |
| assertNotSuggested('Y'); |
| assertNotSuggested('x'); |
| assertNotSuggested('main'); |
| assertNotSuggested('foo'); |
| } |
| |
| test_IsExpression_target() async { |
| // IfStatement Block BlockFunctionBody |
| addTestSource(''' |
| foo() { } |
| void bar() { } |
| class A {int x; int y() => 0;} |
| main(){var a; if (^ is A)}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('a'); |
| assertNotSuggested('main'); |
| assertNotSuggested('foo'); |
| assertNotSuggested('bar'); |
| assertNotSuggested('A'); |
| assertSuggestClass('Object'); |
| } |
| |
| test_IsExpression_type() async { |
| // SimpleIdentifier TypeName IsExpression IfStatement |
| 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'); |
| assertSuggestClass('Object'); |
| } |
| |
| test_IsExpression_type_partial() async { |
| // SimpleIdentifier TypeName IsExpression IfStatement |
| 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'); |
| assertSuggestClass('Object'); |
| } |
| |
| test_IsExpression_type_subtype_extends_filter() async { |
| // SimpleIdentifier TypeName IsExpression IfStatement |
| addSource('/testB.dart', ''' |
| foo() { } |
| class A {} class B extends A {} class C extends B {} |
| class X {X.c(); X._d(); z() {}}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}"; |
| main(){A a; if (a is ^)}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('B'); |
| assertSuggestClass('C'); |
| assertNotSuggested('A'); |
| assertNotSuggested('X'); |
| assertNotSuggested('Object'); |
| assertNotSuggested('a'); |
| assertNotSuggested('main'); |
| } |
| |
| test_IsExpression_type_subtype_implements_filter() async { |
| // SimpleIdentifier TypeName IsExpression IfStatement |
| addSource('/testB.dart', ''' |
| foo() { } |
| class A {} class B implements A {} class C implements B {} |
| class X {X.c(); X._d(); z() {}}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}"; |
| main(){A a; if (a is ^)}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('B'); |
| assertSuggestClass('C'); |
| assertNotSuggested('A'); |
| assertNotSuggested('X'); |
| assertNotSuggested('Object'); |
| assertNotSuggested('a'); |
| assertNotSuggested('main'); |
| } |
| |
| test_keyword() async { |
| resolveSource('/testB.dart', ''' |
| lib B; |
| int newT1; |
| int T1; |
| nowIsIt() { } |
| class X {factory X.c(); factory X._d(); z() {}}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testB.dart')}"; |
| 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 |
| assertSuggestFunction('nowIsIt', 'dynamic'); |
| assertSuggestTopLevelVar('T1', 'int'); |
| assertSuggestTopLevelVar('newT1', 'int'); |
| assertNotSuggested('z'); |
| assertNotSuggested('m'); |
| assertNotSuggested('newer'); |
| } |
| |
| test_Literal_list() async { |
| // ']' ListLiteral ArgumentList MethodInvocation |
| addTestSource('main() {var Some; print([^]);}'); |
| |
| await computeSuggestions(); |
| assertNotSuggested('Some'); |
| assertSuggestClass('String'); |
| } |
| |
| test_Literal_list2() async { |
| // SimpleIdentifier ListLiteral ArgumentList MethodInvocation |
| addTestSource('main() {var Some; print([S^]);}'); |
| |
| await computeSuggestions(); |
| assertNotSuggested('Some'); |
| 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('/testA.dart', ''' |
| int T1; |
| F1() { } |
| typedef D1(); |
| class C1 {C1(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| typedef D2(); |
| class C2 { } |
| foo = {^'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('Object'); |
| if (suggestConstructorsWithoutNew) { |
| assertSuggestConstructor('Object'); |
| } |
| // Simulate unresolved imported library, |
| // in which case suggestions will have null return types (unresolved) |
| // The current DartCompletionRequest#resolveExpression resolves |
| // the world (which it should not) and causes the imported library |
| // to be resolved. |
| assertSuggestTopLevelVar('T1', /* null */ 'int'); |
| assertSuggestFunction('F1', /* null */ 'dynamic'); |
| assertSuggestFunctionTypeAlias('D1', /* null */ 'dynamic'); |
| assertSuggestClass('C1'); |
| assertNotSuggested('T2'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('D2'); |
| assertNotSuggested('C2'); |
| } |
| |
| test_MapLiteralEntry1() async { |
| // MapLiteralEntry MapLiteral VariableDeclaration |
| addSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| typedef D1(); |
| class C1 {C1(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| 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) |
| // The current DartCompletionRequest#resolveExpression resolves |
| // the world (which it should not) and causes the imported library |
| // to be resolved. |
| assertSuggestTopLevelVar('T1', /* null */ 'int'); |
| assertNotSuggested('T2'); |
| } |
| |
| test_MapLiteralEntry2() async { |
| // SimpleIdentifier MapLiteralEntry MapLiteral VariableDeclaration |
| resolveSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| typedef D1(); |
| class C1 {C1(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| typedef D2(); |
| class C2 { } |
| foo = {7:T^};'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset - 1); |
| expect(replacementLength, 1); |
| assertSuggestTopLevelVar('T1', 'int'); |
| assertNotSuggested('T2'); |
| } |
| |
| test_method_parameters_mixed_required_and_named() async { |
| resolveSource('/libA.dart', ''' |
| void m(x, {int y}) {} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B extends A { |
| main() {^} |
| } |
| '''); |
| await computeSuggestions(); |
| 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, true); |
| } |
| |
| test_method_parameters_mixed_required_and_positional() async { |
| resolveSource('/libA.dart', ''' |
| void m(x, [int y]) {} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B extends A { |
| main() {^} |
| } |
| '''); |
| await computeSuggestions(); |
| 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_method_parameters_named() async { |
| resolveSource('/libA.dart', ''' |
| void m({x, int y}) {} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B extends A { |
| main() {^} |
| } |
| '''); |
| await computeSuggestions(); |
| 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_method_parameters_none() async { |
| resolveSource('/libA.dart', ''' |
| void m() {} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B extends A { |
| main() {^} |
| } |
| '''); |
| |
| await computeSuggestions(); |
| CompletionSuggestion suggestion = assertSuggestFunction('m', 'void'); |
| expect(suggestion.parameterNames, isEmpty); |
| expect(suggestion.parameterTypes, isEmpty); |
| expect(suggestion.requiredParameterCount, 0); |
| expect(suggestion.hasNamedParameters, false); |
| } |
| |
| test_method_parameters_positional() async { |
| resolveSource('/libA.dart', ''' |
| void m([x, int y]) {} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B extends A { |
| main() {^} |
| } |
| '''); |
| await computeSuggestions(); |
| 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_method_parameters_required() async { |
| resolveSource('/libA.dart', ''' |
| void m(x, int y) {} |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class B { |
| main() {^} |
| } |
| '''); |
| await computeSuggestions(); |
| 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_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); |
| assertNotSuggested('a'); |
| assertNotSuggested('f'); |
| assertNotSuggested('_g'); |
| } |
| |
| test_MethodDeclaration_body_static() async { |
| // Block BlockFunctionBody MethodDeclaration |
| addSource('/testC.dart', ''' |
| class C { |
| c1() {} |
| var c2; |
| static c3() {} |
| static var c4;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testC.dart')}"; |
| class B extends C { |
| b1() {} |
| var b2; |
| static b3() {} |
| static var b4;} |
| class A extends B { |
| a1() {} |
| var a2; |
| static a3() {} |
| static var a4; |
| static a() {^}}'''); |
| |
| await computeSuggestions(); |
| assertNotSuggested('a1'); |
| assertNotSuggested('a2'); |
| assertNotSuggested('a3'); |
| assertNotSuggested('a4'); |
| assertNotSuggested('b1'); |
| assertNotSuggested('b2'); |
| assertNotSuggested('b3'); |
| assertNotSuggested('b4'); |
| assertNotSuggested('c1'); |
| assertNotSuggested('c2'); |
| assertNotSuggested('c3'); |
| assertNotSuggested('c4'); |
| } |
| |
| 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'); |
| assertSuggestClass('bool'); |
| if (suggestConstructorsWithoutNew) { |
| // TODO(brianwilkerson) Should not suggest constructors for classes that |
| // cannot be instantiated. |
| assertSuggestConstructor('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); |
| assertNotSuggested('a'); |
| assertNotSuggested('x'); |
| assertNotSuggested('y'); |
| assertNotSuggested('b'); |
| assertSuggestClass('int'); |
| assertNotSuggested('_'); |
| } |
| |
| test_MethodDeclaration_parameters_positional() async { |
| // Block BlockFunctionBody MethodDeclaration |
| addTestSource(''' |
| foo() { } |
| void bar() { } |
| class A {Z a(X x, [int y=1]) {^}}'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertNotSuggested('foo'); |
| assertNotSuggested('bar'); |
| assertNotSuggested('a'); |
| assertNotSuggested('x'); |
| assertNotSuggested('y'); |
| assertSuggestClass('String'); |
| } |
| |
| test_MethodDeclaration_returnType() async { |
| // ClassDeclaration CompilationUnit |
| resolveSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| typedef D1(); |
| class C1 {C1(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| typedef D2(); |
| class C2 {^ zoo(z) { } String name; }'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('Object'); |
| assertNotSuggested('T1'); |
| assertNotSuggested('F1'); |
| assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
| assertSuggestClass('C1'); |
| assertNotSuggested('T2'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('D2'); |
| assertNotSuggested('C2'); |
| assertNotSuggested('name'); |
| } |
| |
| test_MethodDeclaration_returnType_afterComment() async { |
| // ClassDeclaration CompilationUnit |
| resolveSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| typedef D1(); |
| class C1 {C1(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| typedef D2(); |
| class C2 {/* */ ^ zoo(z) { } String name; }'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('Object'); |
| assertNotSuggested('T1'); |
| assertNotSuggested('F1'); |
| assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
| assertSuggestClass('C1'); |
| assertNotSuggested('T2'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('D2'); |
| assertNotSuggested('C2'); |
| assertNotSuggested('name'); |
| } |
| |
| test_MethodDeclaration_returnType_afterComment2() async { |
| // MethodDeclaration ClassDeclaration CompilationUnit |
| resolveSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| typedef D1(); |
| class C1 {C1(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| typedef D2(); |
| class C2 {/** */ ^ zoo(z) { } String name; }'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('Object'); |
| assertNotSuggested('T1'); |
| assertNotSuggested('F1'); |
| assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
| assertSuggestClass('C1'); |
| assertNotSuggested('T2'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('D2'); |
| assertNotSuggested('C2'); |
| assertNotSuggested('name'); |
| } |
| |
| test_MethodDeclaration_returnType_afterComment3() async { |
| // MethodDeclaration ClassDeclaration CompilationUnit |
| resolveSource('/testA.dart', ''' |
| int T1; |
| F1() { } |
| typedef D1(); |
| class C1 {C1(this.x) { } int x;}'''); |
| addTestSource(''' |
| import "${convertAbsolutePathToUri('/testA.dart')}"; |
| int T2; |
| F2() { } |
| typedef D2(); |
| class C2 { |
| /// some dartdoc |
| ^ zoo(z) { } String name; }'''); |
| |
| await computeSuggestions(); |
| expect(replacementOffset, completionOffset); |
| expect(replacementLength, 0); |
| assertSuggestClass('Object'); |
| assertNotSuggested('T1'); |
| assertNotSuggested('F1'); |
| assertSuggestFunctionTypeAlias('D1', 'dynamic'); |
| assertSuggestClass('C1'); |
| assertNotSuggested('T2'); |
| assertNotSuggested('F2'); |
| assertNotSuggested('D2'); |
| assertNotSuggested('C2'); |
| assertNotSuggested('name'); |
| } |
| |
| test_MethodInvocation_no_semicolon() async { |
| // MethodInvocation ExpressionStatement Block |
| addTestSource(''' |
| main() { } |
| class I {X get f => new A();get _g => new A();} |
| class A implements I { |
| var b; X _c; |
| X get d => new A();get _e => new A(); |
| // no semicolon between completion point and next statement |
| 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); |
| assertNotSuggested('f'); |
| assertNotSuggested('_g'); |
| assertNotSuggested('b'); |
| assertNotSuggested('_c'); |
| assertNotSuggested('d'); |
| assertNotSuggested('_e'); |
| assertNotSuggested('s1'); |
| assertNotSuggested('_s2'); |
| assertNotSuggested('m'); |
| assertNotSuggested('_n'); |
| assertNotSuggested('a'); |
| assertNotSuggested('A'); |
| assertNotSuggested('X'); |
| assertNotSuggested('Object'); |
| assertNotSuggested('=='); |
| } |
| |
| test_mixin_ordering() async { |
| addSource('/libA.dart', ''' |
| class B {} |
| class M1 { |
| void m() {} |
| } |
| class M2 { |
| void m() {} |
| } |
| '''); |
| addTestSource(''' |
| import '${convertAbsolutePathToUri('/libA.dart')}'; |
| class C extends B with M1, M2 { |
| void f() { |
| ^ |
| } |
| } |
| '''); |
| await computeSuggestions(); |
| assertNotSuggested('m'); |
| } |
| |
| /** |
| * 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([new DartUriResolver(sdk), resourceResolver]); |
| String content2 = 'class ClassFromAnotherContext { }'; |
| Source source2 = |
| newFile('/context2/foo.dart', content: 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(); |
|