@wuyanbin/ai-code-review-cli-remote 1.0.36 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/context.d.ts +14 -3
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +47 -83
- package/dist/core/context.js.map +1 -1
- package/dist/core/diff.d.ts +1 -1
- package/dist/core/diff.js +3 -3
- package/dist/core/diff.js.map +1 -1
- package/dist/core/import-resolve.d.ts +62 -0
- package/dist/core/import-resolve.d.ts.map +1 -0
- package/dist/core/import-resolve.js +470 -0
- package/dist/core/import-resolve.js.map +1 -0
- package/dist/core/prompt.d.ts.map +1 -1
- package/dist/core/prompt.js +3 -1
- package/dist/core/prompt.js.map +1 -1
- package/dist/core/reviewer.d.ts.map +1 -1
- package/dist/core/reviewer.js +54 -3
- package/dist/core/reviewer.js.map +1 -1
- package/dist/core/swift-index.d.ts +45 -0
- package/dist/core/swift-index.d.ts.map +1 -0
- package/dist/core/swift-index.js +151 -0
- package/dist/core/swift-index.js.map +1 -0
- package/dist/core/symbol-context.d.ts +56 -0
- package/dist/core/symbol-context.d.ts.map +1 -0
- package/dist/core/symbol-context.js +511 -0
- package/dist/core/symbol-context.js.map +1 -0
- package/dist/core/symbols.d.ts +65 -0
- package/dist/core/symbols.d.ts.map +1 -0
- package/dist/core/symbols.js +1018 -0
- package/dist/core/symbols.js.map +1 -0
- package/dist/core/text-budget.d.ts +3 -0
- package/dist/core/text-budget.d.ts.map +1 -0
- package/dist/core/text-budget.js +14 -0
- package/dist/core/text-budget.js.map +1 -0
- package/dist/core/tree-sitter.d.ts +42 -0
- package/dist/core/tree-sitter.d.ts.map +1 -0
- package/dist/core/tree-sitter.js +160 -0
- package/dist/core/tree-sitter.js.map +1 -0
- package/dist/tree-sitter/tree-sitter-go.wasm +0 -0
- package/dist/tree-sitter/tree-sitter-java.wasm +0 -0
- package/dist/tree-sitter/tree-sitter-javascript.wasm +0 -0
- package/dist/tree-sitter/tree-sitter-kotlin.wasm +0 -0
- package/dist/tree-sitter/tree-sitter-swift.wasm +0 -0
- package/dist/tree-sitter/tree-sitter-tsx.wasm +0 -0
- package/dist/tree-sitter/tree-sitter-typescript.wasm +0 -0
- package/dist/tree-sitter/tree-sitter.js +4075 -0
- package/dist/tree-sitter/tree-sitter.wasm +0 -0
- package/package.json +5 -3
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EXTRACTION_TIMEOUT_MS = exports.MAX_DECLARATION_LINES = exports.SOURCE_WINDOW_RADIUS = void 0;
|
|
4
|
+
exports.mergeRanges = mergeRanges;
|
|
5
|
+
exports.renderFileSection = renderFileSection;
|
|
6
|
+
exports.buildLineWindow = buildLineWindow;
|
|
7
|
+
exports.buildShardSourceContext = buildShardSourceContext;
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
10
|
+
const diff_1 = require("./diff");
|
|
11
|
+
const import_resolve_1 = require("./import-resolve");
|
|
12
|
+
const symbols_1 = require("./symbols");
|
|
13
|
+
const text_budget_1 = require("./text-budget");
|
|
14
|
+
const tree_sitter_1 = require("./tree-sitter");
|
|
15
|
+
/**
|
|
16
|
+
* 每片的「符号级上下文」:
|
|
17
|
+
* ① 变更附近源码——新增行所在的函数/类完整体取代 ±8 行窗口(超长退回签名 + 窗口);
|
|
18
|
+
* ② 引用定义——新增行引用的、经 import 可解析到仓库内文件的符号,只带签名。
|
|
19
|
+
* 不支持的语言、解析失败、超时,一律按文件粒度退回 ±8 行窗口;任何情况下不抛出。
|
|
20
|
+
*/
|
|
21
|
+
exports.SOURCE_WINDOW_RADIUS = 8;
|
|
22
|
+
/** 与旧实现一致:每片最多 8 个文件进入源码上下文 */
|
|
23
|
+
const MAX_CONTEXT_FILES = 8;
|
|
24
|
+
/** 与旧实现一致:每文件最多为 12 个新增行开窗口 */
|
|
25
|
+
const MAX_WINDOW_LINES_PER_FILE = 12;
|
|
26
|
+
/** 每文件最多带 6 个声明的完整体,其余新增行退回窗口 */
|
|
27
|
+
const MAX_DECLARATIONS_PER_FILE = 6;
|
|
28
|
+
/** 声明超过此行数只带签名,正文按窗口取 */
|
|
29
|
+
exports.MAX_DECLARATION_LINES = 150;
|
|
30
|
+
/** 每个变更文件最多抽 10 条引用定义 */
|
|
31
|
+
const MAX_REFS_PER_FILE = 10;
|
|
32
|
+
/** 被引用文件超过 5MB 不读(生成代码可能极大,读进来也解析不完) */
|
|
33
|
+
const MAX_TARGET_FILE_BYTES = 5000000;
|
|
34
|
+
/** 每片抽取总耗时上限;超时后剩余文件退回窗口、不再抽引用 */
|
|
35
|
+
exports.EXTRACTION_TIMEOUT_MS = 15000;
|
|
36
|
+
const DEFAULT_BUDGET_BYTES = 80000;
|
|
37
|
+
function emptyStats() {
|
|
38
|
+
return {
|
|
39
|
+
files: 0,
|
|
40
|
+
bodies: 0,
|
|
41
|
+
headers: 0,
|
|
42
|
+
windows: 0,
|
|
43
|
+
refs: 0,
|
|
44
|
+
unresolved: 0,
|
|
45
|
+
parseFailures: 0,
|
|
46
|
+
errors: 0,
|
|
47
|
+
bytes: 0,
|
|
48
|
+
truncated: false,
|
|
49
|
+
timedOut: false,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function errorMessage(error) {
|
|
53
|
+
return error instanceof Error ? `${error.name}: ${error.message}` : String(error);
|
|
54
|
+
}
|
|
55
|
+
function windowRange(line, radius, maxLine) {
|
|
56
|
+
return [Math.max(1, line - radius), Math.min(maxLine, line + radius)];
|
|
57
|
+
}
|
|
58
|
+
/** 排序后合并重叠或间距不超过 gap 的区间 */
|
|
59
|
+
function mergeRanges(ranges, gap = 3) {
|
|
60
|
+
const sorted = [...ranges]
|
|
61
|
+
.filter(([s, e]) => e >= s)
|
|
62
|
+
.sort((a, b) => a[0] - b[0] || a[1] - b[1]);
|
|
63
|
+
const merged = [];
|
|
64
|
+
for (const range of sorted) {
|
|
65
|
+
const last = merged[merged.length - 1];
|
|
66
|
+
if (last && range[0] <= last[1] + gap)
|
|
67
|
+
last[1] = Math.max(last[1], range[1]);
|
|
68
|
+
else
|
|
69
|
+
merged.push([range[0], range[1]]);
|
|
70
|
+
}
|
|
71
|
+
return merged;
|
|
72
|
+
}
|
|
73
|
+
/** 与旧 buildLineWindow 完全一致的渲染:`### 文件` + 若干 `lines a-b` 块,行前标 [ADD]/[CTX] */
|
|
74
|
+
function renderFileSection(file, lines, addedLines, ranges) {
|
|
75
|
+
if (ranges.length === 0)
|
|
76
|
+
return null;
|
|
77
|
+
const chunks = ranges.map(([start, end]) => {
|
|
78
|
+
const numbered = lines
|
|
79
|
+
.slice(start - 1, end)
|
|
80
|
+
.map((line, index) => {
|
|
81
|
+
const lineNumber = start + index;
|
|
82
|
+
const kind = addedLines.has(lineNumber) ? "[ADD]" : "[CTX]";
|
|
83
|
+
return `${kind} ${String(lineNumber).padStart(4, " ")} | ${line}`;
|
|
84
|
+
})
|
|
85
|
+
.join("\n");
|
|
86
|
+
return `lines ${start}-${end}\n${numbered}`;
|
|
87
|
+
});
|
|
88
|
+
return `### ${file}\n${chunks.join("\n---\n")}`;
|
|
89
|
+
}
|
|
90
|
+
/** 旧式 ±radius 窗口(不支持的语言 / 解析失败 / 超时时使用) */
|
|
91
|
+
function buildLineWindow(file, content, changedLines, radius) {
|
|
92
|
+
const lines = content.split("\n");
|
|
93
|
+
const ranges = changedLines
|
|
94
|
+
.slice(0, MAX_WINDOW_LINES_PER_FILE)
|
|
95
|
+
.map((line) => windowRange(line, radius, lines.length));
|
|
96
|
+
return renderFileSection(file, lines, new Set(changedLines), mergeRanges(ranges));
|
|
97
|
+
}
|
|
98
|
+
function toRepoPath(cwd, abs) {
|
|
99
|
+
return (0, node_path_1.relative)(cwd, abs).split(node_path_1.sep).join("/");
|
|
100
|
+
}
|
|
101
|
+
/** Swift 没有可映射到文件的 import;查找一律走仓库内类型声明索引,绑定只是占位 */
|
|
102
|
+
const SWIFT_INDEX_BINDING = { local: "*", imported: null, source: "", kind: "wildcard" };
|
|
103
|
+
/** 引用 → 可能的查找目标;一个引用可能同时匹配多种导入形态,按优先级排列 */
|
|
104
|
+
function lookupsFor(ref, imports, language, pkg) {
|
|
105
|
+
const out = [];
|
|
106
|
+
if (language === "go") {
|
|
107
|
+
if (!ref.qualifier)
|
|
108
|
+
return out;
|
|
109
|
+
for (const b of imports) {
|
|
110
|
+
if (b.kind === "package" && b.local === ref.qualifier) {
|
|
111
|
+
out.push({ binding: b, name: ref.name, member: null });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
if (language === "java") {
|
|
117
|
+
const isTypeName = (s) => /^[A-Z]/.test(s);
|
|
118
|
+
const samePackage = { local: "*", imported: null, source: pkg ?? "", kind: "wildcard" };
|
|
119
|
+
if (ref.qualifier) {
|
|
120
|
+
for (const b of imports) {
|
|
121
|
+
if (b.kind === "class" && b.local === ref.qualifier) {
|
|
122
|
+
out.push({ binding: b, name: ref.qualifier, member: ref.name });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (out.length === 0 && isTypeName(ref.qualifier)) {
|
|
126
|
+
for (const b of imports) {
|
|
127
|
+
if (b.kind === "wildcard") {
|
|
128
|
+
out.push({ binding: b, name: ref.qualifier, member: ref.name, className: ref.qualifier });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
out.push({ binding: samePackage, name: ref.qualifier, member: ref.name, className: ref.qualifier });
|
|
132
|
+
}
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
if (!isTypeName(ref.name))
|
|
136
|
+
return out;
|
|
137
|
+
for (const b of imports) {
|
|
138
|
+
if (b.kind === "class" && b.local === ref.name)
|
|
139
|
+
out.push({ binding: b, name: ref.name, member: null });
|
|
140
|
+
}
|
|
141
|
+
if (out.length === 0) {
|
|
142
|
+
for (const b of imports) {
|
|
143
|
+
if (b.kind === "wildcard")
|
|
144
|
+
out.push({ binding: b, name: ref.name, member: null, className: ref.name });
|
|
145
|
+
}
|
|
146
|
+
out.push({ binding: samePackage, name: ref.name, member: null, className: ref.name });
|
|
147
|
+
}
|
|
148
|
+
return out;
|
|
149
|
+
}
|
|
150
|
+
if (language === "kotlin") {
|
|
151
|
+
const isTypeName = (s) => /^[A-Z]/.test(s);
|
|
152
|
+
const samePackage = { local: "*", imported: null, source: pkg ?? "", kind: "wildcard" };
|
|
153
|
+
const explicit = (local) => imports.filter((b) => b.kind === "class" && b.local === local);
|
|
154
|
+
if (ref.qualifier) {
|
|
155
|
+
for (const b of explicit(ref.qualifier)) {
|
|
156
|
+
// 别名导入(`import a.b.Util as U`)按真实名字在目标文件里查
|
|
157
|
+
const real = b.imported ?? ref.qualifier;
|
|
158
|
+
out.push({ binding: b, name: real, member: ref.name, className: real });
|
|
159
|
+
}
|
|
160
|
+
if (out.length === 0 && isTypeName(ref.qualifier)) {
|
|
161
|
+
for (const b of imports) {
|
|
162
|
+
if (b.kind === "wildcard") {
|
|
163
|
+
out.push({ binding: b, name: ref.qualifier, member: ref.name, className: ref.qualifier });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
out.push({ binding: samePackage, name: ref.qualifier, member: ref.name, className: ref.qualifier });
|
|
167
|
+
}
|
|
168
|
+
return out;
|
|
169
|
+
}
|
|
170
|
+
// 显式导入可以是顶层函数 / 属性(小写名),不设大小写门槛;通配与同包只查类型名
|
|
171
|
+
for (const b of explicit(ref.name)) {
|
|
172
|
+
const real = b.imported ?? ref.name;
|
|
173
|
+
out.push({ binding: b, name: real, member: null, className: real });
|
|
174
|
+
}
|
|
175
|
+
if (out.length === 0 && isTypeName(ref.name)) {
|
|
176
|
+
for (const b of imports) {
|
|
177
|
+
if (b.kind === "wildcard")
|
|
178
|
+
out.push({ binding: b, name: ref.name, member: null, className: ref.name });
|
|
179
|
+
}
|
|
180
|
+
out.push({ binding: samePackage, name: ref.name, member: null, className: ref.name });
|
|
181
|
+
}
|
|
182
|
+
return out;
|
|
183
|
+
}
|
|
184
|
+
if (language === "swift") {
|
|
185
|
+
// 只对类型名(大写开头)发起查找:`Foo.bar` 查 Foo 的成员 bar,`Foo` 查类型本身
|
|
186
|
+
const typeName = ref.qualifier ?? ref.name;
|
|
187
|
+
if (!/^[A-Z]/.test(typeName))
|
|
188
|
+
return out;
|
|
189
|
+
out.push({
|
|
190
|
+
binding: SWIFT_INDEX_BINDING,
|
|
191
|
+
name: typeName,
|
|
192
|
+
member: ref.qualifier ? ref.name : null,
|
|
193
|
+
className: typeName,
|
|
194
|
+
});
|
|
195
|
+
return out;
|
|
196
|
+
}
|
|
197
|
+
// TypeScript / JavaScript
|
|
198
|
+
if (ref.qualifier) {
|
|
199
|
+
for (const b of imports) {
|
|
200
|
+
if (b.local !== ref.qualifier)
|
|
201
|
+
continue;
|
|
202
|
+
if (b.kind === "namespace")
|
|
203
|
+
out.push({ binding: b, name: ref.name, member: null });
|
|
204
|
+
else if (b.kind === "named" || b.kind === "default") {
|
|
205
|
+
out.push({ binding: b, name: b.imported ?? b.local, member: ref.name });
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return out;
|
|
209
|
+
}
|
|
210
|
+
for (const b of imports) {
|
|
211
|
+
if ((b.kind === "named" || b.kind === "default") && b.local === ref.name) {
|
|
212
|
+
out.push({ binding: b, name: b.imported ?? b.local, member: null });
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return out;
|
|
216
|
+
}
|
|
217
|
+
const DUPLICATE = Symbol("duplicate");
|
|
218
|
+
/** 只输出文件路径与异常类型,不输出源码 */
|
|
219
|
+
function logExtractionError(scope, error) {
|
|
220
|
+
console.error(`[context] extraction failed ${scope}: ${errorMessage(error)}`);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* 符号级上下文的总入口。语法分析层的任何未预期异常都不得逸出到评审流程:
|
|
224
|
+
* 这里兜底退回与旧实现等价的纯 ±8 行窗口,评审照常进行。
|
|
225
|
+
*/
|
|
226
|
+
async function buildShardSourceContext(diff, options) {
|
|
227
|
+
try {
|
|
228
|
+
return await buildSymbolContext(diff, options);
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
logExtractionError("shard (falling back to line windows)", error);
|
|
232
|
+
const fallback = buildLegacyContext(diff, options);
|
|
233
|
+
fallback.stats.errors += 1;
|
|
234
|
+
return fallback;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/** 与旧实现等价的纯窗口上下文:不解析、不解析 import,只做 ±8 行窗口与预算 */
|
|
238
|
+
function buildLegacyContext(diff, options) {
|
|
239
|
+
const cwd = (0, node_path_1.resolve)(options.cwd);
|
|
240
|
+
const budget = options.budgetBytes ?? DEFAULT_BUDGET_BYTES;
|
|
241
|
+
const stats = emptyStats();
|
|
242
|
+
const added = (0, diff_1.collectAddedLines)(diff);
|
|
243
|
+
const sections = [];
|
|
244
|
+
for (const file of (0, diff_1.getChangedFiles)(diff).slice(0, MAX_CONTEXT_FILES)) {
|
|
245
|
+
const abs = (0, node_path_1.resolve)(cwd, file);
|
|
246
|
+
const changedLines = (added.get(file) ?? []).map((item) => item.line);
|
|
247
|
+
if (changedLines.length === 0 || !(0, node_fs_1.existsSync)(abs) || !(0, import_resolve_1.isInsideRepo)(cwd, abs))
|
|
248
|
+
continue;
|
|
249
|
+
try {
|
|
250
|
+
const section = buildLineWindow(file, (0, node_fs_1.readFileSync)(abs, "utf8"), changedLines, exports.SOURCE_WINDOW_RADIUS);
|
|
251
|
+
if (section) {
|
|
252
|
+
sections.push(section);
|
|
253
|
+
stats.files += 1;
|
|
254
|
+
stats.windows += Math.min(changedLines.length, MAX_WINDOW_LINES_PER_FILE);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
// 单个文件读不出来就跳过
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return assembleSections(sections, [], budget, stats);
|
|
262
|
+
}
|
|
263
|
+
/** 预算:变更附近源码优先,引用定义用剩余额度;任何一段被截都标 truncated */
|
|
264
|
+
function assembleSections(bodySections, refSections, budget, stats) {
|
|
265
|
+
const sections = [];
|
|
266
|
+
let used = 0;
|
|
267
|
+
const push = (section) => {
|
|
268
|
+
if (used >= budget) {
|
|
269
|
+
stats.truncated = true;
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
const body = (0, text_budget_1.truncateByBytes)(section, budget - used);
|
|
273
|
+
if (body !== section)
|
|
274
|
+
stats.truncated = true;
|
|
275
|
+
used += Buffer.byteLength(body);
|
|
276
|
+
sections.push(body);
|
|
277
|
+
return body === section;
|
|
278
|
+
};
|
|
279
|
+
if (bodySections.length > 0) {
|
|
280
|
+
push("## 变更附近源码");
|
|
281
|
+
for (const section of bodySections)
|
|
282
|
+
if (!push(section))
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
if (refSections.length > 0) {
|
|
286
|
+
if (used < budget) {
|
|
287
|
+
push("## 引用定义(自动抽取自仓库其他文件,可能不完整)");
|
|
288
|
+
for (const section of refSections)
|
|
289
|
+
if (!push(section))
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
stats.truncated = true;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
const text = sections.join("\n\n");
|
|
297
|
+
stats.bytes = Buffer.byteLength(text);
|
|
298
|
+
return { text, stats };
|
|
299
|
+
}
|
|
300
|
+
async function buildSymbolContext(diff, options) {
|
|
301
|
+
const cwd = (0, node_path_1.resolve)(options.cwd);
|
|
302
|
+
const budget = options.budgetBytes ?? DEFAULT_BUDGET_BYTES;
|
|
303
|
+
const deadline = options.deadlineMs ?? Date.now() + exports.EXTRACTION_TIMEOUT_MS;
|
|
304
|
+
const stats = emptyStats();
|
|
305
|
+
const added = (0, diff_1.collectAddedLines)(diff);
|
|
306
|
+
const changedFiles = (0, diff_1.getChangedFiles)(diff).slice(0, MAX_CONTEXT_FILES);
|
|
307
|
+
const resolver = new import_resolve_1.ImportResolver(cwd);
|
|
308
|
+
const bodySections = [];
|
|
309
|
+
const refSections = [];
|
|
310
|
+
const seenRefs = new Set();
|
|
311
|
+
const pastDeadline = () => {
|
|
312
|
+
if (Date.now() <= deadline)
|
|
313
|
+
return false;
|
|
314
|
+
stats.timedOut = true;
|
|
315
|
+
return true;
|
|
316
|
+
};
|
|
317
|
+
for (const file of changedFiles) {
|
|
318
|
+
const abs = (0, node_path_1.resolve)(cwd, file);
|
|
319
|
+
const changedLines = (added.get(file) ?? []).map((item) => item.line);
|
|
320
|
+
// 变更文件本身也可能是指向仓库外的软链接:真实位置不在仓库内就不读
|
|
321
|
+
if (changedLines.length === 0 || !(0, node_fs_1.existsSync)(abs) || !(0, import_resolve_1.isInsideRepo)(cwd, abs))
|
|
322
|
+
continue;
|
|
323
|
+
let content;
|
|
324
|
+
try {
|
|
325
|
+
content = (0, node_fs_1.readFileSync)(abs, "utf8");
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
const lines = content.split("\n");
|
|
331
|
+
const addedSet = new Set(changedLines);
|
|
332
|
+
const language = (0, tree_sitter_1.languageForPath)(file);
|
|
333
|
+
const fallbackToWindow = () => {
|
|
334
|
+
const section = buildLineWindow(file, content, changedLines, exports.SOURCE_WINDOW_RADIUS);
|
|
335
|
+
if (section) {
|
|
336
|
+
bodySections.push(section);
|
|
337
|
+
stats.files += 1;
|
|
338
|
+
stats.windows += Math.min(changedLines.length, MAX_WINDOW_LINES_PER_FILE);
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
if (!language || pastDeadline()) {
|
|
342
|
+
fallbackToWindow();
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
const tree = await (0, tree_sitter_1.parseSource)(language, content);
|
|
346
|
+
if (!tree) {
|
|
347
|
+
stats.parseFailures += 1;
|
|
348
|
+
fallbackToWindow();
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
let sectionPushed = false;
|
|
352
|
+
try {
|
|
353
|
+
// ① 变更附近源码:声明完整体优先,超长声明与声明外的行退回窗口
|
|
354
|
+
const ranges = [];
|
|
355
|
+
const bodiesSeen = new Set();
|
|
356
|
+
const headersSeen = new Set();
|
|
357
|
+
let windowsUsed = 0;
|
|
358
|
+
for (const line of changedLines) {
|
|
359
|
+
if (line < 1 || line > lines.length)
|
|
360
|
+
continue;
|
|
361
|
+
const decl = (0, symbols_1.enclosingDeclaration)(tree.root, language, line, lines[line - 1].length);
|
|
362
|
+
if (decl) {
|
|
363
|
+
const size = decl.endLine - decl.startLine + 1;
|
|
364
|
+
if (size <= exports.MAX_DECLARATION_LINES) {
|
|
365
|
+
if (bodiesSeen.has(decl.startLine))
|
|
366
|
+
continue;
|
|
367
|
+
if (bodiesSeen.size < MAX_DECLARATIONS_PER_FILE) {
|
|
368
|
+
bodiesSeen.add(decl.startLine);
|
|
369
|
+
ranges.push([decl.startLine, decl.endLine]);
|
|
370
|
+
stats.bodies += 1;
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
else if (!headersSeen.has(decl.startLine)) {
|
|
375
|
+
headersSeen.add(decl.startLine);
|
|
376
|
+
ranges.push([decl.startLine, decl.headerEndLine]);
|
|
377
|
+
stats.headers += 1;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
if (windowsUsed >= MAX_WINDOW_LINES_PER_FILE)
|
|
381
|
+
continue;
|
|
382
|
+
windowsUsed += 1;
|
|
383
|
+
stats.windows += 1;
|
|
384
|
+
ranges.push(windowRange(line, exports.SOURCE_WINDOW_RADIUS, lines.length));
|
|
385
|
+
}
|
|
386
|
+
const section = renderFileSection(file, lines, addedSet, mergeRanges(ranges));
|
|
387
|
+
if (section) {
|
|
388
|
+
bodySections.push(section);
|
|
389
|
+
stats.files += 1;
|
|
390
|
+
sectionPushed = true;
|
|
391
|
+
}
|
|
392
|
+
// ② 引用定义
|
|
393
|
+
if (pastDeadline())
|
|
394
|
+
continue;
|
|
395
|
+
const refs = (0, symbols_1.collectReferences)(tree.root, language, addedSet);
|
|
396
|
+
if (refs.length === 0)
|
|
397
|
+
continue;
|
|
398
|
+
const imports = (0, symbols_1.collectImports)(tree.root, language);
|
|
399
|
+
const pkg = (0, symbols_1.packageName)(tree.root, language);
|
|
400
|
+
let resolved = 0;
|
|
401
|
+
for (const ref of refs) {
|
|
402
|
+
if (resolved >= MAX_REFS_PER_FILE || pastDeadline())
|
|
403
|
+
break;
|
|
404
|
+
const lookups = lookupsFor(ref, imports, language, pkg);
|
|
405
|
+
if (lookups.length === 0)
|
|
406
|
+
continue;
|
|
407
|
+
let outcome = null;
|
|
408
|
+
for (const lookup of lookups) {
|
|
409
|
+
const targets = resolver.resolve({
|
|
410
|
+
binding: lookup.binding,
|
|
411
|
+
fromFile: abs,
|
|
412
|
+
language,
|
|
413
|
+
fromPackage: pkg,
|
|
414
|
+
...(lookup.className ? { className: lookup.className } : {}),
|
|
415
|
+
});
|
|
416
|
+
if (targets.length === 0)
|
|
417
|
+
continue;
|
|
418
|
+
outcome = await renderReference(cwd, targets, lookup, added, seenRefs, stats);
|
|
419
|
+
if (outcome)
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
if (outcome === DUPLICATE)
|
|
423
|
+
continue;
|
|
424
|
+
if (outcome) {
|
|
425
|
+
refSections.push(outcome);
|
|
426
|
+
stats.refs += 1;
|
|
427
|
+
resolved += 1;
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
stats.unresolved += 1;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
catch (error) {
|
|
435
|
+
// 语法树上的任何意外(病态嵌套、运行时缺陷)只影响这一个文件:退回窗口继续
|
|
436
|
+
stats.errors += 1;
|
|
437
|
+
logExtractionError(`file=${file}`, error);
|
|
438
|
+
if (!sectionPushed)
|
|
439
|
+
fallbackToWindow();
|
|
440
|
+
}
|
|
441
|
+
finally {
|
|
442
|
+
tree.delete();
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
return assembleSections(bodySections, refSections, budget, stats);
|
|
446
|
+
}
|
|
447
|
+
/** 在候选目标文件里找声明并渲染;命中过的 (文件, 名字) 返回 DUPLICATE,全部未命中返回 null */
|
|
448
|
+
async function renderReference(cwd, targets, lookup, added, seen, stats) {
|
|
449
|
+
const needle = lookup.member ?? lookup.name;
|
|
450
|
+
for (const abs of targets) {
|
|
451
|
+
const rel = toRepoPath(cwd, abs);
|
|
452
|
+
const key = `${rel}::${lookup.name}::${lookup.member ?? ""}`;
|
|
453
|
+
if (seen.has(key))
|
|
454
|
+
return DUPLICATE;
|
|
455
|
+
let text;
|
|
456
|
+
try {
|
|
457
|
+
if ((0, node_fs_1.statSync)(abs).size > MAX_TARGET_FILE_BYTES)
|
|
458
|
+
continue;
|
|
459
|
+
text = (0, node_fs_1.readFileSync)(abs, "utf8");
|
|
460
|
+
}
|
|
461
|
+
catch {
|
|
462
|
+
continue;
|
|
463
|
+
}
|
|
464
|
+
if (!text.includes(needle) || !text.includes(lookup.name))
|
|
465
|
+
continue;
|
|
466
|
+
const language = (0, tree_sitter_1.languageForPath)(rel);
|
|
467
|
+
if (!language)
|
|
468
|
+
continue;
|
|
469
|
+
const lines = text.split("\n");
|
|
470
|
+
let ranges = [];
|
|
471
|
+
let dedupKey = key;
|
|
472
|
+
const tree = await (0, tree_sitter_1.parseSource)(language, text);
|
|
473
|
+
if (tree) {
|
|
474
|
+
try {
|
|
475
|
+
const found = (0, symbols_1.findDeclaration)(tree.root, language, lookup.name, lookup.member);
|
|
476
|
+
if (found) {
|
|
477
|
+
// 非类声明(接口 / 枚举 / 类型别名)忽略成员:`Color` 与 `Color.RED` 渲染的是同一个整体,按名字去重
|
|
478
|
+
if (found.decl.kind !== "class")
|
|
479
|
+
dedupKey = `${rel}::${lookup.name}::`;
|
|
480
|
+
if (seen.has(dedupKey))
|
|
481
|
+
return DUPLICATE;
|
|
482
|
+
ranges = (0, symbols_1.renderRanges)(found, language);
|
|
483
|
+
}
|
|
484
|
+
else if (tree.root.hasError) {
|
|
485
|
+
// 语法树带错误恢复痕迹(某些 Kotlin 语法组合会把后续声明吞进 ERROR)且没找到声明:按正则兜底
|
|
486
|
+
ranges = (0, symbols_1.findDeclarationByRegex)(lines, language, needle);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
// 目标文件的语法树异常只放弃这一个候选,不影响其余引用
|
|
491
|
+
stats.errors += 1;
|
|
492
|
+
logExtractionError(`target=${rel}`, error);
|
|
493
|
+
continue;
|
|
494
|
+
}
|
|
495
|
+
finally {
|
|
496
|
+
tree.delete();
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
stats.parseFailures += 1;
|
|
501
|
+
ranges = (0, symbols_1.findDeclarationByRegex)(lines, language, needle);
|
|
502
|
+
}
|
|
503
|
+
if (ranges.length === 0)
|
|
504
|
+
continue;
|
|
505
|
+
seen.add(dedupKey);
|
|
506
|
+
const addedSet = new Set((added.get(rel) ?? []).map((a) => a.line));
|
|
507
|
+
return renderFileSection(rel, lines, addedSet, mergeRanges(ranges, 1));
|
|
508
|
+
}
|
|
509
|
+
return null;
|
|
510
|
+
}
|
|
511
|
+
//# sourceMappingURL=symbol-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-context.js","sourceRoot":"","sources":["../../src/core/symbol-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { type SupportedLanguage, type SyntaxNode } from "./tree-sitter";
|
|
2
|
+
/**
|
|
3
|
+
* 各支持语言(TS/JS、Go、Java、Kotlin、Swift)的 AST 读取:找「包含某行的声明」、
|
|
4
|
+
* 列 import 绑定、收集某些行上的标识符、在目标文件里按名字找声明并决定渲染哪些行。
|
|
5
|
+
* 所有函数只读节点、不抛出——语法树里任何意外形态都退化为「找不到」。
|
|
6
|
+
*/
|
|
7
|
+
export type DeclarationKind = "function" | "class" | "type" | "value";
|
|
8
|
+
export interface Declaration {
|
|
9
|
+
name: string | null;
|
|
10
|
+
kind: DeclarationKind;
|
|
11
|
+
/** 1-based,含两端 */
|
|
12
|
+
startLine: number;
|
|
13
|
+
endLine: number;
|
|
14
|
+
/** 头部(签名)的最后一行:函数体 `{` 所在行;无函数体时等于 startLine */
|
|
15
|
+
headerEndLine: number;
|
|
16
|
+
node: SyntaxNode;
|
|
17
|
+
}
|
|
18
|
+
export interface ImportBinding {
|
|
19
|
+
/** 引用文件里使用的本地名(别名优先);通配导入为 "*" */
|
|
20
|
+
local: string;
|
|
21
|
+
/** 被导入的名字;default 导入为 "default";namespace / package / wildcard 为 null */
|
|
22
|
+
imported: string | null;
|
|
23
|
+
/** TS 模块说明符 / Go import path / Java 类全名或包路径 */
|
|
24
|
+
source: string;
|
|
25
|
+
kind: "named" | "default" | "namespace" | "package" | "class" | "wildcard";
|
|
26
|
+
}
|
|
27
|
+
export interface Reference {
|
|
28
|
+
name: string;
|
|
29
|
+
/** `pkg.Name` / `ns.member` / `Foo.BAR` 里的限定符;无限定为 null */
|
|
30
|
+
qualifier: string | null;
|
|
31
|
+
}
|
|
32
|
+
export interface FoundDeclaration {
|
|
33
|
+
decl: Declaration;
|
|
34
|
+
member: Declaration | null;
|
|
35
|
+
}
|
|
36
|
+
/** 类型 / 值 / 类成员清单的渲染行数上限 */
|
|
37
|
+
export declare const MAX_TYPE_LINES = 40;
|
|
38
|
+
/**
|
|
39
|
+
* 判断节点本身是否是一个声明;回调形式的函数表达式返回 null,让调用方继续向上找
|
|
40
|
+
* 真正的外层函数。
|
|
41
|
+
*/
|
|
42
|
+
export declare function classifyNode(node: SyntaxNode, language: SupportedLanguage): Declaration | null;
|
|
43
|
+
/** 找包含指定行(1-based)的最内层声明;顶层语句、import 等返回 null */
|
|
44
|
+
export declare function enclosingDeclaration(root: SyntaxNode, language: SupportedLanguage, line: number, lineLength?: number): Declaration | null;
|
|
45
|
+
/** Go 包名缺省取路径末段;`/v2` 版本段跳过;带连字符的目录再给两个常见变体 */
|
|
46
|
+
export declare function goPackageNameCandidates(importPath: string): string[];
|
|
47
|
+
export declare function collectImports(root: SyntaxNode, language: SupportedLanguage): ImportBinding[];
|
|
48
|
+
/** Go 的 package 名 / Java 的 package 路径;TS 无此概念返回 null */
|
|
49
|
+
export declare function packageName(root: SyntaxNode, language: SupportedLanguage): string | null;
|
|
50
|
+
/** 收集落在给定行(1-based)上的标识符引用;只下探与目标行相交的子树 */
|
|
51
|
+
export declare function collectReferences(root: SyntaxNode, language: SupportedLanguage, lines: Set<number>): Reference[];
|
|
52
|
+
/** 在目标文件的语法树里按名字找顶层声明;member 用于 `Foo.BAR` 这类类成员引用 */
|
|
53
|
+
export declare function findDeclaration(root: SyntaxNode, language: SupportedLanguage, name: string, member: string | null): FoundDeclaration | null;
|
|
54
|
+
/**
|
|
55
|
+
* 决定渲染哪些行(1-based 闭区间,已排序不重叠):
|
|
56
|
+
* 函数 → 签名;类型/值 → 整体但封顶 MAX_TYPE_LINES;
|
|
57
|
+
* 类 → 类头 + 被引用成员的签名(无具体成员时列公开成员签名),封顶 MAX_TYPE_LINES。
|
|
58
|
+
*/
|
|
59
|
+
export declare function renderRanges(found: FoundDeclaration, language: SupportedLanguage): Array<[number, number]>;
|
|
60
|
+
/**
|
|
61
|
+
* 语法树不可用(超大文件解析超时、运行时缺失)时的兜底:按行正则找声明头。
|
|
62
|
+
* 只认「行首就是声明」的常见形态,找不到就返回空。
|
|
63
|
+
*/
|
|
64
|
+
export declare function findDeclarationByRegex(lines: string[], language: SupportedLanguage, name: string): Array<[number, number]>;
|
|
65
|
+
//# sourceMappingURL=symbols.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../src/core/symbols.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAChB,MAAM,eAAe,CAAC;AAEvB;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,kBAAkB;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;CAC5E;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;CAC5B;AAED,4BAA4B;AAC5B,eAAO,MAAM,cAAc,KAAK,CAAC;AAuKjC;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,iBAAiB,GAC1B,WAAW,GAAG,IAAI,CAmMpB;AAED,iDAAiD;AACjD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,MAAM,EACZ,UAAU,SAAI,GACb,WAAW,GAAG,IAAI,CAkBpB;AAED,+CAA+C;AAC/C,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAYpE;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,iBAAiB,GAC1B,aAAa,EAAE,CAkJjB;AAED,wDAAwD;AACxD,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,iBAAiB,GAC1B,MAAM,GAAG,IAAI,CAcf;AA8DD,2CAA2C;AAC3C,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GACjB,SAAS,EAAE,CA4Db;AAwOD,qDAAqD;AACrD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,gBAAgB,GAAG,IAAI,CAUzB;AA8BD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,iBAAiB,GAC1B,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA+BzB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,MAAM,GACX,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAgDzB"}
|