diff --git a/package.json b/package.json index 46250135..6b53e5f6 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "color": "#ECECEC", "theme": "light" }, - "version": "1.5.0", + "version": "1.5.1", "publisher": "salesforce", "license": "BSD-3-Clause", "engines": { diff --git a/src/extension.ts b/src/extension.ts index 87fa3e50..8525d935 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -67,8 +67,8 @@ export async function activate(context: vscode.ExtensionContext): Promise unknown): void => { context.subscriptions.push(vscode.workspace.onDidSaveTextDocument(listener)); } - const onDidOpenTextDocument = (listener: (e: unknown) => unknown): void => { - context.subscriptions.push(vscode.workspace.onDidOpenTextDocument(listener)); + const onDidChangeActiveTextEditor = (listener: (e: unknown) => unknown): void => { + context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor(listener)); } // Prepare utilities @@ -84,6 +84,9 @@ export async function activate(context: vscode.ExtensionContext): Promise { - if (settingsManager.getAnalyzeOnOpen() && _isValidFileForAnalysis(textDocument.uri)) { - await codeAnalyzerRunner.runAndDisplay(Constants.COMMAND_RUN_ON_ACTIVE_FILE, [textDocument.fileName]); + + onDidChangeActiveTextEditor(async (editor: vscode.TextEditor) => { + const shouldScan: boolean = editor !== undefined && editor.document.uri.scheme === 'file' && settingsManager.getAnalyzeOnOpen() && + _isValidFileForAnalysis(editor.document.uri) && !scanMonitor.haveAlreadyScannedFile(editor.document.fileName); + if (shouldScan) { + scanMonitor.addFileToAlreadyScannedFiles(editor.document.fileName); + await codeAnalyzerRunner.runAndDisplay(Constants.COMMAND_RUN_ON_ACTIVE_FILE, [editor.document.fileName]); } }); - // ... also invoked by saving a file if the user has set things to do so. - onDidSaveTextDocument(async (textDocument: vscode.TextDocument) => { - if (settingsManager.getAnalyzeOnSave() && _isValidFileForAnalysis(textDocument.uri)) { - await codeAnalyzerRunner.runAndDisplay(Constants.COMMAND_RUN_ON_ACTIVE_FILE, [textDocument.fileName]); + + onDidSaveTextDocument(async (document: vscode.TextDocument) => { + if (document !== undefined && document.uri.scheme === 'file') { + scanMonitor.removeFileFromAlreadyScannedFiles(document.fileName); + + const shouldScan: boolean = settingsManager.getAnalyzeOnSave() && _isValidFileForAnalysis(document.uri); + if (shouldScan) { + scanMonitor.addFileToAlreadyScannedFiles(document.fileName); + await codeAnalyzerRunner.runAndDisplay(Constants.COMMAND_RUN_ON_ACTIVE_FILE, [document.fileName]); + } } }); @@ -295,8 +307,10 @@ export async function activate(context: vscode.ExtensionContext): Promise { await vscode.commands.executeCommand('setContext', varUsedInPackageJson, await getValueFcn()); }); +} + +class ScanMonitor implements vscode.Disposable { + private alreadyScannedFiles: Set = new Set(); + + haveAlreadyScannedFile(file: string): boolean { + return this.alreadyScannedFiles.has(file); + } + + removeFileFromAlreadyScannedFiles(file: string): void { + this.alreadyScannedFiles.delete(file); + } + + addFileToAlreadyScannedFiles(file: string) { + this.alreadyScannedFiles.add(file); + } + + public dispose(): void { + this.alreadyScannedFiles.clear(); + } } \ No newline at end of file diff --git a/src/test/legacy/scanner.test.ts b/src/test/legacy/scanner.test.ts index fb71f0d4..3ea9fed6 100644 --- a/src/test/legacy/scanner.test.ts +++ b/src/test/legacy/scanner.test.ts @@ -344,7 +344,7 @@ suite('ScanRunner', () => { test('Adds process Id to the cache', () => { // ===== SETUP ===== - const args:string[] = []; + const args:string[] = ['scanner', 'run', 'dfa', '--target', 'doesNotMatter', '--json']; const scanner = new ScanRunner(); void context.workspaceState.update(Constants.WORKSPACE_DFA_PROCESS, undefined);