diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 179ee762366..2203c633c2f 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -727,13 +727,13 @@ "type": "boolean", "default": true, "description": "%configuration.suggest.completeJSDocs%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.suggest.completeJSDocs": { "type": "boolean", "default": true, "description": "%configuration.suggest.completeJSDocs%", - "scope": "resource" + "scope": "language-overridable" }, "javascript.suggest.jsdoc.generateReturns": { "type": "boolean", @@ -979,24 +979,26 @@ "typescript.autoClosingTags": { "type": "boolean", "default": true, - "description": "%typescript.autoClosingTags%" + "description": "%typescript.autoClosingTags%", + "scope": "language-overridable" }, "javascript.autoClosingTags": { "type": "boolean", "default": true, - "description": "%typescript.autoClosingTags%" + "description": "%typescript.autoClosingTags%", + "scope": "language-overridable" }, "javascript.suggest.enabled": { "type": "boolean", "default": true, "description": "%typescript.suggest.enabled%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.suggest.enabled": { "type": "boolean", "default": true, "description": "%typescript.suggest.enabled%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.surveys.enabled": { "type": "boolean", diff --git a/extensions/typescript-language-features/src/languageFeatures/codeLens/implementationsCodeLens.ts b/extensions/typescript-language-features/src/languageFeatures/codeLens/implementationsCodeLens.ts index dc5ae444fb1..3e510c793af 100644 --- a/extensions/typescript-language-features/src/languageFeatures/codeLens/implementationsCodeLens.ts +++ b/extensions/typescript-language-features/src/languageFeatures/codeLens/implementationsCodeLens.ts @@ -9,7 +9,7 @@ import type * as Proto from '../../protocol'; import * as PConst from '../../protocol.const'; import { CachedResponse } from '../../tsServer/cachedResponse'; import { ClientCapability, ITypeScriptServiceClient } from '../../typescriptService'; -import { conditionalRegistration, requireConfiguration, requireSomeCapability } from '../../utils/dependentRegistration'; +import { conditionalRegistration, requireGlobalConfiguration, requireSomeCapability } from '../../utils/dependentRegistration'; import { DocumentSelector } from '../../utils/documentSelector'; import { LanguageDescription } from '../../utils/languageDescription'; import * as typeConverters from '../../utils/typeConverters'; @@ -95,7 +95,7 @@ export function register( cachedResponse: CachedResponse, ) { return conditionalRegistration([ - requireConfiguration(language.id, 'implementationsCodeLens.enabled'), + requireGlobalConfiguration(language.id, 'implementationsCodeLens.enabled'), requireSomeCapability(client, ClientCapability.Semantic), ], () => { return vscode.languages.registerCodeLensProvider(selector.semantic, diff --git a/extensions/typescript-language-features/src/languageFeatures/codeLens/referencesCodeLens.ts b/extensions/typescript-language-features/src/languageFeatures/codeLens/referencesCodeLens.ts index b5bd64381a7..e3280c2387f 100644 --- a/extensions/typescript-language-features/src/languageFeatures/codeLens/referencesCodeLens.ts +++ b/extensions/typescript-language-features/src/languageFeatures/codeLens/referencesCodeLens.ts @@ -10,7 +10,7 @@ import * as PConst from '../../protocol.const'; import { CachedResponse } from '../../tsServer/cachedResponse'; import { ExecutionTarget } from '../../tsServer/server'; import { ClientCapability, ITypeScriptServiceClient } from '../../typescriptService'; -import { conditionalRegistration, requireConfiguration, requireSomeCapability } from '../../utils/dependentRegistration'; +import { conditionalRegistration, requireGlobalConfiguration, requireSomeCapability } from '../../utils/dependentRegistration'; import { DocumentSelector } from '../../utils/documentSelector'; import { LanguageDescription } from '../../utils/languageDescription'; import * as typeConverters from '../../utils/typeConverters'; @@ -132,7 +132,7 @@ export function register( cachedResponse: CachedResponse, ) { return conditionalRegistration([ - requireConfiguration(language.id, 'referencesCodeLens.enabled'), + requireGlobalConfiguration(language.id, 'referencesCodeLens.enabled'), requireSomeCapability(client, ClientCapability.Semantic), ], () => { return vscode.languages.registerCodeLensProvider(selector.semantic, diff --git a/extensions/typescript-language-features/src/languageFeatures/completions.ts b/extensions/typescript-language-features/src/languageFeatures/completions.ts index a2dbdb149b0..be2295050e8 100644 --- a/extensions/typescript-language-features/src/languageFeatures/completions.ts +++ b/extensions/typescript-language-features/src/languageFeatures/completions.ts @@ -12,7 +12,7 @@ import { ClientCapability, ITypeScriptServiceClient, ServerResponse } from '../t import API from '../utils/api'; import { nulToken } from '../utils/cancellation'; import { applyCodeAction } from '../utils/codeAction'; -import { conditionalRegistration, requireConfiguration, requireSomeCapability } from '../utils/dependentRegistration'; +import { conditionalRegistration, requireSomeCapability } from '../utils/dependentRegistration'; import { DocumentSelector } from '../utils/documentSelector'; import { LanguageDescription } from '../utils/languageDescription'; import { parseKindModifier } from '../utils/modifiers'; @@ -662,6 +662,10 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider< token: vscode.CancellationToken, context: vscode.CompletionContext ): Promise | undefined> { + if (!vscode.workspace.getConfiguration(this.language.id, document).get('suggest.enabled')) { + return undefined; + } + if (this.typingsStatus.isAcquiringTypings) { return Promise.reject>({ label: localize( @@ -929,7 +933,6 @@ export function register( onCompletionAccepted: (item: vscode.CompletionItem) => void ) { return conditionalRegistration([ - requireConfiguration(language.id, 'suggest.enabled'), requireSomeCapability(client, ClientCapability.EnhancedSyntax, ClientCapability.Semantic), ], () => { return vscode.languages.registerCompletionItemProvider(selector.syntax, diff --git a/extensions/typescript-language-features/src/languageFeatures/formatting.ts b/extensions/typescript-language-features/src/languageFeatures/formatting.ts index 52dfbc44cf0..fa9b9723c43 100644 --- a/extensions/typescript-language-features/src/languageFeatures/formatting.ts +++ b/extensions/typescript-language-features/src/languageFeatures/formatting.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode'; import type * as Proto from '../protocol'; import { ITypeScriptServiceClient } from '../typescriptService'; -import { conditionalRegistration, requireConfiguration } from '../utils/dependentRegistration'; +import { conditionalRegistration, requireGlobalConfiguration } from '../utils/dependentRegistration'; import { DocumentSelector } from '../utils/documentSelector'; import { LanguageDescription } from '../utils/languageDescription'; import * as typeConverters from '../utils/typeConverters'; @@ -92,7 +92,7 @@ export function register( fileConfigurationManager: FileConfigurationManager ) { return conditionalRegistration([ - requireConfiguration(language.id, 'format.enable'), + requireGlobalConfiguration(language.id, 'format.enable'), ], () => { const formattingProvider = new TypeScriptFormattingProvider(client, fileConfigurationManager); return vscode.Disposable.from( diff --git a/extensions/typescript-language-features/src/languageFeatures/jsDocCompletions.ts b/extensions/typescript-language-features/src/languageFeatures/jsDocCompletions.ts index 58b73b383cd..3c481dcc177 100644 --- a/extensions/typescript-language-features/src/languageFeatures/jsDocCompletions.ts +++ b/extensions/typescript-language-features/src/languageFeatures/jsDocCompletions.ts @@ -6,7 +6,6 @@ import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; import { ITypeScriptServiceClient } from '../typescriptService'; -import { conditionalRegistration, requireConfiguration } from '../utils/dependentRegistration'; import { DocumentSelector } from '../utils/documentSelector'; import { LanguageDescription } from '../utils/languageDescription'; import * as typeConverters from '../utils/typeConverters'; @@ -39,6 +38,7 @@ class JsDocCompletionProvider implements vscode.CompletionItemProvider { constructor( private readonly client: ITypeScriptServiceClient, + private readonly language: LanguageDescription, private readonly fileConfigurationManager: FileConfigurationManager, ) { } @@ -47,6 +47,10 @@ class JsDocCompletionProvider implements vscode.CompletionItemProvider { position: vscode.Position, token: vscode.CancellationToken ): Promise { + if (!vscode.workspace.getConfiguration(this.language.id, document).get('suggest.completeJSDocs')) { + return undefined; + } + const file = this.client.toOpenedFilePath(document); if (!file) { return undefined; @@ -127,11 +131,7 @@ export function register( fileConfigurationManager: FileConfigurationManager, ): vscode.Disposable { - return conditionalRegistration([ - requireConfiguration(language.id, 'suggest.completeJSDocs') - ], () => { - return vscode.languages.registerCompletionItemProvider(selector.syntax, - new JsDocCompletionProvider(client, fileConfigurationManager), - '*'); - }); + return vscode.languages.registerCompletionItemProvider(selector.syntax, + new JsDocCompletionProvider(client, language, fileConfigurationManager), + '*'); } diff --git a/extensions/typescript-language-features/src/languageFeatures/tagClosing.ts b/extensions/typescript-language-features/src/languageFeatures/tagClosing.ts index 688ec3eb17d..aeaa1bbcaae 100644 --- a/extensions/typescript-language-features/src/languageFeatures/tagClosing.ts +++ b/extensions/typescript-language-features/src/languageFeatures/tagClosing.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode'; import type * as Proto from '../protocol'; import { ITypeScriptServiceClient } from '../typescriptService'; import API from '../utils/api'; -import { Condition, conditionalRegistration, requireConfiguration, requireMinVersion } from '../utils/dependentRegistration'; +import { Condition, conditionalRegistration, requireMinVersion } from '../utils/dependentRegistration'; import { Disposable } from '../utils/dispose'; import { DocumentSelector } from '../utils/documentSelector'; import { LanguageDescription } from '../utils/languageDescription'; @@ -140,18 +140,24 @@ class TagClosing extends Disposable { } } -function requireActiveDocument( - selector: vscode.DocumentSelector +function requireActiveDocumentSetting( + selector: vscode.DocumentSelector, + language: LanguageDescription, ) { return new Condition( () => { const editor = vscode.window.activeTextEditor; - return !!(editor && vscode.languages.match(selector, editor.document)); + if (!editor || !vscode.languages.match(selector, editor.document)) { + return false; + } + + return !!vscode.workspace.getConfiguration(language.id, editor.document).get('autoClosingTags'); }, handler => { return vscode.Disposable.from( vscode.window.onDidChangeActiveTextEditor(handler), - vscode.workspace.onDidOpenTextDocument(handler)); + vscode.workspace.onDidOpenTextDocument(handler), + vscode.workspace.onDidChangeConfiguration(handler)); }); } @@ -162,7 +168,6 @@ export function register( ) { return conditionalRegistration([ requireMinVersion(client, TagClosing.minVersion), - requireConfiguration(language.id, 'autoClosingTags'), - requireActiveDocument(selector.syntax) + requireActiveDocumentSetting(selector.syntax, language) ], () => new TagClosing(client)); } diff --git a/extensions/typescript-language-features/src/utils/dependentRegistration.ts b/extensions/typescript-language-features/src/utils/dependentRegistration.ts index 948ce5bf0c3..3d97b8a8e7f 100644 --- a/extensions/typescript-language-features/src/utils/dependentRegistration.ts +++ b/extensions/typescript-language-features/src/utils/dependentRegistration.ts @@ -83,7 +83,7 @@ export function requireMinVersion( ); } -export function requireConfiguration( +export function requireGlobalConfiguration( section: string, configValue: string, ) {