Skip to content

Commit a6b6fee

Browse files
authored
Make sure swiftc diagnostics are cleaned up after new swift commands (#915)
This will fix the issue mentioned. There is also an issue that SourceKit and swiftc have different ranges reported which I'll reach out about Issue: #912
1 parent 6662913 commit a6b6fee

File tree

2 files changed

+84
-99
lines changed

2 files changed

+84
-99
lines changed

src/DiagnosticsManager.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -190,12 +190,13 @@ export class DiagnosticsManager implements vscode.Disposable {
190190
}
191191

192192
private removeSwiftcDiagnostics() {
193-
this.diagnosticCollection.forEach((uri, diagnostics) => {
193+
this.allDiagnostics.forEach((diagnostics, path) => {
194194
const newDiagnostics = diagnostics.slice();
195195
this.removeDiagnostics(newDiagnostics, d => this.isSwiftc(d));
196196
if (diagnostics.length !== newDiagnostics.length) {
197-
this.diagnosticCollection.set(uri, newDiagnostics);
197+
this.allDiagnostics.set(path, newDiagnostics);
198198
}
199+
this.updateDiagnosticsCollection(vscode.Uri.file(path));
199200
});
200201
}
201202

@@ -243,10 +244,6 @@ export class DiagnosticsManager implements vscode.Disposable {
243244
return configuration.diagnosticsCollection !== "onlySourceKit";
244245
}
245246

246-
private includeSourceKitDiagnostics(): boolean {
247-
return configuration.diagnosticsCollection !== "onlySwiftc";
248-
}
249-
250247
private parseDiagnostics(swiftExecution: SwiftExecution): Promise<DiagnosticsMap> {
251248
return new Promise<DiagnosticsMap>(res => {
252249
const diagnostics = new Map();

test/suite/DiagnosticsManager.test.ts

Lines changed: 81 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,32 @@ suite("DiagnosticsManager Test Suite", async function () {
247247
assert.equal(diagnostics.length, 1);
248248
assertHasDiagnostic(mainUri, outputDiagnostic);
249249
});
250+
251+
test("New set of swiftc diagnostics clear old list", async () => {
252+
let fixture = testSwiftTask("swift", ["build"], workspaceFolder, toolchain);
253+
await vscode.tasks.executeTask(fixture.task);
254+
let diagnosticsPromise = waitForDiagnostics([mainUri]);
255+
// Wait to spawn before writing
256+
fixture.process.write(`${mainUri.fsPath}:13:5: error: Cannot find 'foo' in scope`);
257+
fixture.process.close(1);
258+
await waitForNoRunningTasks();
259+
await diagnosticsPromise;
260+
let diagnostics = vscode.languages.getDiagnostics(mainUri);
261+
// Should only include one
262+
assert.equal(diagnostics.length, 1);
263+
assertHasDiagnostic(mainUri, outputDiagnostic);
264+
265+
// Run again but no diagnostics returned
266+
fixture = testSwiftTask("swift", ["build"], workspaceFolder, toolchain);
267+
await vscode.tasks.executeTask(fixture.task);
268+
diagnosticsPromise = waitForDiagnostics([mainUri]);
269+
fixture.process.close(0);
270+
await waitForNoRunningTasks();
271+
await diagnosticsPromise;
272+
diagnostics = vscode.languages.getDiagnostics(mainUri);
273+
// Should have cleaned up
274+
assert.equal(diagnostics.length, 0);
275+
});
250276
});
251277
});
252278

@@ -346,30 +372,6 @@ suite("DiagnosticsManager Test Suite", async function () {
346372
assertHasDiagnostic(mainUri, sourcekitErrorDiagnostic);
347373
assertHasDiagnostic(mainUri, sourcekitWarningDiagnostic);
348374
});
349-
350-
test("fix swiftc diagnostic", async () => {
351-
// Add initial diagnostics
352-
workspaceContext.diagnostics.handleDiagnostics(
353-
mainUri,
354-
DiagnosticsManager.sourcekit,
355-
[sourcekitErrorDiagnostic, sourcekitWarningDiagnostic]
356-
);
357-
workspaceContext.diagnostics.handleDiagnostics(mainUri, DiagnosticsManager.swiftc, [
358-
swiftcErrorDiagnostic,
359-
]);
360-
361-
// Have SourceKit some have been fixed
362-
workspaceContext.diagnostics.handleDiagnostics(
363-
mainUri,
364-
DiagnosticsManager.sourcekit,
365-
[sourcekitWarningDiagnostic]
366-
);
367-
368-
// check kept all
369-
assertWithoutDiagnostic(mainUri, swiftcErrorDiagnostic);
370-
assertWithoutDiagnostic(mainUri, sourcekitErrorDiagnostic);
371-
assertHasDiagnostic(mainUri, sourcekitWarningDiagnostic);
372-
});
373375
});
374376

