Skip to content

Commit 4bd85f6

Browse files
🐛 fix(core): 修复文件选择和国际化问题
- 【功能修复】修复代码评审时文件选择逻辑问题 - 【国际化】添加无效文件选择的提示文案 - 【代码优化】优化 CodeReviewReportGenerator 中的本地化管理器调用 - 【调试】在错误处理中添加日志输出 - 【重构】将文件选择逻辑抽取为独立方法以提高代码复用性
1 parent 8226347 commit 4bd85f6

File tree

5 files changed

+67
-25
lines changed

5 files changed

+67
-25
lines changed

i18n/en.json

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
"review.results.title": "Code Review Results",
101101
"codeReview.generation.failed": "Code review generation failed: {0}",
102102
"no.changes.selected": "No files selected for review",
103+
"please.select.valid.files": "Some selected files are invalid, please reselect files for review",
103104
"no.changes.found": "No changes found for review",
104105
"review.file.failed": "Failed to review file: {0}",
105106
"code.review.failed": "Code review failed: {0}",

i18n/zh-cn.json

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
"codeReview.generation.failed": "代码评审生成失败: {0}",
101101
"model.list.empty": "模型列表为空",
102102
"no.changes.selected": "未选择任何待评审的文件",
103+
"please.select.valid.files": "选择的文件中包含无效项,请重新选择要评审的文件",
103104
"no.changes.found": "未找到需要评审的变更",
104105
"review.file.failed": "评审文件失败: {0}",
105106
"code.review.failed": "代码评审失败: {0}",

src/ai/providers/VscodeProvider.ts

