From d4626365ee46bd62dd3b944971338330afcf3cb0 Mon Sep 17 00:00:00 2001 From: davidramnero Date: Sun, 26 Jul 2026 10:55:30 +0200 Subject: [PATCH 1/6] fix/#92 filter existing diagnostics based on severity level when severity level is changed --- src/extension.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/extension.ts b/src/extension.ts index 3e3883a..5a88690 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -80,6 +80,18 @@ function parseMinSeverity(str: string): SeverityNumber { } } +function filterOutDiagnosticsBelowSeverityLevel(diagnosticCollection : vscode.DiagnosticCollection, severity : vscode.DiagnosticSeverity) { + diagnosticCollection.forEach((uri : vscode.Uri, diagnostics : readonly vscode.Diagnostic[], collection: vscode.DiagnosticCollection) => { + const filteredDiagnostics = diagnostics?.filter((diagnostic : vscode.Diagnostic) => { + if (severityToNumber(diagnostic.severity) < severityToNumber(severity)) { + return false; + } + return true; + }); + collection.set(uri, filteredDiagnostics); + }); +} + function updateProgressIndicator(): void { if (checksRunning) { cppcheckProgressIndicator.text = `$(loading~spin) Cppcheck Running ..`; @@ -243,6 +255,9 @@ export async function activate(context: vscode.ExtensionContext) { selection.value, vscode.ConfigurationTarget.Workspace ); + + // Clear diagnostics below severity level selected from the problems tab + filterOutDiagnosticsBelowSeverityLevel(diagnosticCollection, parseSeverity(selection.value)); updateMinSeverityOption(); } From fd16c080e39138bdc71f6b8c634b1a9297622384 Mon Sep 17 00:00:00 2001 From: davidramnero Date: Mon, 27 Jul 2026 11:16:42 +0200 Subject: [PATCH 2/6] fix/filter out duplicate suppressions between project file and cli --- src/extension.ts | 19 +++++++++++++------ src/util/files.ts | 24 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 5a88690..a994503 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -8,7 +8,7 @@ import { runCommand } from './util/scripts'; import { looksLikePath, resolvePath, findWorkspaceRoot } from './util/path'; import { diagnosticsUnion } from './util/diagnostics'; import { CodeActionProvider } from './util/codeActions'; -import { writeSuppressionToProjectFile } from './util/files'; +import { parseSuppressionsFromProjectFile, writeSuppressionToProjectFile } from './util/files'; // To keep track of document changes we save hashed versions of their content to this record let documentHashMemory : Record = {}; @@ -255,7 +255,7 @@ export async function activate(context: vscode.ExtensionContext) { selection.value, vscode.ConfigurationTarget.Workspace ); - + // Clear diagnostics below severity level selected from the problems tab filterOutDiagnosticsBelowSeverityLevel(diagnosticCollection, parseSeverity(selection.value)); @@ -470,6 +470,9 @@ async function runCppcheckOnFileXML( '--enable=all', '--inline-suppr', '--xml', + '--suppress=unusedFunction', + '--suppress=missingInclude', + '--suppress=missingIncludeSystem', ...argsParsed, ].filter(Boolean); @@ -481,12 +484,16 @@ async function runCppcheckOnFileXML( var projectFileType = projectFilePath.split('.')[1]; if (projectFileType.toLowerCase() === 'cppcheck') { cppcheckProjectFileUri = vscode.Uri.file(projectFilePath); + // Duplicate suppressions returns an error from cppcheck, so for ease of use we filter these out + const projectFileSuppressions = await parseSuppressionsFromProjectFile(cppcheckProjectFileUri); + for (const projectFileSuppression of projectFileSuppressions) { + const duplicateSuppressionIndex = args.findIndex((a) => a === `--suppress=${projectFileSuppression}`); + if (duplicateSuppressionIndex !== -1) { + args.splice(duplicateSuppressionIndex, 1); + } + } } } else { - args.push( - '--suppress=unusedFunction', - '--suppress=missingInclude', - '--suppress=missingIncludeSystem'); args.push(filePath); } diff --git a/src/util/files.ts b/src/util/files.ts index 00e0e2d..cea3c81 100644 --- a/src/util/files.ts +++ b/src/util/files.ts @@ -1,5 +1,29 @@ import * as vscode from 'vscode'; +export async function parseSuppressionsFromProjectFile(projectFileUri: vscode.Uri) : Promise { + const fileType = projectFileUri.toString().split('.')[1]; + if (fileType !== 'cppcheck') { + throw new Error(`Function writeSuppressionToProjectFile only supports writing to .cppcheck project files! Recieved file is of type .${fileType}`); + } + + // Open project file with vscode workspace API + const document = await vscode.workspace.openTextDocument(projectFileUri); + const text = document.getText(); + + const match = /]*>([\s\S]*?)<\/suppressions>/m.exec(text); + if (!match) { + return []; + } else { + const suppressionsRegex = /]*>([\s\S]*?)<\/suppression>/gm; + const suppressions = match[0].matchAll(suppressionsRegex); + console.log('suppressions', suppressions); + if (!suppressions) { + return []; + } + return [...suppressions].map(m => m[1]); + } +} + export async function writeSuppressionToProjectFile(projectFileUri : vscode.Uri, warningType : String) : Promise { const fileType = projectFileUri.toString().split('.')[1]; if (fileType !== 'cppcheck') { From 40c52715af18ba87a1411e8cf904f13b0cc262e2 Mon Sep 17 00:00:00 2001 From: davidramnero Date: Mon, 27 Jul 2026 11:18:51 +0200 Subject: [PATCH 3/6] removed console log and added explanatory comment --- src/util/files.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/files.ts b/src/util/files.ts index cea3c81..5b8dab4 100644 --- a/src/util/files.ts +++ b/src/util/files.ts @@ -10,13 +10,13 @@ export async function parseSuppressionsFromProjectFile(projectFileUri: vscode.Ur const document = await vscode.workspace.openTextDocument(projectFileUri); const text = document.getText(); + // Parse suppression lines and map to an array of error codes, e.g. ['unusedFunction', 'missingInclude'] const match = /]*>([\s\S]*?)<\/suppressions>/m.exec(text); if (!match) { return []; } else { const suppressionsRegex = /]*>([\s\S]*?)<\/suppression>/gm; const suppressions = match[0].matchAll(suppressionsRegex); - console.log('suppressions', suppressions); if (!suppressions) { return []; } From dcb0a14bb356637edfde403d0a85a16387517ff2 Mon Sep 17 00:00:00 2001 From: davidramnero Date: Mon, 27 Jul 2026 11:21:39 +0200 Subject: [PATCH 4/6] clean up after merge --- src/extension.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index f3b4b80..2009117 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -259,9 +259,6 @@ export async function activate(context: vscode.ExtensionContext) { // Clear diagnostics below severity level selected from the problems tab filterOutDiagnosticsBelowSeverityLevel(diagnosticCollection, parseSeverity(selection.value)); - // Clear diagnostics below severity level selected from the problems tab - filterOutDiagnosticsBelowSeverityLevel(diagnosticCollection, parseSeverity(selection.value)); - updateMinSeverityOption(); } ) From df68f118c368420b46686dae8481206a1ced8600 Mon Sep 17 00:00:00 2001 From: davidramnero Date: Mon, 27 Jul 2026 11:22:33 +0200 Subject: [PATCH 5/6] updated error message to be accurate --- src/util/files.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/files.ts b/src/util/files.ts index 5b8dab4..ba1e644 100644 --- a/src/util/files.ts +++ b/src/util/files.ts @@ -3,7 +3,7 @@ import * as vscode from 'vscode'; export async function parseSuppressionsFromProjectFile(projectFileUri: vscode.Uri) : Promise { const fileType = projectFileUri.toString().split('.')[1]; if (fileType !== 'cppcheck') { - throw new Error(`Function writeSuppressionToProjectFile only supports writing to .cppcheck project files! Recieved file is of type .${fileType}`); + throw new Error(`Function parseSuppressionsFromProjectFile only supports parsing .cppcheck project files! Recieved file is of type .${fileType}`); } // Open project file with vscode workspace API From 74463417c39d3030a1ceae6ae25fcee15950b2ec Mon Sep 17 00:00:00 2001 From: davidramnero Date: Mon, 27 Jul 2026 11:28:32 +0200 Subject: [PATCH 6/6] filter out duplicates from cli arguments --- src/extension.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 2009117..ad88dfd 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -466,7 +466,8 @@ async function runCppcheckOnFileXML( let usingProjectFile = false; cppcheckProjectFileUri = undefined; - const args = [ + // Cast to Set and back to array to filter out duplicate arguments + const args = [...new Set([ '--enable=all', '--inline-suppr', '--xml', @@ -474,7 +475,7 @@ async function runCppcheckOnFileXML( '--suppress=missingInclude', '--suppress=missingIncludeSystem', ...argsParsed, - ].filter(Boolean); + ])].filter(Boolean); if (processedArgs.includes("--project=")) { usingProjectFile = true;