|
1 | 1 | import * as vscode from 'vscode' |
2 | 2 | import * as fs from 'fs' |
3 | | -import { groupBy, startCase } from 'lodash' |
| 3 | +import { groupBy, startCase, uniqBy } from 'lodash' |
4 | 4 | import { CodacyCloud } from '../git/CodacyCloud' |
5 | 5 | import { PullRequestIssue } from '../git/PullRequest' |
6 | 6 | import { GitProvider } from '../git/GitProvider' |
@@ -154,13 +154,13 @@ export class ProblemsDiagnosticCollection implements vscode.Disposable { |
154 | 154 |
|
155 | 155 | private updateDiagnostics() { |
156 | 156 | this._collection.clear() |
157 | | - const filesWithApiIssues = Object.keys(this._currentApiIssues) |
158 | | - const filesWithCliIssues = Object.keys(this._currentCliIssues) |
159 | | - const allFiles = [...new Set([...filesWithApiIssues, ...filesWithCliIssues])] |
160 | | - allFiles.forEach((file) => { |
| 157 | + const filesWithApiIssues = Object.keys(this._currentApiIssues).map((key) => ({ file: key, isCliIssue: false })) |
| 158 | + const filesWithCliIssues = Object.keys(this._currentCliIssues).map((key) => ({ file: key, isCliIssue: true })) |
| 159 | + const allFiles = uniqBy([...filesWithApiIssues, ...filesWithCliIssues], 'file') |
| 160 | + allFiles.forEach(({ file, isCliIssue }) => { |
161 | 161 | const document = vscode.workspace.textDocuments.find((doc) => doc.uri.fsPath === file) |
162 | 162 | if (document) { |
163 | | - this.updateDocumentDiagnostics(document) |
| 163 | + isCliIssue ? this.updateDocumentDiagnostics(document) : this.updateApiIssuesPositions(document) |
164 | 164 | } |
165 | 165 | }) |
166 | 166 | } |
@@ -322,17 +322,30 @@ export class ProblemsDiagnosticCollection implements vscode.Disposable { |
322 | 322 | const documentIssues = this._currentApiIssues[document.uri.fsPath] || [] |
323 | 323 |
|
324 | 324 | const documentLines = document.getText().split('\n') |
| 325 | + const validIssues: (PullRequestIssue | BranchIssue)[] = [] |
325 | 326 |
|
326 | | - documentIssues.forEach(({ commitIssue }) => { |
327 | | - if (documentLines[commitIssue.lineNumber - 1].trim() !== commitIssue.lineText.trim()) { |
328 | | - const foundInLine = documentLines.findIndex((line) => line.trim() === commitIssue.lineText.trim()) |
| 327 | + documentIssues.forEach((issue) => { |
| 328 | + const { commitIssue } = issue |
329 | 329 |
|
| 330 | + if (documentLines[commitIssue.lineNumber - 1]?.trim() !== commitIssue.lineText.trim()) { |
| 331 | + const foundInLine = documentLines.findIndex((line) => line.trim() === commitIssue.lineText.trim()) |
330 | 332 | if (foundInLine >= 0) { |
331 | 333 | commitIssue.lineNumber = foundInLine + 1 |
| 334 | + validIssues.push(issue) |
| 335 | + } else { |
| 336 | + Logger.appendLine( |
| 337 | + `Removing diagnostic for issue no longer found in document: "${commitIssue.lineText.trim()}" in ${document.uri.fsPath}` |
| 338 | + ) |
| 339 | + // Issue is no longer found in the document, so we don't add it to validIssues |
332 | 340 | } |
| 341 | + } else { |
| 342 | + validIssues.push(issue) |
333 | 343 | } |
334 | 344 | }) |
335 | 345 |
|
| 346 | + // Update the current API issues to only include valid issues |
| 347 | + this._currentApiIssues[document.uri.fsPath] = validIssues |
| 348 | + |
336 | 349 | this.updateDocumentDiagnostics(document) |
337 | 350 | } |
338 | 351 |
|
|
0 commit comments