375377
suite("keepSourceKit", () => {
@@ -477,30 +479,6 @@ suite("DiagnosticsManager Test Suite", async function () {
477479
// kept unique swiftc diagnostic
478480
assertHasDiagnostic(mainUri, swiftcWarningDiagnostic);
479481
});
480-
481-
test("fix swiftc diagnostic", async () => {
482-
// Add initial diagnostics
483-
workspaceContext.diagnostics.handleDiagnostics(
484-
mainUri,
485-
DiagnosticsManager.sourcekit,
486-
[sourcekitErrorDiagnostic, sourcekitWarningDiagnostic]
487-
);
488-
workspaceContext.diagnostics.handleDiagnostics(mainUri, DiagnosticsManager.swiftc, [
489-
swiftcErrorDiagnostic,
490-
]);
491-
492-
// Have SourceKit some have been fixed
493-
workspaceContext.diagnostics.handleDiagnostics(
494-
mainUri,
495-
DiagnosticsManager.sourcekit,
496-
[sourcekitWarningDiagnostic]
497-
);
498-
499-
// check kept all
500-
assertWithoutDiagnostic(mainUri, swiftcErrorDiagnostic);
501-
assertWithoutDiagnostic(mainUri, sourcekitErrorDiagnostic);
502-
assertHasDiagnostic(mainUri, sourcekitWarningDiagnostic);
503-
});
504482
});
505483

506484
suite("keepSwiftc", () => {
@@ -583,30 +561,6 @@ suite("DiagnosticsManager Test Suite", async function () {
583561
// kept unique SourceKit diagnostic
584562
assertHasDiagnostic(mainUri, sourcekitWarningDiagnostic);
585563
});
586-
587-
test("fix swiftc diagnostic", async () => {
588-
// Add initial diagnostics
589-
workspaceContext.diagnostics.handleDiagnostics(
590-
mainUri,
591-
DiagnosticsManager.sourcekit,
592-
[sourcekitErrorDiagnostic, sourcekitWarningDiagnostic]
593-
);
594-
workspaceContext.diagnostics.handleDiagnostics(mainUri, DiagnosticsManager.swiftc, [
595-
swiftcErrorDiagnostic,
596-
]);
597-
598-
// Have SourceKit some have been fixed
599-
workspaceContext.diagnostics.handleDiagnostics(
600-
mainUri,
601-
DiagnosticsManager.sourcekit,
602-
[sourcekitWarningDiagnostic]
603-
);
604-
605-
// check kept all
606-
assertWithoutDiagnostic(mainUri, swiftcErrorDiagnostic);
607-
assertWithoutDiagnostic(mainUri, sourcekitErrorDiagnostic);
608-
assertHasDiagnostic(mainUri, sourcekitWarningDiagnostic);
609-
});
610564
});
611565

612566
suite("onlySourceKit", () => {
@@ -734,30 +688,64 @@ suite("DiagnosticsManager Test Suite", async function () {
734688
assertWithoutDiagnostic(mainUri, sourcekitErrorDiagnostic);
735689
assertWithoutDiagnostic(mainUri, sourcekitWarningDiagnostic);
736690
});
691+
});
737692

