Adopt unified js/ts setting for diagnostic settings

For #292934

Also renames validate.enable to `validate.enabled` to align with other settings
This commit is contained in:
Matt Bierner
2026-02-20 17:54:24 -08:00
parent 42bb5a85ee
commit 655ce6f07e
6 changed files with 46 additions and 35 deletions

View File

@@ -1366,22 +1366,44 @@
"type": "object",
"title": "%configuration.validation%",
"properties": {
"js/ts.validate.enabled": {
"type": "boolean",
"default": true,
"description": "%configuration.validate.enable%",
"scope": "language-overridable",
"tags": [
"JavaScript",
"TypeScript"
]
},
"typescript.validate.enable": {
"type": "boolean",
"default": true,
"description": "%typescript.validate.enable%",
"markdownDeprecationMessage": "%configuration.validate.enable.unifiedDeprecationMessage%",
"scope": "window"
},
"javascript.validate.enable": {
"type": "boolean",
"default": true,
"description": "%javascript.validate.enable%",
"markdownDeprecationMessage": "%configuration.validate.enable.unifiedDeprecationMessage%",
"scope": "window"
},
"js/ts.reportStyleChecksAsWarnings": {
"type": "boolean",
"default": true,
"description": "%typescript.reportStyleChecksAsWarnings%",
"scope": "window",
"tags": [
"TypeScript"
]
},
"typescript.reportStyleChecksAsWarnings": {
"type": "boolean",
"default": true,
"description": "%typescript.reportStyleChecksAsWarnings%",
"markdownDeprecationMessage": "%configuration.reportStyleChecksAsWarnings.unifiedDeprecationMessage%",
"scope": "window"
},
"js/ts.suggestionActions.enabled": {

View File

@@ -29,6 +29,9 @@
"typescript.tsserver.pluginPaths.item": "Either an absolute or relative path. Relative path will be resolved against workspace folder(s).",
"typescript.tsserver.trace": "Enables tracing of messages sent to the TS server. This trace can be used to diagnose TS Server issues. The trace may contain file paths, source code, and other potentially sensitive information from your project.",
"typescript.validate.enable": "Enable/disable TypeScript validation.",
"javascript.validate.enable": "Enable/disable JavaScript validation.",
"configuration.validate.enable": "Enable/disable JavaScript and TypeScript validation.",
"configuration.validate.enable.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.validate.enable#` instead.",
"typescript.format.enable": "Enable/disable default TypeScript formatter.",
"javascript.format.enable": "Enable/disable default JavaScript formatter.",
"format.insertSpaceAfterCommaDelimiter": "Defines space handling after a comma delimiter.",
@@ -72,7 +75,6 @@
"configuration.format.placeOpenBraceOnNewLineForControlBlocks.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.format.placeOpenBraceOnNewLineForControlBlocks#` instead.",
"configuration.format.semicolons.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.format.semicolons#` instead.",
"configuration.format.indentSwitchCase.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.format.indentSwitchCase#` instead.",
"javascript.validate.enable": "Enable/disable JavaScript validation.",
"javascript.goToProjectConfig.title": "Go to Project Configuration (jsconfig / tsconfig)",
"typescript.goToProjectConfig.title": "Go to Project Configuration (tsconfig)",
"configuration.referencesCodeLens.enabled": "Enable/disable references CodeLens in JavaScript and TypeScript files. This CodeLens shows the number of references for classes and exported functions and allows you to peek or navigate to them.",
@@ -89,6 +91,7 @@
"typescript.restartTsServer": "Restart TS Server",
"typescript.selectTypeScriptVersion.title": "Select TypeScript Version...",
"typescript.reportStyleChecksAsWarnings": "Report style checks as warnings.",
"configuration.reportStyleChecksAsWarnings.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.reportStyleChecksAsWarnings#` instead.",
"typescript.npm": "Specifies the path to the npm executable used for [Automatic Type Acquisition](https://code.visualstudio.com/docs/nodejs/working-with-javascript#_typings-and-automatic-type-acquisition).",
"typescript.check.npmIsInstalled": "Check if npm is installed for [Automatic Type Acquisition](https://code.visualstudio.com/docs/nodejs/working-with-javascript#_typings-and-automatic-type-acquisition).",
"configuration.suggest.names": "Enable/disable including unique names from the file in JavaScript suggestions. Note that name suggestions are always disabled in JavaScript code that is semantically checked using `@ts-check` or `checkJs`.",

View File

@@ -22,9 +22,6 @@ import { readUnifiedConfig } from './utils/configuration';
import { isWeb, isWebAndHasSharedArrayBuffers, supportsReadableByteStreams } from './utils/platform';
const validateSetting = 'validate.enable';
const suggestionSetting = 'suggestionActions.enabled';
export default class LanguageProvider extends Disposable {
constructor(
@@ -95,9 +92,9 @@ export default class LanguageProvider extends Disposable {
}
private configurationChanged(): void {
const config = vscode.workspace.getConfiguration(this.id, null);
this.updateValidate(config.get(validateSetting, true));
this.updateSuggestionDiagnostics(readUnifiedConfig<boolean>(suggestionSetting, true, { scope: null, fallbackSection: this.id }));
const scope: vscode.ConfigurationScope = { languageId: this.description.languageIds[0] };
this.updateValidate(readUnifiedConfig<boolean>('validate.enabled', true, { scope, fallbackSection: this.id, fallbackSubSectionNameOverride: 'validate.enable' }));
this.updateSuggestionDiagnostics(readUnifiedConfig<boolean>('suggestionActions.enabled', true, { scope, fallbackSection: this.id }));
}
public handlesUri(resource: vscode.Uri): boolean {

View File

@@ -10,6 +10,7 @@ import * as typeConverters from '../typeConverters';
import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService';
import { inMemoryResourcePrefix } from '../typescriptServiceClient';
import { coalesce } from '../utils/arrays';
import { readUnifiedConfig, unifiedConfigSection } from '../utils/configuration';
import { Delayer, setImmediate } from '../utils/async';
import { nulToken } from '../utils/cancellation';
import { Disposable } from '../utils/dispose';
@@ -161,7 +162,7 @@ class SyncedBuffer {
private state = BufferState.Initial;
constructor(
private readonly document: vscode.TextDocument,
public readonly document: vscode.TextDocument,
public readonly filepath: string,
private readonly client: ITypeScriptServiceClient,
private readonly synchronizer: BufferSynchronizer,
@@ -462,9 +463,6 @@ export default class BufferSyncSupport extends Disposable {
private readonly client: ITypeScriptServiceClient;
private _validateJavaScript = true;
private _validateTypeScript = true;
private readonly modeIds: Set<string>;
private readonly syncedBuffers: SyncedBufferMap;
private readonly pendingDiagnostics: PendingDiagnostics;
@@ -513,8 +511,14 @@ export default class BufferSyncSupport extends Disposable {
}
}));
this.updateConfiguration();
vscode.workspace.onDidChangeConfiguration(this.updateConfiguration, this, this._disposables);
this._register(vscode.workspace.onDidChangeConfiguration((e) => {
if (e.affectsConfiguration(`${unifiedConfigSection}.validate.enabled`)
|| e.affectsConfiguration('typescript.validate.enabled')
|| e.affectsConfiguration('javascript.validate.enabled')
) {
this.requestAllDiagnostics();
}
}));
}
private readonly _onDelete = this._register(new vscode.EventEmitter<vscode.Uri>());
@@ -756,14 +760,6 @@ export default class BufferSyncSupport extends Disposable {
this.pendingDiagnostics.clear();
}
private updateConfiguration() {
const jsConfig = vscode.workspace.getConfiguration('javascript', null);
const tsConfig = vscode.workspace.getConfiguration('typescript', null);
this._validateJavaScript = jsConfig.get<boolean>('validate.enable', true);
this._validateTypeScript = tsConfig.get<boolean>('validate.enable', true);
}
private shouldValidate(buffer: SyncedBuffer): boolean {
if (fileSchemes.isOfScheme(buffer.resource, fileSchemes.chatCodeBlock)) {
return false;
@@ -773,15 +769,9 @@ export default class BufferSyncSupport extends Disposable {
return false;
}
switch (buffer.languageId) {
case languageModeIds.javascript:
case languageModeIds.javascriptreact:
return this._validateJavaScript;
case languageModeIds.typescript:
case languageModeIds.typescriptreact:
default:
return this._validateTypeScript;
}
const fallbackSection = (buffer.languageId === languageModeIds.javascript || buffer.languageId === languageModeIds.javascriptreact)
? 'javascript'
: 'typescript';
return readUnifiedConfig<boolean>('validate.enabled', true, { scope: buffer.document, fallbackSection, fallbackSubSectionNameOverride: 'validate.enable' });
}
}

View File

@@ -14,6 +14,7 @@ import { ServiceConfigurationProvider } from './configuration/configuration';
import { DiagnosticLanguage, LanguageDescription } from './configuration/languageDescription';
import { IExperimentationTelemetryReporter } from './experimentTelemetryReporter';
import { DiagnosticKind } from './languageFeatures/diagnostics';
import { readUnifiedConfig } from './utils/configuration';
import FileConfigurationManager from './languageFeatures/fileConfigurationManager';
import LanguageProvider from './languageProvider';
import { LogLevelMonitor } from './logging/logLevelMonitor';
@@ -193,9 +194,7 @@ export default class TypeScriptServiceClientHost extends Disposable {
}
private configurationChanged(): void {
const typescriptConfig = vscode.workspace.getConfiguration('typescript');
this.reportStyleCheckAsWarnings = typescriptConfig.get('reportStyleChecksAsWarnings', true);
this.reportStyleCheckAsWarnings = readUnifiedConfig<boolean>('reportStyleChecksAsWarnings', true, { scope: null, fallbackSection: 'typescript' });
}
private async findLanguage(resource: vscode.Uri): Promise<LanguageProvider | undefined> {

View File

@@ -5,7 +5,7 @@
import * as vscode from 'vscode';
export type UnifiedConfigurationScope = vscode.TextDocument | null | undefined;
export type UnifiedConfigurationScope = vscode.ConfigurationScope | null | undefined;
export const unifiedConfigSection = 'js/ts';