Browse Source

Reduce the probability of errors when the model tries to fix the problem due to mismatched line numbers after applying diff

axb 1 year ago
parent
commit
fbf65bfc6c

+ 2 - 2
src/core/mentions/index.ts

@@ -186,9 +186,9 @@ async function getFileOrFolderContent(mentionPath: string, cwd: string): Promise
 	}
 	}
 }
 }
 
 
-function getWorkspaceProblems(cwd: string): string {
+async function getWorkspaceProblems(cwd: string): Promise<string> {
 	const diagnostics = vscode.languages.getDiagnostics()
 	const diagnostics = vscode.languages.getDiagnostics()
-	const result = diagnosticsToProblemsString(
+	const result = await diagnosticsToProblemsString(
 		diagnostics,
 		diagnostics,
 		[vscode.DiagnosticSeverity.Error, vscode.DiagnosticSeverity.Warning],
 		[vscode.DiagnosticSeverity.Error, vscode.DiagnosticSeverity.Warning],
 		cwd,
 		cwd,

+ 7 - 3
src/integrations/diagnostics/index.ts

@@ -70,11 +70,12 @@ export function getNewDiagnostics(
 // // - New error in file3 (1:1)
 // // - New error in file3 (1:1)
 
 
 // will return empty string if no problems with the given severity are found
 // will return empty string if no problems with the given severity are found
-export function diagnosticsToProblemsString(
+export async function diagnosticsToProblemsString(
 	diagnostics: [vscode.Uri, vscode.Diagnostic[]][],
 	diagnostics: [vscode.Uri, vscode.Diagnostic[]][],
 	severities: vscode.DiagnosticSeverity[],
 	severities: vscode.DiagnosticSeverity[],
 	cwd: string,
 	cwd: string,
-): string {
+): Promise<string> {
+	const documents = new Map<vscode.Uri, vscode.TextDocument>()
 	let result = ""
 	let result = ""
 	for (const [uri, fileDiagnostics] of diagnostics) {
 	for (const [uri, fileDiagnostics] of diagnostics) {
 		const problems = fileDiagnostics.filter((d) => severities.includes(d.severity))
 		const problems = fileDiagnostics.filter((d) => severities.includes(d.severity))
@@ -100,7 +101,10 @@ export function diagnosticsToProblemsString(
 				}
 				}
 				const line = diagnostic.range.start.line + 1 // VSCode lines are 0-indexed
 				const line = diagnostic.range.start.line + 1 // VSCode lines are 0-indexed
 				const source = diagnostic.source ? `${diagnostic.source} ` : ""
 				const source = diagnostic.source ? `${diagnostic.source} ` : ""
-				result += `\n- [${source}${label}] Line ${line}: ${diagnostic.message}`
+				const document = documents.get(uri) || (await vscode.workspace.openTextDocument(uri))
+				documents.set(uri, document)
+				const lineContent = document.lineAt(diagnostic.range.start.line).text
+				result += `\n- [${source}${label}] ${line} | ${lineContent} : ${diagnostic.message}`
 			}
 			}
 		}
 		}
 	}
 	}

+ 1 - 1
src/integrations/editor/DiffViewProvider.ts

@@ -172,7 +172,7 @@ export class DiffViewProvider {
 		initial fix is usually correct and it may just take time for linters to catch up.
 		initial fix is usually correct and it may just take time for linters to catch up.
 		*/
 		*/
 		const postDiagnostics = vscode.languages.getDiagnostics()
 		const postDiagnostics = vscode.languages.getDiagnostics()
-		const newProblems = diagnosticsToProblemsString(
+		const newProblems = await diagnosticsToProblemsString(
 			getNewDiagnostics(this.preDiagnostics, postDiagnostics),
 			getNewDiagnostics(this.preDiagnostics, postDiagnostics),
 			[
 			[
 				vscode.DiagnosticSeverity.Error, // only including errors since warnings can be distracting (if user wants to fix warnings they can use the @problems mention)
 				vscode.DiagnosticSeverity.Error, // only including errors since warnings can be distracting (if user wants to fix warnings they can use the @problems mention)