738-
test("fix swiftc diagnostic", async () => {
739-
// Add initial diagnostics
740-
workspaceContext.diagnostics.handleDiagnostics(
741-
mainUri,
742-
DiagnosticsManager.sourcekit,
743-
[sourcekitErrorDiagnostic, sourcekitWarningDiagnostic]
744-
);
745-
workspaceContext.diagnostics.handleDiagnostics(mainUri, DiagnosticsManager.swiftc, [
746-
swiftcErrorDiagnostic,
747-
]);
693+
test("SourceKit removes swiftc diagnostic (SourceKit shows first)", async () => {
694+
// Add initial diagnostics
695+
workspaceContext.diagnostics.handleDiagnostics(mainUri, DiagnosticsManager.sourcekit, [
696+
sourcekitErrorDiagnostic,
697+
sourcekitWarningDiagnostic,
698+
]);
699+
workspaceContext.diagnostics.handleDiagnostics(mainUri, DiagnosticsManager.swiftc, [
700+
swiftcErrorDiagnostic,
701+
]);
702+
703+
// Have SourceKit indicate some have been fixed
704+
workspaceContext.diagnostics.handleDiagnostics(mainUri, DiagnosticsManager.sourcekit, [
705+
sourcekitWarningDiagnostic,
706+
]);
707+
708+
// check cleaned up stale error
709+
assertWithoutDiagnostic(mainUri, swiftcErrorDiagnostic);
710+
assertWithoutDiagnostic(mainUri, sourcekitErrorDiagnostic);
711+
assertHasDiagnostic(mainUri, sourcekitWarningDiagnostic);
712+
});
748713

749-
// Have SourceKit some have been fixed
750-
workspaceContext.diagnostics.handleDiagnostics(
751-
mainUri,
752-
DiagnosticsManager.sourcekit,
753-
[sourcekitWarningDiagnostic]
754-
);
714+
test("SourceKit removes swiftc diagnostic (swiftc shows first)", async () => {
715+
// Add initial diagnostics
716+
workspaceContext.diagnostics.handleDiagnostics(mainUri, DiagnosticsManager.swiftc, [
717+
swiftcErrorDiagnostic,
718+
swiftcWarningDiagnostic,
719+
]);
720+
workspaceContext.diagnostics.handleDiagnostics(mainUri, DiagnosticsManager.sourcekit, [
721+
sourcekitErrorDiagnostic,
722+
]);
723+
724+
// Have SourceKit indicate has been fixed
725+
workspaceContext.diagnostics.handleDiagnostics(
726+
mainUri,
727+
DiagnosticsManager.sourcekit,
728+
[]
729+
);
755730

756-
// check kept all
757-
assertWithoutDiagnostic(mainUri, swiftcErrorDiagnostic);
758-
assertWithoutDiagnostic(mainUri, sourcekitErrorDiagnostic);
759-
assertWithoutDiagnostic(mainUri, sourcekitWarningDiagnostic);
760-
});
731+
// check cleaned up stale error
732+
assertWithoutDiagnostic(mainUri, swiftcErrorDiagnostic);
733+
assertWithoutDiagnostic(mainUri, sourcekitErrorDiagnostic);
734+
assertHasDiagnostic(mainUri, swiftcWarningDiagnostic);
735+
});
736+
737+
test("don't remove swiftc diagnostics when SourceKit never matched", async () => {
738+
workspaceContext.diagnostics.handleDiagnostics(mainUri, DiagnosticsManager.swiftc, [
739+
swiftcErrorDiagnostic,
740+
]);
741+
742+
workspaceContext.diagnostics.handleDiagnostics(mainUri, DiagnosticsManager.sourcekit, [
743+
sourcekitWarningDiagnostic,
744+
]);
745+
746+
// Should not have cleaned up swiftc error
747+
assertHasDiagnostic(mainUri, swiftcErrorDiagnostic);
748+
assertHasDiagnostic(mainUri, sourcekitWarningDiagnostic);
761749
});
762750
});
763751
});

0 commit comments

Comments
 (0)