+2
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ IMPORTANT: You must respond with a valid JSON object following this schema:
196196
CodeReviewReportGenerator.generateMarkdownReport(reviewResult),
197197
};
198198
} catch (ex: Error | any) {
199+
console.log("ex", ex);
200+
199201
let message = ex instanceof Error ? ex.message : String(ex);
200202

201203
if (

src/commands/ReviewCodeCommand.ts

+39-13
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,42 @@ import * as path from "path";
1212
* @extends {BaseCommand}
1313
*/
1414
export class ReviewCodeCommand extends BaseCommand {
15+
/**
16+
* 获取选中的文件列表
17+
* @param resourceStates - 源代码管理资源状态
18+
* @returns 文件路径列表
19+
*/
20+
protected getSelectedFiles(
21+
resourceStates?:
22+
| vscode.SourceControlResourceState
23+
| vscode.SourceControlResourceState[]
24+
): string[] | undefined {
25+
if (!resourceStates) {
26+
return undefined;
27+
}
28+
29+
const states = Array.isArray(resourceStates)
30+
? resourceStates
31+
: [resourceStates];
32+
33+
return [
34+
...new Set(
35+
states
36+
.map(
37+
(state) =>
38+
(state as any)?._resourceUri?.fsPath || state?.resourceUri?.fsPath
39+
)
40+
.filter(Boolean)
41+
),
42+
];
43+
}
44+
1545
/**
1646
* 执行代码审查命令
17-
* @param {vscode.SourceControlResourceState[]} resources - 源代码管理资源状态列表,代表需要审查的文件
47+
* @param {vscode.SourceControlResourceState[] | undefined} resources - 源代码管理资源状态列表,代表需要审查的文件
1848
* @returns {Promise<void>}
1949
*/
20-
async execute(resources: vscode.SourceControlResourceState[]) {
50+
async execute(resources?: vscode.SourceControlResourceState[]) {
2151
// 处理配置
2252
const configResult = await this.handleConfiguration();
2353
if (!configResult) {
@@ -26,7 +56,8 @@ export class ReviewCodeCommand extends BaseCommand {
2656

2757
try {
2858
// 检查是否有选中的文件
29-
if (!resources || resources.length === 0) {
59+
const selectedFiles = this.getSelectedFiles(resources);
60+
if (!selectedFiles || selectedFiles.length === 0) {
3061
NotificationHandler.warn(
3162
this.locManager.getMessage("no.changes.selected")
3263
);
@@ -56,25 +87,20 @@ export class ReviewCodeCommand extends BaseCommand {
5687
// 获取所有选中文件的差异
5788
const fileReviews = new Map<string, string>();
5889
const diffs = new Map<string, string>();
59-
6090
// 并行收集所有差异 - 10% 进度
61-
const diffPromises = resources.map(async (resource) => {
62-
const selectedFiles = this.getSelectedFiles(resource);
91+
const diffPromises = selectedFiles.map(async (filePath) => {
6392
try {
64-
const diff = await scmProvider.getDiff(selectedFiles);
93+
const diff = await scmProvider.getDiff([filePath]);
6594
if (diff) {
66-
diffs.set(resource.resourceUri.fsPath, diff);
95+
diffs.set(filePath, diff);
6796
}
6897
progress.report({
69-
increment: 10 / resources.length,
98+
increment: 10 / selectedFiles.length,
7099
message: this.locManager.getMessage("getting.file.changes"),
71100
});
72101
return { success: true };
73102
} catch (error) {
74-
console.error(
75-
`Failed to get diff for ${resource.resourceUri.fsPath}:`,
76-
error
77-
);
103+
console.error(`Failed to get diff for ${filePath}:`, error);
78104
return { success: false };
79105
}
80106
});

src/utils/CodeReviewReportGenerator.ts

+24-12
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
import { CodeReviewResult, CodeReviewIssue } from "../ai/types";
2-
import * as vscode from "vscode";
2+
import * as vscode from "vscode";
33
import { LocalizationManager } from "../utils/LocalizationManager";
44

55
/**
66
* 代码审查报告生成器,将代码审查结果转换为格式化的 Markdown 文档
77
*/
88
export class CodeReviewReportGenerator {
99
private static readonly locManager = LocalizationManager.getInstance();
10-
10+
1111
/**
1212
* 不同严重程度对应的 emoji 图标
1313
* @private
1414
*/
1515
private static readonly severityEmoji = {
16-
NOTE: "💡", // 提示
17-
WARNING: "⚠️", // 警告
18-
ERROR: "🚨", // 错误
16+
NOTE: "💡", // 提示
17+
WARNING: "⚠️", // 警告
18+
ERROR: "🚨", // 错误
1919
};
2020

2121
/**
@@ -59,8 +59,12 @@ export class CodeReviewReportGenerator {
5959
* @returns {string} Markdown 格式的报告头部
6060
*/
6161
private static generateHeader(summary: string): string {
62-
const title = this.locManager.getMessage("codeReview.report.title");
63-
const summaryLabel = this.locManager.getMessage("codeReview.report.summary");
62+
const title = LocalizationManager.getInstance().getMessage(
63+
"codeReview.report.title"
64+
);
65+
const summaryLabel = LocalizationManager.getInstance().getMessage(
66+
"codeReview.report.summary"
67+
);
6468
return `# ${title}\n\n## ${summaryLabel}\n\n${summary}\n\n`;
6569
}
6670

@@ -73,7 +77,9 @@ export class CodeReviewReportGenerator {
7377
private static generateDetailedFindings(
7478
sections: Record<string, CodeReviewIssue[]>
7579
): string {
76-
const findings = this.locManager.getMessage("codeReview.report.findings");
80+
const findings = LocalizationManager.getInstance().getMessage(
81+
"codeReview.report.findings"
82+
);
7783
let markdown = `## ${findings}\n\n`;
7884

7985
// 遍历每个文件的问题
@@ -99,10 +105,14 @@ export class CodeReviewReportGenerator {
99105
let section = `#### ${this.severityEmoji[issue.severity]} ${
100106
issue.severity
101107
}: Line ${issue.startLine}${issue.endLine ? `-${issue.endLine}` : ""}\n\n`;
102-
108+
103109
// 添加问题描述和建议
104-
section += `**${this.locManager.getMessage("codeReview.issue.label")}** ${issue.description}\n\n`;
105-
section += `**${this.locManager.getMessage("codeReview.suggestion.label")}** ${issue.suggestion}\n\n`;
110+
section += `**${LocalizationManager.getInstance().getMessage(
111+
"codeReview.issue.label"
112+
)}** ${issue.description}\n\n`;
113+
section += `**${LocalizationManager.getInstance().getMessage(
114+
"codeReview.suggestion.label"
115+
)}** ${issue.suggestion}\n\n`;
106116

107117
// 如果有代码示例,添加代码块
108118
if (issue.code) {
@@ -111,7 +121,9 @@ export class CodeReviewReportGenerator {
111121

112122
// 如果有相关文档,添加链接
113123
if (issue.documentation) {
114-
const docLabel = this.locManager.getMessage("codeReview.documentation.label");
124+
const docLabel = LocalizationManager.getInstance().getMessage(
125+
"codeReview.documentation.label"
126+
);
115127
section += `📚 [${docLabel}](${issue.documentation})\n\n`;
116128
}
117129

0 commit comments

Comments
 (0)