diff --git a/extensions/typescript/src/features/completionItemProvider.ts b/extensions/typescript/src/features/completionItemProvider.ts index 48c51dce0fa..bc7b1a8b2b9 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, CompletionContext, commands } from 'vscode'; +import { CompletionItem, TextDocument, Position, CompletionItemKind, CompletionItemProvider, CancellationToken, TextEdit, Range, SnippetString, workspace, ProviderResult, CompletionContext, commands, Uri } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; import TypingsStatus from '../utils/typingsStatus'; @@ -21,17 +21,18 @@ let localize = nls.loadMessageBundle(); class MyCompletionItem extends CompletionItem { constructor( - public position: Position, - public document: TextDocument, + public readonly position: Position, + public readonly document: TextDocument, entry: CompletionEntry, enableDotCompletions: boolean, - enableCallCompletions: boolean + public readonly useCodeSnippetsOnMethodSuggest: boolean ) { super(entry.name); this.sortText = entry.sortText; this.kind = MyCompletionItem.convertKind(entry.kind); this.position = position; - this.commitCharacters = MyCompletionItem.getCommitCharacters(enableDotCompletions, enableCallCompletions, entry.kind); + this.commitCharacters = MyCompletionItem.getCommitCharacters(enableDotCompletions, !useCodeSnippetsOnMethodSuggest, entry.kind); + if (entry.replacementSpan) { let span: protocol.TextSpan = entry.replacementSpan; // The indexing for the range returned by the server uses 1-based indexing. @@ -137,12 +138,6 @@ namespace Configuration { export default class TypeScriptCompletionItemProvider implements CompletionItemProvider { private readonly commandId: string; - private config: Configuration = { - useCodeSnippetsOnMethodSuggest: false, - nameSuggestions: true, - quickSuggestionsForPaths: true - }; - constructor( private client: ITypescriptServiceClient, mode: string, @@ -152,16 +147,6 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP commands.registerCommand(this.commandId, this.applyCompletionCodeAction, this); } - public updateConfiguration(): void { - // Use shared setting for js and ts - const typeScriptConfig = workspace.getConfiguration('typescript'); - - this.config.useCodeSnippetsOnMethodSuggest = typeScriptConfig.get(Configuration.useCodeSnippetsOnMethodSuggest, false); - this.config.quickSuggestionsForPaths = typeScriptConfig.get(Configuration.quickSuggestionsForPaths, true); - - this.config.nameSuggestions = workspace.getConfiguration('javascript').get(Configuration.nameSuggestions, true); - } - public async provideCompletionItems( document: TextDocument, position: Position, @@ -184,8 +169,10 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP return []; } + const config = this.getConfiguration(document.uri); + if (context.triggerCharacter === '"' || context.triggerCharacter === '\'') { - if (!this.config.quickSuggestionsForPaths) { + if (!config.quickSuggestionsForPaths) { return []; } @@ -197,7 +184,7 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP } if (context.triggerCharacter === '/') { - if (!this.config.quickSuggestionsForPaths) { + if (!config.quickSuggestionsForPaths) { return []; } @@ -252,10 +239,10 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP } for (const element of body) { - if (element.kind === PConst.Kind.warning && !this.config.nameSuggestions) { + if (element.kind === PConst.Kind.warning && !config.nameSuggestions) { continue; } - const item = new MyCompletionItem(position, document, element, enableDotCompletions, !this.config.useCodeSnippetsOnMethodSuggest); + const item = new MyCompletionItem(position, document, element, enableDotCompletions, config.useCodeSnippetsOnMethodSuggest); completionItems.push(item); } } @@ -296,7 +283,7 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP }; } - if (detail && this.config.useCodeSnippetsOnMethodSuggest && (item.kind === CompletionItemKind.Function || item.kind === CompletionItemKind.Method)) { + if (detail && item.useCodeSnippetsOnMethodSuggest && (item.kind === CompletionItemKind.Function || item.kind === CompletionItemKind.Method)) { return this.isValidFunctionCompletionContext(filepath, item.position).then(shouldCompleteFunction => { if (shouldCompleteFunction) { item.insertText = this.snippetForFunctionCall(detail); @@ -366,4 +353,15 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP } return true; } + + + private getConfiguration(resource: Uri): Configuration { + // Use shared setting for js and ts + const typeScriptConfig = workspace.getConfiguration('typescript', resource); + return { + useCodeSnippetsOnMethodSuggest: typeScriptConfig.get(Configuration.useCodeSnippetsOnMethodSuggest, false), + quickSuggestionsForPaths: typeScriptConfig.get(Configuration.quickSuggestionsForPaths, true), + nameSuggestions: workspace.getConfiguration('javascript', resource).get(Configuration.nameSuggestions, true) + }; + } } diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 151d239504a..5ecc8b696f1 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -236,8 +236,6 @@ class LanguageProvider { const config = workspace.getConfiguration(this.id); const completionItemProvider = new (await import('./features/completionItemProvider')).default(client, this.description.id, this.typingsStatus); - completionItemProvider.updateConfiguration(); - this.toUpdateOnConfigurationChanged.push(completionItemProvider); this.disposables.push(languages.registerCompletionItemProvider(selector, completionItemProvider, '.', '"', '\'', '/', '@')); this.disposables.push(languages.registerCompletionItemProvider(selector, new (await import('./features/directiveCommentCompletionProvider')).default(client), '@'));