From 8c74372cee5528355ea4978647e464d2c01a92c7 Mon Sep 17 00:00:00 2001 From: davidramnero Date: Mon, 17 Aug 2026 10:40:10 +0200 Subject: [PATCH] fix / only display code actions once for multiple warnings of same type on same line --- src/util/codeActions.ts | 7 +++++-- src/util/diagnostics.ts | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/util/codeActions.ts b/src/util/codeActions.ts index 989f16f..2f82887 100644 --- a/src/util/codeActions.ts +++ b/src/util/codeActions.ts @@ -1,5 +1,5 @@ import * as vscode from 'vscode'; -import { DiagnosticMetadataStore } from './diagnostics'; +import { DiagnosticMetadataStore, filterDiagnosticsDuplicatesForLine } from './diagnostics'; import { ProjectFileStore } from './files'; export class CodeActionProvider implements vscode.CodeActionProvider { constructor( @@ -15,7 +15,10 @@ export class CodeActionProvider implements vscode.CodeActionProvider { const actions: vscode.CodeAction[] = []; - for (const diagnostic of context.diagnostics) { + // If same warning exists more than once on a given line we don't want duplicated code actions + const diagnostics = filterDiagnosticsDuplicatesForLine(context.diagnostics); + + for (const diagnostic of diagnostics) { // Only provide these code actions for cppcheck errors if (diagnostic.source !== 'cppcheck') { continue; diff --git a/src/util/diagnostics.ts b/src/util/diagnostics.ts index f28fcb2..af5e926 100644 --- a/src/util/diagnostics.ts +++ b/src/util/diagnostics.ts @@ -16,6 +16,26 @@ export class DiagnosticMetadataStore { } } +export function filterDiagnosticsDuplicatesForLine(diagnostics: readonly vscode.Diagnostic[]) { + // If we have more than 1 diagnostic of a given type for the same line we want to remove all but one + const filteredDiagnostics : vscode.Diagnostic[] = []; + + for (const diagnostic of diagnostics) { + const duplicate = filteredDiagnostics.some((d) => { + if (typeof(diagnostic?.code) === "object" && typeof(diagnostic?.code) !== null && typeof(d?.code) === "object" && typeof(d?.code) !== null) { + return diagnostic.code.value === d.code.value && diagnostic.range.start.line === d.range.start.line; + } else { + return diagnostic.code === d.code && diagnostic.range.start.line === d.range.start.line; + } + }); + if (!duplicate) { + filteredDiagnostics.push(diagnostic); + } + } + + return filteredDiagnostics; +} + export function diagnosticsUnion(diagnosticsA : vscode.Diagnostic[], diagnosticB : vscode.Diagnostic[]) : vscode.Diagnostic[] { const diagnosticsUnion = new Array; // Add all elements from diagnosticsA to result array