| Index: pkg/analysis_server/test/domain_completion_test.dart
|
| diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
|
| index a54a5955dc42afe29cc27e088e57bee422509cf7..f09af0e82152471ec1d4ae7d556a5d15d8ce89a6 100644
|
| --- a/pkg/analysis_server/test/domain_completion_test.dart
|
| +++ b/pkg/analysis_server/test/domain_completion_test.dart
|
| @@ -55,14 +55,9 @@ class CompletionManagerTest extends AbstractAnalysisTest {
|
| ExtensionManager manager = new ExtensionManager();
|
| ServerPlugin serverPlugin = new ServerPlugin();
|
| manager.processPlugins([serverPlugin]);
|
| - return new Test_AnalysisServer(
|
| - super.serverChannel,
|
| - super.resourceProvider,
|
| - super.packageMapProvider,
|
| - index,
|
| - serverPlugin,
|
| - new AnalysisServerOptions(),
|
| - new MockSdk(),
|
| + return new Test_AnalysisServer(super.serverChannel, super.resourceProvider,
|
| + super.packageMapProvider, index, serverPlugin,
|
| + new AnalysisServerOptions(), new MockSdk(),
|
| InstrumentationService.NULL_SERVICE);
|
| }
|
|
|
| @@ -268,7 +263,7 @@ class CompletionTest extends AbstractAnalysisTest {
|
| List<CompletionSuggestion> suggestions = [];
|
| bool suggestionsDone = false;
|
|
|
| - String addTestFile(String content, {offset}) {
|
| + String addTestFile(String content, {int offset}) {
|
| completionOffset = content.indexOf('^');
|
| if (offset != null) {
|
| expect(completionOffset, -1, reason: 'cannot supply offset and ^');
|
| @@ -283,9 +278,10 @@ class CompletionTest extends AbstractAnalysisTest {
|
| }
|
|
|
| void assertHasResult(CompletionSuggestionKind kind, String completion,
|
| - [int relevance = DART_RELEVANCE_DEFAULT,
|
| - bool isDeprecated = false,
|
| - bool isPotential = false]) {
|
| + {int relevance: DART_RELEVANCE_DEFAULT,
|
| + bool isDeprecated: false,
|
| + bool isPotential: false,
|
| + int selectionOffset}) {
|
| var cs;
|
| suggestions.forEach((s) {
|
| if (s.completion == completion) {
|
| @@ -302,7 +298,7 @@ class CompletionTest extends AbstractAnalysisTest {
|
| }
|
| expect(cs.kind, equals(kind));
|
| expect(cs.relevance, equals(relevance));
|
| - expect(cs.selectionOffset, equals(completion.length));
|
| + expect(cs.selectionOffset, selectionOffset ?? completion.length);
|
| expect(cs.selectionLength, equals(0));
|
| expect(cs.isDeprecated, equals(isDeprecated));
|
| expect(cs.isPotential, equals(isPotential));
|
| @@ -386,6 +382,64 @@ class CompletionTest extends AbstractAnalysisTest {
|
| });
|
| }
|
|
|
| + test_imports_incremental() async {
|
| + addTestFile('''library foo;
|
| + e^
|
| + import "dart:async";
|
| + import "package:foo/foo.dart";
|
| + class foo { }''');
|
| + await waitForTasksFinished();
|
| + server.updateContent('uc1', {testFile: new AddContentOverlay(testCode)});
|
| + server.updateContent('uc2', {
|
| + testFile:
|
| + new ChangeContentOverlay([new SourceEdit(completionOffset, 0, 'xp')])
|
| + });
|
| + completionOffset += 2;
|
| + await getSuggestions();
|
| + expect(replacementOffset, completionOffset - 3);
|
| + expect(replacementLength, 3);
|
| + assertHasResult(CompletionSuggestionKind.KEYWORD, 'export',
|
| + relevance: DART_RELEVANCE_HIGH);
|
| + assertHasResult(CompletionSuggestionKind.KEYWORD, 'import',
|
| + relevance: DART_RELEVANCE_HIGH);
|
| + assertNoResult('extends');
|
| + assertNoResult('library');
|
| + }
|
| +
|
| + test_imports_partial() async {
|
| + addTestFile('''^
|
| + import "package:foo/foo.dart";
|
| + import "package:bar/bar.dart";
|
| + class Baz { }''');
|
| +
|
| + // Wait for analysis then edit the content
|
| + await waitForTasksFinished();
|
| + String revisedContent = testCode.substring(0, completionOffset) +
|
| + 'i' +
|
| + testCode.substring(completionOffset);
|
| + ++completionOffset;
|
| + server.handleRequest(new AnalysisUpdateContentParams(
|
| + {testFile: new AddContentOverlay(revisedContent)}).toRequest('add1'));
|
| +
|
| + // Request code completion immediately after edit
|
| + Response response = handleSuccessfulRequest(new CompletionGetSuggestionsParams(
|
| + testFile, completionOffset).toRequest('0'));
|
| + completionId = response.id;
|
| + assertValidId(completionId);
|
| + await waitForTasksFinished();
|
| + expect(replacementOffset, completionOffset - 1);
|
| + expect(replacementLength, 1);
|
| + assertHasResult(CompletionSuggestionKind.KEYWORD, 'library',
|
| + relevance: DART_RELEVANCE_HIGH);
|
| + assertHasResult(CompletionSuggestionKind.KEYWORD, 'import',
|
| + relevance: DART_RELEVANCE_HIGH);
|
| + assertHasResult(CompletionSuggestionKind.KEYWORD, 'export',
|
| + relevance: DART_RELEVANCE_HIGH);
|
| + assertHasResult(CompletionSuggestionKind.KEYWORD, 'part',
|
| + relevance: DART_RELEVANCE_HIGH);
|
| + assertNoResult('extends');
|
| + }
|
| +
|
| test_imports_prefixed() {
|
| addTestFile('''
|
| import 'dart:html' as foo;
|
| @@ -424,10 +478,10 @@ class CompletionTest extends AbstractAnalysisTest {
|
| return getSuggestions().then((_) {
|
| expect(replacementOffset, equals(completionOffset - 2));
|
| expect(replacementLength, equals(2));
|
| - assertHasResult(
|
| - CompletionSuggestionKind.KEYWORD, 'export', DART_RELEVANCE_HIGH);
|
| - assertHasResult(
|
| - CompletionSuggestionKind.KEYWORD, 'class', DART_RELEVANCE_HIGH);
|
| + assertHasResult(CompletionSuggestionKind.KEYWORD, 'export',
|
| + relevance: DART_RELEVANCE_HIGH);
|
| + assertHasResult(CompletionSuggestionKind.KEYWORD, 'class',
|
| + relevance: DART_RELEVANCE_HIGH);
|
| });
|
| }
|
|
|
| @@ -447,12 +501,12 @@ class CompletionTest extends AbstractAnalysisTest {
|
| expect(replacementOffset, equals(completionOffset));
|
| expect(replacementLength, equals(0));
|
| assertHasResult(CompletionSuggestionKind.INVOCATION, 'A');
|
| - assertHasResult(
|
| - CompletionSuggestionKind.INVOCATION, 'a', DART_RELEVANCE_LOCAL_FIELD);
|
| + assertHasResult(CompletionSuggestionKind.INVOCATION, 'a',
|
| + relevance: DART_RELEVANCE_LOCAL_FIELD);
|
| assertHasResult(CompletionSuggestionKind.INVOCATION, 'b',
|
| - DART_RELEVANCE_LOCAL_VARIABLE);
|
| + relevance: DART_RELEVANCE_LOCAL_VARIABLE);
|
| assertHasResult(CompletionSuggestionKind.INVOCATION, 'x',
|
| - DART_RELEVANCE_LOCAL_METHOD);
|
| + relevance: DART_RELEVANCE_LOCAL_METHOD);
|
| assertHasResult(CompletionSuggestionKind.INVOCATION, 'DateTime');
|
| });
|
| }
|
| @@ -477,14 +531,12 @@ class B extends A {m() {^}}
|
| expect(replacementOffset, equals(completionOffset));
|
| expect(replacementLength, equals(0));
|
| assertHasResult(CompletionSuggestionKind.INVOCATION, 'm',
|
| - DART_RELEVANCE_LOCAL_METHOD);
|
| + relevance: DART_RELEVANCE_LOCAL_METHOD);
|
| });
|
| }
|
|
|
| test_partFile() {
|
| - addFile(
|
| - '/project/bin/testA.dart',
|
| - '''
|
| + addFile('/project/bin/testA.dart', '''
|
| library libA;
|
| part "$testFile";
|
| import 'dart:html';
|
| @@ -504,9 +556,7 @@ class B extends A {m() {^}}
|
| }
|
|
|
| test_partFile2() {
|
| - addFile(
|
| - '/testA.dart',
|
| - '''
|
| + addFile('/testA.dart', '''
|
| part of libA;
|
| class A { }''');
|
| addTestFile('''
|
| @@ -552,7 +602,7 @@ class B extends A {m() {^}}
|
| // Suggestions based upon imported elements are partially filtered
|
| //assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object');
|
| assertHasResult(CompletionSuggestionKind.INVOCATION, 'test',
|
| - DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
|
| + relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
|
| assertNoResult('HtmlElement');
|
| });
|
| }
|
| @@ -666,24 +716,14 @@ class MockSubscription<E> implements StreamSubscription<E> {
|
| class Test_AnalysisServer extends AnalysisServer {
|
| final MockContext mockContext = new MockContext();
|
|
|
| - Test_AnalysisServer(
|
| - ServerCommunicationChannel channel,
|
| + Test_AnalysisServer(ServerCommunicationChannel channel,
|
| ResourceProvider resourceProvider,
|
| - PubPackageMapProvider packageMapProvider,
|
| - Index index,
|
| - ServerPlugin serverPlugin,
|
| - AnalysisServerOptions analysisServerOptions,
|
| - DartSdk defaultSdk,
|
| - InstrumentationService instrumentationService)
|
| - : super(
|
| - channel,
|
| - resourceProvider,
|
| - packageMapProvider,
|
| - index,
|
| - serverPlugin,
|
| - analysisServerOptions,
|
| - defaultSdk,
|
| - instrumentationService);
|
| + PubPackageMapProvider packageMapProvider, Index index,
|
| + ServerPlugin serverPlugin, AnalysisServerOptions analysisServerOptions,
|
| + DartSdk defaultSdk, InstrumentationService instrumentationService)
|
| + : super(channel, resourceProvider, packageMapProvider, index,
|
| + serverPlugin, analysisServerOptions, defaultSdk,
|
| + instrumentationService);
|
|
|
| @override
|
| AnalysisContext getAnalysisContext(String path) {
|
|
|