diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 19a673544ce..a32c6c65d9c 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -529,8 +529,14 @@ "type": "boolean", "default": true, "description": "%typescript.autoClosingTags%" - }, - "typescript.suggestions.enabled": { + }, + "javascript.suggestions.enabled": { + "type": "boolean", + "default": true, + "description": "%typescript.suggestions.enabled%", + "scope": "resource" + }, + "typescript.suggestions.enabled": { "type": "boolean", "default": true, "description": "%typescript.suggestions.enabled%", @@ -696,4 +702,4 @@ } ] } -} +} \ No newline at end of file diff --git a/extensions/typescript-language-features/src/features/completions.ts b/extensions/typescript-language-features/src/features/completions.ts index 0ffc269b970..f39c983ee31 100644 --- a/extensions/typescript-language-features/src/features/completions.ts +++ b/extensions/typescript-language-features/src/features/completions.ts @@ -9,14 +9,15 @@ import * as Proto from '../protocol'; import * as PConst from '../protocol.const'; import { ITypeScriptServiceClient } from '../typescriptService'; import API from '../utils/api'; +import { nulToken } from '../utils/cancellation'; import { applyCodeAction } from '../utils/codeAction'; import { Command, CommandManager } from '../utils/commandManager'; +import { ConfigurationDependentRegistration } from '../utils/dependentRegistration'; +import { memoize } from '../utils/memoize'; import * as Previewer from '../utils/previewer'; import * as typeConverters from '../utils/typeConverters'; import TypingsStatus from '../utils/typingsStatus'; import FileConfigurationManager from './fileConfigurationManager'; -import { memoize } from '../utils/memoize'; -import { nulToken } from '../utils/cancellation'; const localize = nls.loadMessageBundle(); @@ -237,7 +238,6 @@ interface CompletionConfiguration { readonly nameSuggestions: boolean; readonly quickSuggestionsForPaths: boolean; readonly autoImportSuggestions: boolean; - readonly typeScriptSuggestions: boolean; } namespace CompletionConfiguration { @@ -245,7 +245,6 @@ namespace CompletionConfiguration { export const nameSuggestions = 'nameSuggestions'; export const quickSuggestionsForPaths = 'quickSuggestionsForPaths'; export const autoImportSuggestions = 'autoImportSuggestions.enabled'; - export const typeScriptSuggestions = 'suggestions.enabled'; export function getConfigurationForResource( resource: vscode.Uri @@ -256,7 +255,6 @@ namespace CompletionConfiguration { useCodeSnippetsOnMethodSuggest: typeScriptConfig.get(CompletionConfiguration.useCodeSnippetsOnMethodSuggest, false), quickSuggestionsForPaths: typeScriptConfig.get(CompletionConfiguration.quickSuggestionsForPaths, true), autoImportSuggestions: typeScriptConfig.get(CompletionConfiguration.autoImportSuggestions, true), - typeScriptSuggestions: typeScriptConfig.get(CompletionConfiguration.typeScriptSuggestions, true), nameSuggestions: vscode.workspace.getConfiguration('javascript', resource).get(CompletionConfiguration.nameSuggestions, true) }; } @@ -468,10 +466,6 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider ): boolean { if (context.triggerCharacter && !this.client.apiVersion.gte(API.v290)) { if ((context.triggerCharacter === '"' || context.triggerCharacter === '\'')) { - if (!config.quickSuggestionsForPaths) { - return false; - } - // make sure we are in something that looks like the start of an import const pre = line.text.slice(0, position.character); if (!pre.match(/\b(from|import)\s*["']$/) && !pre.match(/\b(import|require)\(['"]$/)) { @@ -608,9 +602,7 @@ function shouldExcludeCompletionEntry( completionConfiguration: CompletionConfiguration ) { return ( - // if TypeScript suggestions turned off, exclude every suggestion - !completionConfiguration.typeScriptSuggestions - || (!completionConfiguration.nameSuggestions && element.kind === PConst.Kind.warning) + (!completionConfiguration.nameSuggestions && element.kind === PConst.Kind.warning) || (!completionConfiguration.quickSuggestionsForPaths && (element.kind === PConst.Kind.directory || element.kind === PConst.Kind.script)) || (!completionConfiguration.autoImportSuggestions && element.hasAction) @@ -619,12 +611,14 @@ function shouldExcludeCompletionEntry( export function register( selector: vscode.DocumentSelector, + modeId: string, client: ITypeScriptServiceClient, typingsStatus: TypingsStatus, fileConfigurationManager: FileConfigurationManager, commandManager: CommandManager, ) { - return vscode.languages.registerCompletionItemProvider(selector, - new TypeScriptCompletionItemProvider(client, typingsStatus, fileConfigurationManager, commandManager), - ...TypeScriptCompletionItemProvider.triggerCharacters); + return new ConfigurationDependentRegistration(modeId, 'suggestions.enabled', () => + vscode.languages.registerCompletionItemProvider(selector, + new TypeScriptCompletionItemProvider(client, typingsStatus, fileConfigurationManager, commandManager), + ...TypeScriptCompletionItemProvider.triggerCharacters)); } diff --git a/extensions/typescript-language-features/src/languageProvider.ts b/extensions/typescript-language-features/src/languageProvider.ts index aad5f1a3a44..ef3ce26cfbd 100644 --- a/extensions/typescript-language-features/src/languageProvider.ts +++ b/extensions/typescript-language-features/src/languageProvider.ts @@ -57,7 +57,7 @@ export default class LanguageProvider extends Disposable { const cachedResponse = new CachedNavTreeResponse(); - this._register((await import('./features/completions')).register(selector, this.client, this.typingsStatus, this.fileConfigurationManager, this.commandManager)); + this._register((await import('./features/completions')).register(selector, this.description.id, this.client, this.typingsStatus, this.fileConfigurationManager, this.commandManager)); this._register((await import('./features/definitions')).register(selector, this.client)); this._register((await import('./features/directiveCommentCompletions')).register(selector, this.client)); this._register((await import('./features/documentHighlight')).register(selector, this.client));