@@ -165,10 +165,32 @@ export class SolutionProblemsImpl implements SolutionProblems {
165165 // Merge cbuild errors/warnings into existing diagnostics
166166 const csolution = this . solutionManager . getCsolution ( ) ;
167167 if ( csolution && ( logMessages . errors ?. length || logMessages . warnings ?. length ) ) {
168- await this . updateDiagnostics ( logMessages ) ;
168+ await this . mergeDiagnostics ( logMessages ) ;
169169 }
170170 }
171171
172+ private async mergeDiagnostics ( logMessages : LogMessages ) : Promise < void > {
173+ const existingDiagnostics = new Map < string , { uri : vscode . Uri ; diagnostics : vscode . Diagnostic [ ] } > ( ) ;
174+ this . diagnosticCollection . forEach ( ( uri , diagnostics ) => {
175+ existingDiagnostics . set ( uri . toString ( ) , { uri, diagnostics : [ ...diagnostics ] } ) ;
176+ } ) ;
177+
178+ await this . updateDiagnostics ( logMessages ) ;
179+
180+ const mergedDiagnostics = new Map < string , { uri : vscode . Uri ; diagnostics : vscode . Diagnostic [ ] } > ( existingDiagnostics ) ;
181+ this . diagnosticCollection . forEach ( ( uri , diagnostics ) => {
182+ const key = uri . toString ( ) ;
183+ const existing = mergedDiagnostics . get ( key ) ;
184+ mergedDiagnostics . set ( key , {
185+ uri,
186+ diagnostics : existing ? [ ...existing . diagnostics , ...diagnostics ] : [ ...diagnostics ] ,
187+ } ) ;
188+ } ) ;
189+
190+ this . diagnosticCollection . set (
191+ Array . from ( mergedDiagnostics . values ( ) , ( { uri, diagnostics } ) => [ uri , diagnostics ] as [ vscode . Uri , vscode . Diagnostic [ ] ] ) ,
192+ ) ;
193+ }
172194 private handleLoadStateChanged ( data : SolutionLoadStateChangeEvent ) : void {
173195 if ( data . previousState . solutionPath !== data . newState . solutionPath ) {
174196 this . clearDiagnostics ( ) ;
0 commit comments