diff --git a/extensions/typescript-language-features/src/features/completions.ts b/extensions/typescript-language-features/src/features/completions.ts index af26cf56adc..a6b2f2fc62f 100644 --- a/extensions/typescript-language-features/src/features/completions.ts +++ b/extensions/typescript-language-features/src/features/completions.ts @@ -16,11 +16,15 @@ import * as typeConverters from '../utils/typeConverters'; import TypingsStatus from '../utils/typingsStatus'; import FileConfigurationManager from './fileConfigurationManager'; - - - const localize = nls.loadMessageBundle(); + +interface CommitCharactersSettings { + readonly enable: boolean; + readonly enableDotCompletions: boolean; + readonly enableCallCompletions: boolean; +} + class MyCompletionItem extends vscode.CompletionItem { public readonly useCodeSnippet: boolean; @@ -29,8 +33,8 @@ class MyCompletionItem extends vscode.CompletionItem { public readonly document: vscode.TextDocument, line: string, public readonly tsEntry: Proto.CompletionEntry, - enableDotCompletions: boolean, - useCodeSnippetsOnMethodSuggest: boolean + useCodeSnippetsOnMethodSuggest: boolean, + commitCharactersSettings: CommitCharactersSettings ) { super(tsEntry.name); @@ -49,7 +53,7 @@ class MyCompletionItem extends vscode.CompletionItem { this.kind = MyCompletionItem.convertKind(tsEntry.kind); this.position = position; - this.commitCharacters = MyCompletionItem.getCommitCharacters(enableDotCompletions, !useCodeSnippetsOnMethodSuggest, tsEntry.kind); + this.commitCharacters = MyCompletionItem.getCommitCharacters(commitCharactersSettings, tsEntry.kind); this.useCodeSnippet = useCodeSnippetsOnMethodSuggest && (this.kind === vscode.CompletionItemKind.Function || this.kind === vscode.CompletionItemKind.Method); if (tsEntry.replacementSpan) { this.range = typeConverters.Range.fromTextSpan(tsEntry.replacementSpan); @@ -144,8 +148,7 @@ class MyCompletionItem extends vscode.CompletionItem { } private static getCommitCharacters( - enableDotCompletions: boolean, - enableCallCompletions: boolean, + settings: CommitCharactersSettings, kind: string ): string[] | undefined { const commitCharacters: string[] = []; @@ -157,7 +160,7 @@ class MyCompletionItem extends vscode.CompletionItem { case PConst.Kind.indexSignature: case PConst.Kind.enum: case PConst.Kind.interface: - if (enableDotCompletions) { + if (settings.enableDotCompletions) { commitCharacters.push('.'); } break; @@ -172,10 +175,10 @@ class MyCompletionItem extends vscode.CompletionItem { case PConst.Kind.class: case PConst.Kind.function: case PConst.Kind.memberFunction: - if (enableDotCompletions) { + if (settings.enableDotCompletions) { commitCharacters.push('.', ','); } - if (enableCallCompletions) { + if (settings.enableCallCompletions) { commitCharacters.push('('); } break; @@ -306,13 +309,16 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider triggerCharacter: context.triggerCharacter as Proto.CompletionsTriggerCharacter }; + + let enableCommitCharacters = true; let msg: ReadonlyArray | undefined = undefined; try { if (this.client.apiVersion.gte(API.v300)) { const { body } = await this.client.execute('completionInfo', args, token); - if (!body || body.isNewIdentifierLocation) { + if (!body) { return null; } + enableCommitCharacters = !body.isNewIdentifierLocation; msg = body.entries; } else { const { body } = await this.client.execute('completions', args, token); @@ -328,7 +334,11 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider const enableDotCompletions = this.shouldEnableDotCompletions(document, position); return msg .filter(entry => !shouldExcludeCompletionEntry(entry, completionConfiguration)) - .map(entry => new MyCompletionItem(position, document, line.text, entry, enableDotCompletions, completionConfiguration.useCodeSnippetsOnMethodSuggest)); + .map(entry => new MyCompletionItem(position, document, line.text, entry, completionConfiguration.useCodeSnippetsOnMethodSuggest, { + enable: enableCommitCharacters, + enableDotCompletions, + enableCallCompletions: !completionConfiguration.useCodeSnippetsOnMethodSuggest + })); } public async resolveCompletionItem(