diff --git a/extensions/typescript/src/features/completionItemProvider.ts b/extensions/typescript/src/features/completionItemProvider.ts index e91e71ac9fd2b4a8440904b3969713ac5125e162..1a88075c91bd6d12a28b4e0c0df41c55d20a5dcc 100644 --- a/extensions/typescript/src/features/completionItemProvider.ts +++ b/extensions/typescript/src/features/completionItemProvider.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CompletionItem, TextDocument, Position, CompletionItemKind, CompletionItemProvider, CancellationToken, TextEdit, Range, SnippetString, workspace, ProviderResult } from 'vscode'; +import { CompletionItem, TextDocument, Position, CompletionItemKind, CompletionItemProvider, CancellationToken, TextEdit, Range, SnippetString, workspace, ProviderResult, CompletionContext } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; import TypingsStatus from '../utils/typingsStatus'; @@ -159,7 +159,12 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP this.config.nameSuggestions = jsConfig.get(Configuration.nameSuggestions, true); } - public provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken): Promise { + public provideCompletionItems( + document: TextDocument, + position: Position, + token: CancellationToken, + context: CompletionContext + ): Promise { if (this.typingsStatus.isAcquiringTypings) { return Promise.reject({ label: localize( @@ -175,6 +180,16 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP if (!file) { return Promise.resolve([]); } + + + if (context.triggerCharacter === '"' || context.triggerCharacter === '\'') { + // make sure we are in something that looks like an import + const line = document.lineAt(position.line).text.slice(0, position.character); + if (!line.match(/^import .+? from\s*["']$/)) { + return Promise.resolve([]); + } + } + const args: CompletionsRequestArgs = vsPositionToTsFileLocation(file, position); return this.client.execute('completions', args, token).then((msg) => { // This info has to come from the tsserver. See https://github.com/Microsoft/TypeScript/issues/2831 diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index a559595c8d9a52ad1217c22eb44949d534c62694..98d4c267c252bf3c8f58c6fdac2c78325d168a41 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -242,7 +242,7 @@ class LanguageProvider { const completionItemProvider = new (await import('./features/completionItemProvider')).default(client, this.typingsStatus); completionItemProvider.updateConfiguration(); this.toUpdateOnConfigurationChanged.push(completionItemProvider); - this.disposables.push(languages.registerCompletionItemProvider(selector, completionItemProvider, '.')); + this.disposables.push(languages.registerCompletionItemProvider(selector, completionItemProvider, '.', '"', '\'')); this.disposables.push(languages.registerCompletionItemProvider(selector, new (await import('./features/directiveCommentCompletionProvider')).default(client), '@'));