diff --git a/README.md b/README.md index cc63e4f7..f1d54b88 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,10 @@ Some of the preferences can be controlled through the `workspace/didChangeConfig [language].inlayHints.includeInlayParameterNameHintsWhenArgumentMatchesName: boolean; [language].inlayHints.includeInlayPropertyDeclarationTypeHints: boolean; [language].inlayHints.includeInlayVariableTypeHints: boolean; +// Diagnostics code to be omitted when reporting diagnostics. +// See https://github.com/microsoft/TypeScript/blob/master/src/compiler/diagnosticMessages.json for a full list of valid codes. +diagnostics.ignoredCodes: number[]; + ``` ## Code actions on save diff --git a/src/diagnostic-queue.ts b/src/diagnostic-queue.ts index 7269a230..323e2e7d 100644 --- a/src/diagnostic-queue.ts +++ b/src/diagnostic-queue.ts @@ -45,6 +45,7 @@ class FileDiagnostics { export class DiagnosticEventQueue { protected readonly diagnostics = new Map(); + private ignoredDiagnosticCodes: Set = new Set(); constructor( protected readonly publishDiagnostics: (params: lsp.PublishDiagnosticsParams) => void, @@ -59,10 +60,23 @@ export class DiagnosticEventQueue { return; } const { file } = event.body; + let { diagnostics } = event.body; + + if (this.ignoredDiagnosticCodes.size) { + diagnostics = diagnostics.filter(diagnostic => !this.isDiagnosticIgnored(diagnostic)); + } const uri = pathToUri(file, this.documents); - const diagnostics = this.diagnostics.get(uri) || new FileDiagnostics( + const diagnosticsForFile = this.diagnostics.get(uri) || new FileDiagnostics( uri, this.publishDiagnostics, this.documents, this.publishDiagnosticsCapabilities); - diagnostics.update(kind, event.body.diagnostics); - this.diagnostics.set(uri, diagnostics); + diagnosticsForFile.update(kind, diagnostics); + this.diagnostics.set(uri, diagnosticsForFile); + } + + updateIgnoredDiagnosticCodes(ignoredCodes: readonly number[]): void { + this.ignoredDiagnosticCodes = new Set(ignoredCodes); + } + + private isDiagnosticIgnored(diagnostic: tsp.Diagnostic) : boolean { + return diagnostic.code !== undefined && this.ignoredDiagnosticCodes.has(diagnostic.code); } } diff --git a/src/lsp-server.spec.ts b/src/lsp-server.spec.ts index 7b5337c1..c40cf16f 100644 --- a/src/lsp-server.spec.ts +++ b/src/lsp-server.spec.ts @@ -333,6 +333,38 @@ describe('diagnostics', () => { assert.equal(diagnosticsForDoc!.diagnostics.length, 1, JSON.stringify(diagnostics)); assert.equal(diagnosticsForDoc2!.diagnostics.length, 1, JSON.stringify(diagnostics)); }).timeout(10000); + + it('code 6133 (ununsed variable) is ignored', async () => { + server.didChangeConfiguration({ + settings: { + diagnostics: { + ignoredCodes: [6133] + } + } + }); + + const doc = { + uri: uri('diagnosticsBar2.ts'), + languageId: 'typescript', + version: 1, + text: ` + export function foo() { + const x = 42; + return 1; + } + ` + }; + server.didOpenTextDocument({ + textDocument: doc + }); + + await server.requestDiagnostics(); + await new Promise(resolve => setTimeout(resolve, 200)); + const diagnosticsForThisFile = diagnostics.get(doc.uri); + assert.isDefined(diagnosticsForThisFile); + const fileDiagnostics = diagnosticsForThisFile!.diagnostics; + assert.equal(fileDiagnostics.length, 0, JSON.stringify(fileDiagnostics)); + }).timeout(10000); }); describe('document symbol', () => { diff --git a/src/lsp-server.ts b/src/lsp-server.ts index e63bf7ee..13fbb93c 100644 --- a/src/lsp-server.ts +++ b/src/lsp-server.ts @@ -275,6 +275,8 @@ export class LspServer { didChangeConfiguration(params: lsp.DidChangeConfigurationParams): void { this.workspaceConfiguration = params.settings || {}; + const ignoredDiagnosticCodes = this.workspaceConfiguration.diagnostics?.ignoredCodes || []; + this.diagnosticQueue?.updateIgnoredDiagnosticCodes(ignoredDiagnosticCodes); } getWorkspacePreferencesForDocument(file: string): TypeScriptWorkspaceSettingsLanguageSettings { diff --git a/src/ts-protocol.ts b/src/ts-protocol.ts index 4024efa7..b058180e 100644 --- a/src/ts-protocol.ts +++ b/src/ts-protocol.ts @@ -43,7 +43,12 @@ export interface TypeScriptWorkspaceSettingsLanguageSettings { inlayHints?: InlayHintsOptions; } +interface TypeScriptWorkspaceSettingsDiagnostics { + ignoredCodes?: number[]; +} + export interface TypeScriptWorkspaceSettings { javascript?: TypeScriptWorkspaceSettingsLanguageSettings; typescript?: TypeScriptWorkspaceSettingsLanguageSettings; + diagnostics?: TypeScriptWorkspaceSettingsDiagnostics; }