blob: 67c4a67872dcb2b5fc85ac3f68167c5aa7ffba7d [file] [log] [blame]
// Copyright (c) 2015, 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/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'completion_contributor_util.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(LocalLibraryContributorTest);
defineReflectiveTests(LocalLibraryContributorWithExtensionMethodsTest);
});
}
@reflectiveTest
class LocalLibraryContributorTest extends DartCompletionContributorTest {
@override
DartCompletionContributor createContributor() {
return new LocalLibraryContributor();
}
test_partFile_Constructor() async {
// SimpleIdentifier TypeName ConstructorName
addSource('/home/test/lib/b.dart', '''
lib B;
int T1;
F1() { }
class X {X.c(); X._d(); z() {}}''');
addSource('/home/test/lib/a.dart', '''
library libA;
import "b.dart";
part "test.dart";
class A { }
var m;''');
addTestSource('''
part of libA;
class B { factory B.bar(int x) => null; }
main() {new ^}''');
await computeSuggestions();
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
assertSuggestConstructor('A');
// Suggested by LocalConstructorContributor
assertNotSuggested('B.bar');
// Suggested by ImportedReferenceContributor
assertNotSuggested('Object');
assertNotSuggested('X.c');
assertNotSuggested('X._d');
assertNotSuggested('F1');
assertNotSuggested('T1');
assertNotSuggested('_d');
assertNotSuggested('z');
assertNotSuggested('m');
}
test_partFile_Constructor2() async {
// SimpleIdentifier TypeName ConstructorName
addSource('/home/test/lib/b.dart', '''
lib B;
int T1;
F1() { }
class X {X.c(); X._d(); z() {}}''');
addSource('/home/test/lib/a.dart', '''
part of libA;
class B { }''');
addTestSource('''
library libA;
import "b.dart";
part "a.dart";
class A { A({String boo: 'hoo'}) { } }
main() {new ^}
var m;''');
await computeSuggestions();
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
assertSuggestConstructor('B');
// Suggested by ConstructorContributor
assertNotSuggested('A');
// Suggested by ImportedReferenceContributor
assertNotSuggested('Object');
assertNotSuggested('X.c');
assertNotSuggested('X._d');
assertNotSuggested('F1');
assertNotSuggested('T1');
assertNotSuggested('_d');
assertNotSuggested('z');
assertNotSuggested('m');
}
test_partFile_InstanceCreationExpression_assignment_filter() async {
// ConstructorName InstanceCreationExpression VariableDeclarationList
addSource('/home/test/lib/b.dart', '''
lib B;
int T1;
F1() { }
class X {X.c(); X._d(); z() {}}''');
addSource('/home/test/lib/a.dart', '''
part of libA;
class A {} class B extends A {} class C implements A {} class D {}
''');
addTestSource('''
library libA;
import "b.dart";
part "a.dart";
class Local { }
main() {
A a;
// FAIL:
a = new ^
}
var m;''');
await computeSuggestions();
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
// A is suggested with a higher relevance
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);
// D has the default relevance
assertSuggestConstructor('D', elemOffset: -1);
// Suggested by ConstructorContributor
assertNotSuggested('Local');
// Suggested by ImportedReferenceContributor
assertNotSuggested('Object');
assertNotSuggested('X.c');
assertNotSuggested('X._d');
assertNotSuggested('F1');
assertNotSuggested('T1');
assertNotSuggested('_d');
assertNotSuggested('z');
assertNotSuggested('m');
}
test_partFile_InstanceCreationExpression_variable_declaration_filter() async {
// ConstructorName InstanceCreationExpression VariableDeclarationList
addSource('/home/test/lib/b.dart', '''
lib B;
int T1;
F1() { }
class X {X.c(); X._d(); z() {}}''');
addSource('/home/test/lib/a.dart', '''
part of libA;
class A {} class B extends A {} class C implements A {} class D {}
''');
addTestSource('''
library libA;
import "b.dart";
part "a.dart";
class Local { }
main() {
A a = new ^
}
var m;''');
await computeSuggestions();
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
// A is suggested with a higher relevance
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);
// D has the default relevance
assertSuggestConstructor('D', elemOffset: -1);
// Suggested by ConstructorContributor
assertNotSuggested('Local');
// Suggested by ImportedReferenceContributor
assertNotSuggested('Object');
assertNotSuggested('X.c');
assertNotSuggested('X._d');
assertNotSuggested('F1');
assertNotSuggested('T1');
assertNotSuggested('_d');
assertNotSuggested('z');
assertNotSuggested('m');
}
test_partFile_TypeName() async {
addSource('/home/test/lib/b.dart', '''
lib B;
int T1;
F1() { }
class X {X.c(); X._d(); z() {}}''');
addSource('/home/test/lib/a.dart', '''
library libA;
import "b.dart";
part "test.dart";
class A { var a1; a2(){}}
var m;
typedef t1(int blue);
int af() {return 0;}''');
addTestSource('''
part of libA;
class B { factory B.bar(int x) => null; }
main() {^}''');
await computeSuggestions();
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
assertSuggestClass('A');
if (suggestConstructorsWithoutNew) {
assertSuggestConstructor('A');
}
assertSuggestFunction('af', 'int',
relevance: DART_RELEVANCE_LOCAL_FUNCTION);
assertSuggestTopLevelVar('m', null,
relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
assertSuggestFunctionTypeAlias('t1', null,
relevance: DART_RELEVANCE_LOCAL_FUNCTION);
assertNotSuggested('a1');
assertNotSuggested('a2');
// Suggested by LocalConstructorContributor
assertNotSuggested('B.bar');
// Suggested by ImportedReferenceContributor
assertNotSuggested('Object');
assertNotSuggested('X.c');
assertNotSuggested('X._d');
assertNotSuggested('F1');
assertNotSuggested('T1');
assertNotSuggested('_d');
assertNotSuggested('z');
}
test_partFile_TypeName2() async {
addSource('/home/test/lib/b.dart', '''
lib B;
int T1;
F1() { }
class X {X.c(); X._d(); z() {}}''');
addSource('/home/test/lib/a.dart', '''
part of libA;
class B { var b1; b2(){}}
int bf() => 0;
typedef t1(int blue);
var n;''');
addTestSource('''
library libA;
import "b.dart";
part "a.dart";
class A { A({String boo: 'hoo'}) { } }
main() {^}
var m;''');
await computeSuggestions();
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
assertSuggestClass('B');
if (suggestConstructorsWithoutNew) {
assertSuggestConstructor('B');
}
assertSuggestFunction('bf', 'int',
relevance: DART_RELEVANCE_LOCAL_FUNCTION);
assertSuggestTopLevelVar('n', null,
relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
assertSuggestFunctionTypeAlias('t1', null,
relevance: DART_RELEVANCE_LOCAL_FUNCTION);
assertNotSuggested('b1');
assertNotSuggested('b2');
// Suggested by ConstructorContributor
assertNotSuggested('A');
// Suggested by ImportedReferenceContributor
assertNotSuggested('Object');
assertNotSuggested('X.c');
assertNotSuggested('X._d');
assertNotSuggested('F1');
assertNotSuggested('T1');
assertNotSuggested('_d');
assertNotSuggested('z');
assertNotSuggested('m');
}
}
@reflectiveTest
class LocalLibraryContributorWithExtensionMethodsTest
extends LocalLibraryContributorTest {
@override
void setupResourceProvider() {
super.setupResourceProvider();
createAnalysisOptionsFile(experiments: [EnableString.extension_methods]);
}
test_partFile_extension() async {
addSource('/home/test/lib/a.dart', '''
part of libA;
extension E on int {}
''');
addTestSource('''
library libA;
part "a.dart";
void f() {^}
''');
await computeSuggestions();
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
assertSuggest('E');
}
}