diff --git a/extensions/typescript/src/features/diagnostics.ts b/extensions/typescript/src/features/diagnostics.ts index 526ed6f8ce4..606940ed7eb 100644 --- a/extensions/typescript/src/features/diagnostics.ts +++ b/extensions/typescript/src/features/diagnostics.ts @@ -94,4 +94,8 @@ export default class DiagnosticsManager { const syntaxDiagnostics = this.syntaxDiagnostics.get(file); this.currentDiagnostics.set(file, semanticDiagnostics.concat(syntaxDiagnostics)); } + + public getDiagnostics(file: Uri): Diagnostic[] { + return this.currentDiagnostics.get(file) || []; + } } \ No newline at end of file diff --git a/extensions/typescript/src/features/quickFixProvider.ts b/extensions/typescript/src/features/quickFixProvider.ts index d83c23d64da..128ddda7e06 100644 --- a/extensions/typescript/src/features/quickFixProvider.ts +++ b/extensions/typescript/src/features/quickFixProvider.ts @@ -12,6 +12,7 @@ import FormattingConfigurationManager from './formattingConfigurationManager'; import { getEditForCodeAction, applyCodeActionCommands } from '../utils/codeAction'; import { Command, CommandManager } from '../utils/commandManager'; import { createWorkspaceEditFromFileCodeEdits } from '../utils/workspaceEdit'; +import DiagnosticsManager from './diagnostics'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); @@ -61,7 +62,8 @@ export default class TypeScriptQuickFixProvider implements vscode.CodeActionProv constructor( private readonly client: ITypeScriptServiceClient, private readonly formattingConfigurationManager: FormattingConfigurationManager, - commandManager: CommandManager + commandManager: CommandManager, + private readonly diagnosticsManager: DiagnosticsManager ) { commandManager.register(new ApplyCodeActionCommand(client)); this.supportedCodeActionProvider = new SupportedCodeActionProvider(client); @@ -91,12 +93,13 @@ export default class TypeScriptQuickFixProvider implements vscode.CodeActionProv const results: vscode.CodeAction[] = []; for (const diagnostic of fixableDiagnostics) { - results.push(...await this.getFixesForDiagnostic(file, diagnostic, token)); + results.push(...await this.getFixesForDiagnostic(document, file, diagnostic, token)); } return results; } private async getFixesForDiagnostic( + document: vscode.TextDocument, file: string, diagnostic: vscode.Diagnostic, token: vscode.CancellationToken @@ -109,7 +112,7 @@ export default class TypeScriptQuickFixProvider implements vscode.CodeActionProv if (codeFixesResponse.body) { const results: vscode.CodeAction[] = []; for (const tsCodeFix of codeFixesResponse.body) { - results.push(...await this.getAllFixesForTsCodeAction(file, diagnostic, tsCodeFix, token)); + results.push(...await this.getAllFixesForTsCodeAction(document, file, diagnostic, tsCodeFix, token)); } return results; } @@ -117,13 +120,14 @@ export default class TypeScriptQuickFixProvider implements vscode.CodeActionProv } private async getAllFixesForTsCodeAction( + document: vscode.TextDocument, file: string, diagnostic: vscode.Diagnostic, tsAction: Proto.CodeFixAction, token: vscode.CancellationToken ): Promise> { const singleFix = this.getSingleFixForTsCodeAction(diagnostic, tsAction); - const fixAll = await this.getFixAllForTsCodeAction(file, diagnostic, tsAction, token); + const fixAll = await this.getFixAllForTsCodeAction(document, file, diagnostic, tsAction, token); return fixAll ? [singleFix, fixAll] : [singleFix]; } @@ -145,6 +149,7 @@ export default class TypeScriptQuickFixProvider implements vscode.CodeActionProv } private async getFixAllForTsCodeAction( + document: vscode.TextDocument, file: string, diagnostic: vscode.Diagnostic, tsAction: Proto.CodeFixAction, @@ -154,6 +159,11 @@ export default class TypeScriptQuickFixProvider implements vscode.CodeActionProv return undefined; } + // Make sure there are multiple diagnostics of the same type in the file + if (!this.diagnosticsManager.getDiagnostics(document.uri).some(x => x.code === diagnostic.code && x !== diagnostic)) { + return; + } + const args: Proto.GetCombinedCodeFixRequestArgs = { scope: { type: 'file', diff --git a/extensions/typescript/src/languageProvider.ts b/extensions/typescript/src/languageProvider.ts index 39d5ef0616f..1f291018a30 100644 --- a/extensions/typescript/src/languageProvider.ts +++ b/extensions/typescript/src/languageProvider.ts @@ -123,7 +123,7 @@ export default class LanguageProvider { this.disposables.push(languages.registerDocumentSymbolProvider(selector, new (await import('./features/documentSymbolProvider')).default(client))); this.disposables.push(languages.registerSignatureHelpProvider(selector, new (await import('./features/signatureHelpProvider')).default(client), '(', ',')); this.disposables.push(languages.registerRenameProvider(selector, new (await import('./features/renameProvider')).default(client))); - this.disposables.push(languages.registerCodeActionsProvider(selector, new (await import('./features/quickFixProvider')).default(client, this.formattingOptionsManager, commandManager))); + this.disposables.push(languages.registerCodeActionsProvider(selector, new (await import('./features/quickFixProvider')).default(client, this.formattingOptionsManager, commandManager, this.diagnosticsManager))); this.disposables.push(languages.registerCodeActionsProvider(selector, new (await import('./features/refactorProvider')).default(client, this.formattingOptionsManager, commandManager))); this.registerVersionDependentProviders();