diff --git a/src/BackgroundCompilation.ts b/src/BackgroundCompilation.ts index edac4dd24..cc82a2e8c 100644 --- a/src/BackgroundCompilation.ts +++ b/src/BackgroundCompilation.ts @@ -19,11 +19,11 @@ import { FolderContext } from "./FolderContext"; import { TaskOperation } from "./tasks/TaskQueue"; // eslint-disable-next-line @typescript-eslint/no-require-imports import debounce = require("lodash.debounce"); +import { validFileTypes } from "./utilities/filesystem"; export class BackgroundCompilation implements vscode.Disposable { private workspaceFileWatcher?: vscode.FileSystemWatcher; private configurationEventDisposable?: vscode.Disposable; - private validFileTypes = ["swift", "c", "cpp", "h", "hpp", "m", "mm"]; private disposables: vscode.Disposable[] = []; constructor(private folderContext: FolderContext) { @@ -44,7 +44,7 @@ export class BackgroundCompilation implements vscode.Disposable { } private setupFileWatching() { - const fileTypes = this.validFileTypes.join(","); + const fileTypes = validFileTypes.join(","); const rootFolders = ["Sources", "Tests", "Snippets", "Plugins"].join(","); this.disposables.push( (this.workspaceFileWatcher = vscode.workspace.createFileSystemWatcher( diff --git a/src/DiagnosticsManager.ts b/src/DiagnosticsManager.ts index b1ccdc343..c7e0914a2 100644 --- a/src/DiagnosticsManager.ts +++ b/src/DiagnosticsManager.ts @@ -21,6 +21,7 @@ import configuration from "./configuration"; import { SwiftExecution } from "./tasks/SwiftExecution"; import { WorkspaceContext } from "./WorkspaceContext"; import { checkIfBuildComplete, lineBreakRegex } from "./utilities/tasks"; +import { validFileTypes } from "./utilities/filesystem"; interface ParsedDiagnostic { uri: string; @@ -102,6 +103,17 @@ export class DiagnosticsManager implements vscode.Disposable { context.outputChannel.log(`${e}`, 'Failed to provide "swiftc" diagnostics') ); }); + const fileTypes = validFileTypes.join(","); + this.workspaceFileWatcher = vscode.workspace.createFileSystemWatcher( + `**/*.{${fileTypes}}`, + true, + true + ); + this.onDidDeleteDisposible = this.workspaceFileWatcher.onDidDelete(uri => { + if (this.allDiagnostics.delete(uri.fsPath)) { + this.diagnosticCollection.delete(uri); + } + }); } /** @@ -276,6 +288,8 @@ export class DiagnosticsManager implements vscode.Disposable { this.diagnosticCollection.dispose(); this.onDidStartTaskDisposible.dispose(); this.onDidChangeConfigurationDisposible.dispose(); + this.onDidDeleteDisposible.dispose(); + this.workspaceFileWatcher.dispose(); } private includeSwiftcDiagnostics(): boolean { @@ -454,4 +468,6 @@ export class DiagnosticsManager implements vscode.Disposable { private onDidStartTaskDisposible: vscode.Disposable; private onDidChangeConfigurationDisposible: vscode.Disposable; + private onDidDeleteDisposible: vscode.Disposable; + private workspaceFileWatcher: vscode.FileSystemWatcher; } diff --git a/src/utilities/filesystem.ts b/src/utilities/filesystem.ts index b68fcaef6..37c772f7c 100644 --- a/src/utilities/filesystem.ts +++ b/src/utilities/filesystem.ts @@ -15,6 +15,8 @@ import * as fs from "fs/promises"; import * as path from "path"; +export const validFileTypes = ["swift", "c", "cpp", "h", "hpp", "m", "mm"]; + /** * Checks if a file, directory or symlink exists at the supplied path. * @param pathComponents The path to check for existence