mincut-context 1.2.0 → 1.4.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/README.md +107 -41
- package/dist/adapters/cli/bin.js +68 -5
- package/dist/adapters/cli/bin.js.map +1 -1
- package/dist/adapters/cli/render.d.ts +2 -0
- package/dist/adapters/cli/render.d.ts.map +1 -1
- package/dist/adapters/cli/render.js +95 -0
- package/dist/adapters/cli/render.js.map +1 -1
- package/dist/adapters/cli/tui.d.ts +3 -1
- package/dist/adapters/cli/tui.d.ts.map +1 -1
- package/dist/adapters/cli/tui.js +118 -17
- package/dist/adapters/cli/tui.js.map +1 -1
- package/dist/adapters/cli/watch.d.ts +32 -0
- package/dist/adapters/cli/watch.d.ts.map +1 -0
- package/dist/adapters/cli/watch.js +84 -0
- package/dist/adapters/cli/watch.js.map +1 -0
- package/dist/adapters/mcp/handler.d.ts +20 -0
- package/dist/adapters/mcp/handler.d.ts.map +1 -1
- package/dist/adapters/mcp/handler.js +30 -3
- package/dist/adapters/mcp/handler.js.map +1 -1
- package/dist/adapters/mcp/index.js +1 -1
- package/dist/index/builder.d.ts +29 -0
- package/dist/index/builder.d.ts.map +1 -1
- package/dist/index/builder.js +184 -8
- package/dist/index/builder.js.map +1 -1
- package/dist/index/parse-worker.d.ts +2 -0
- package/dist/index/parse-worker.d.ts.map +1 -0
- package/dist/index/parse-worker.js +36 -0
- package/dist/index/parse-worker.js.map +1 -0
- package/dist/index/worker-pool.d.ts +22 -0
- package/dist/index/worker-pool.d.ts.map +1 -0
- package/dist/index/worker-pool.js +82 -0
- package/dist/index/worker-pool.js.map +1 -0
- package/dist/lsp/resolver.d.ts +24 -0
- package/dist/lsp/resolver.d.ts.map +1 -0
- package/dist/lsp/resolver.js +78 -0
- package/dist/lsp/resolver.js.map +1 -0
- package/dist/lsp/stdio-client.d.ts +31 -0
- package/dist/lsp/stdio-client.d.ts.map +1 -0
- package/dist/lsp/stdio-client.js +140 -0
- package/dist/lsp/stdio-client.js.map +1 -0
- package/dist/lsp/types.d.ts +35 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +7 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/lsp/typescript.d.ts +16 -0
- package/dist/lsp/typescript.d.ts.map +1 -0
- package/dist/lsp/typescript.js +29 -0
- package/dist/lsp/typescript.js.map +1 -0
- package/dist/parsers/chunking.d.ts +34 -0
- package/dist/parsers/chunking.d.ts.map +1 -0
- package/dist/parsers/chunking.js +74 -0
- package/dist/parsers/chunking.js.map +1 -0
- package/dist/parsers/parser.d.ts +14 -0
- package/dist/parsers/parser.d.ts.map +1 -1
- package/dist/parsers/parser.js.map +1 -1
- package/dist/parsers/php.d.ts +2 -2
- package/dist/parsers/php.d.ts.map +1 -1
- package/dist/parsers/php.js +35 -3
- package/dist/parsers/php.js.map +1 -1
- package/dist/parsers/py.d.ts +2 -2
- package/dist/parsers/py.d.ts.map +1 -1
- package/dist/parsers/py.js +21 -4
- package/dist/parsers/py.js.map +1 -1
- package/dist/parsers/ts.d.ts +2 -2
- package/dist/parsers/ts.d.ts.map +1 -1
- package/dist/parsers/ts.js +48 -2
- package/dist/parsers/ts.js.map +1 -1
- package/dist/parsers/vue.d.ts +2 -2
- package/dist/parsers/vue.d.ts.map +1 -1
- package/dist/parsers/vue.js +2 -2
- package/dist/parsers/vue.js.map +1 -1
- package/dist/select/pack.d.ts +52 -0
- package/dist/select/pack.d.ts.map +1 -1
- package/dist/select/pack.js +78 -3
- package/dist/select/pack.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Bare-metal JSON-RPC client speaking the LSP wire protocol (Content-Length
|
|
6
|
+
* framed messages) over stdio. Spawns the language-server binary, sends
|
|
7
|
+
* initialize, and exposes definition() for our resolver.
|
|
8
|
+
*
|
|
9
|
+
* Designed to be small, dep-free, and fully decoupled from any specific
|
|
10
|
+
* language server. The TypeScript adapter just wires the right command +
|
|
11
|
+
* languageId on top of this.
|
|
12
|
+
*/
|
|
13
|
+
export class StdioLspClient {
|
|
14
|
+
command;
|
|
15
|
+
args;
|
|
16
|
+
child = null;
|
|
17
|
+
buffer = Buffer.alloc(0);
|
|
18
|
+
nextId = 1;
|
|
19
|
+
pending = new Map();
|
|
20
|
+
openFiles = new Set();
|
|
21
|
+
rootPath = '';
|
|
22
|
+
constructor(command, args) {
|
|
23
|
+
this.command = command;
|
|
24
|
+
this.args = args;
|
|
25
|
+
}
|
|
26
|
+
async initialize(rootPath) {
|
|
27
|
+
this.rootPath = rootPath;
|
|
28
|
+
this.child = spawn(this.command, this.args, { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
29
|
+
if (!this.child.stdout || !this.child.stdin)
|
|
30
|
+
throw new Error('lsp: no stdio on spawned process');
|
|
31
|
+
this.child.stdout.on('data', (chunk) => this.onData(chunk));
|
|
32
|
+
this.child.on('exit', () => this.flushPendingAsErrors('lsp server exited'));
|
|
33
|
+
this.child.stderr?.on('data', () => {
|
|
34
|
+
/* swallow — many LSPs are chatty on stderr */
|
|
35
|
+
});
|
|
36
|
+
await this.request('initialize', {
|
|
37
|
+
processId: process.pid,
|
|
38
|
+
rootUri: pathToFileURL(rootPath).toString(),
|
|
39
|
+
capabilities: { textDocument: { definition: { dynamicRegistration: false } } },
|
|
40
|
+
});
|
|
41
|
+
this.notify('initialized', {});
|
|
42
|
+
}
|
|
43
|
+
async didOpen(file, source, languageId) {
|
|
44
|
+
if (this.openFiles.has(file))
|
|
45
|
+
return;
|
|
46
|
+
this.openFiles.add(file);
|
|
47
|
+
const uri = pathToFileURL(path.resolve(this.rootPath, file)).toString();
|
|
48
|
+
this.notify('textDocument/didOpen', {
|
|
49
|
+
textDocument: { uri, languageId, version: 1, text: source },
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async definition(file, position) {
|
|
53
|
+
const uri = pathToFileURL(path.resolve(this.rootPath, file)).toString();
|
|
54
|
+
const result = (await this.request('textDocument/definition', {
|
|
55
|
+
textDocument: { uri },
|
|
56
|
+
position,
|
|
57
|
+
}));
|
|
58
|
+
if (!result)
|
|
59
|
+
return { locations: [] };
|
|
60
|
+
return { locations: Array.isArray(result) ? result : [result] };
|
|
61
|
+
}
|
|
62
|
+
async shutdown() {
|
|
63
|
+
if (!this.child)
|
|
64
|
+
return;
|
|
65
|
+
try {
|
|
66
|
+
await this.request('shutdown', null);
|
|
67
|
+
this.notify('exit', null);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// ignore
|
|
71
|
+
}
|
|
72
|
+
this.child.kill('SIGTERM');
|
|
73
|
+
this.child = null;
|
|
74
|
+
}
|
|
75
|
+
request(method, params) {
|
|
76
|
+
const id = this.nextId++;
|
|
77
|
+
const req = { jsonrpc: '2.0', id, method, params };
|
|
78
|
+
this.send(req);
|
|
79
|
+
return new Promise((resolve, reject) => {
|
|
80
|
+
this.pending.set(id, { resolve, reject });
|
|
81
|
+
setTimeout(() => {
|
|
82
|
+
if (this.pending.has(id)) {
|
|
83
|
+
this.pending.delete(id);
|
|
84
|
+
reject(new Error(`lsp: timeout on ${method}`));
|
|
85
|
+
}
|
|
86
|
+
}, 10000);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
notify(method, params) {
|
|
90
|
+
const n = { jsonrpc: '2.0', method, params };
|
|
91
|
+
this.send(n);
|
|
92
|
+
}
|
|
93
|
+
send(message) {
|
|
94
|
+
if (!this.child?.stdin)
|
|
95
|
+
return;
|
|
96
|
+
const body = JSON.stringify(message);
|
|
97
|
+
const header = `Content-Length: ${Buffer.byteLength(body, 'utf8')}\r\n\r\n`;
|
|
98
|
+
this.child.stdin.write(header + body);
|
|
99
|
+
}
|
|
100
|
+
onData(chunk) {
|
|
101
|
+
this.buffer = Buffer.concat([this.buffer, chunk]);
|
|
102
|
+
while (true) {
|
|
103
|
+
const headerEnd = this.buffer.indexOf('\r\n\r\n');
|
|
104
|
+
if (headerEnd < 0)
|
|
105
|
+
return;
|
|
106
|
+
const headerText = this.buffer.slice(0, headerEnd).toString('utf8');
|
|
107
|
+
const m = headerText.match(/Content-Length:\s*(\d+)/i);
|
|
108
|
+
if (!m) {
|
|
109
|
+
this.buffer = this.buffer.slice(headerEnd + 4);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const len = Number(m[1]);
|
|
113
|
+
const total = headerEnd + 4 + len;
|
|
114
|
+
if (this.buffer.length < total)
|
|
115
|
+
return;
|
|
116
|
+
const body = this.buffer.slice(headerEnd + 4, total).toString('utf8');
|
|
117
|
+
this.buffer = this.buffer.slice(total);
|
|
118
|
+
try {
|
|
119
|
+
const msg = JSON.parse(body);
|
|
120
|
+
if (typeof msg.id === 'number' && this.pending.has(msg.id)) {
|
|
121
|
+
const cb = this.pending.get(msg.id);
|
|
122
|
+
this.pending.delete(msg.id);
|
|
123
|
+
if (msg.error)
|
|
124
|
+
cb.reject(new Error(msg.error.message));
|
|
125
|
+
else
|
|
126
|
+
cb.resolve(msg.result);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// ignore non-JSON server output
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
flushPendingAsErrors(reason) {
|
|
135
|
+
for (const [, cb] of this.pending)
|
|
136
|
+
cb.reject(new Error(reason));
|
|
137
|
+
this.pending.clear();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=stdio-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio-client.js","sourceRoot":"","sources":["../../src/lsp/stdio-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAuB7B;;;;;;;;GAQG;AACH,MAAM,OAAO,cAAc;IAQI;IAAkC;IAPvD,KAAK,GAAwB,IAAI,CAAC;IAClC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,GAAG,CAAC,CAAC;IACX,OAAO,GAAG,IAAI,GAAG,EAAyE,CAAC;IAC3F,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,QAAQ,GAAG,EAAE,CAAC;IAEtB,YAA6B,OAAe,EAAmB,IAAc;QAAhD,YAAO,GAAP,OAAO,CAAQ;QAAmB,SAAI,GAAJ,IAAI,CAAU;IAAG,CAAC;IAEjF,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAEjG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACjC,8CAA8C;QAChD,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YAC/B,SAAS,EAAE,OAAO,CAAC,GAAG;YACtB,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;YAC3C,YAAY,EAAE,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,EAAE;SAC/E,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,MAAc,EAAE,UAAkB;QAC5D,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxE,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;YAClC,YAAY,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;SAC5D,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,QAAqB;QAClD,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE;YAC5D,YAAY,EAAE,EAAE,GAAG,EAAE;YACrB,QAAQ;SACT,CAAC,CAAuC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QACtC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAEO,OAAO,CAAC,MAAc,EAAE,MAAe;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,GAAG,GAAe,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1C,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC,EAAE,KAAK,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,MAAc,EAAE,MAAe;QAC5C,MAAM,CAAC,GAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC9D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IAEO,IAAI,CAAC,OAAgB;QAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK;YAAE,OAAO;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,mBAAmB,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC;QAC5E,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,CAAC;IAEO,MAAM,CAAC,KAAa;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAClD,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,SAAS,GAAG,CAAC;gBAAE,OAAO;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpE,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACvD,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;gBAC/C,SAAS;YACX,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC;YAClC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK;gBAAE,OAAO;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACtE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;gBAC5C,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC3D,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;oBACrC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC5B,IAAI,GAAG,CAAC,KAAK;wBAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;;wBAClD,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,MAAc;QACzC,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal LSP types we use. Faithful subset of the LSP spec
|
|
3
|
+
* (https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/),
|
|
4
|
+
* just the bits the resolver needs.
|
|
5
|
+
*/
|
|
6
|
+
export interface LspPosition {
|
|
7
|
+
line: number;
|
|
8
|
+
character: number;
|
|
9
|
+
}
|
|
10
|
+
export interface LspRange {
|
|
11
|
+
start: LspPosition;
|
|
12
|
+
end: LspPosition;
|
|
13
|
+
}
|
|
14
|
+
export interface LspLocation {
|
|
15
|
+
uri: string;
|
|
16
|
+
range: LspRange;
|
|
17
|
+
}
|
|
18
|
+
export interface LspDefinitionResult {
|
|
19
|
+
/** Either a single Location or an array of Locations. */
|
|
20
|
+
locations: LspLocation[];
|
|
21
|
+
}
|
|
22
|
+
export interface LspClient {
|
|
23
|
+
/** Initialize the LSP server with the given root path. */
|
|
24
|
+
initialize(rootPath: string): Promise<void>;
|
|
25
|
+
/** Tell the server the file is open (some servers require this before definition queries). */
|
|
26
|
+
didOpen(file: string, source: string, languageId: string): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Ask the server "where is the symbol at this position defined?"
|
|
29
|
+
* Returns 0+ locations.
|
|
30
|
+
*/
|
|
31
|
+
definition(file: string, position: LspPosition): Promise<LspDefinitionResult>;
|
|
32
|
+
/** Gracefully shut down. */
|
|
33
|
+
shutdown(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lsp/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,WAAW,CAAC;IACnB,GAAG,EAAE,WAAW,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,SAAS,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,0DAA0D;IAC1D,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,8FAA8F;IAC9F,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC9E,4BAA4B;IAC5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lsp/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { LspClient } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Spawn typescript-language-server for the given repo.
|
|
4
|
+
*
|
|
5
|
+
* Requires the binary to be installed (peerOptional dep — we don't bundle).
|
|
6
|
+
* npm install -g typescript-language-server
|
|
7
|
+
* or per-project: npm install --save-dev typescript-language-server
|
|
8
|
+
*
|
|
9
|
+
* If the binary is missing, `initialize()` will throw with a helpful message
|
|
10
|
+
* and the caller should fall back to syntactic resolution.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createTypeScriptLsp(opts?: {
|
|
13
|
+
command?: string;
|
|
14
|
+
}): LspClient;
|
|
15
|
+
export declare function tsLanguageIdFor(file: string): string;
|
|
16
|
+
//# sourceMappingURL=typescript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../src/lsp/typescript.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,SAAS,CAG9E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOpD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { StdioLspClient } from './stdio-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Spawn typescript-language-server for the given repo.
|
|
4
|
+
*
|
|
5
|
+
* Requires the binary to be installed (peerOptional dep — we don't bundle).
|
|
6
|
+
* npm install -g typescript-language-server
|
|
7
|
+
* or per-project: npm install --save-dev typescript-language-server
|
|
8
|
+
*
|
|
9
|
+
* If the binary is missing, `initialize()` will throw with a helpful message
|
|
10
|
+
* and the caller should fall back to syntactic resolution.
|
|
11
|
+
*/
|
|
12
|
+
export function createTypeScriptLsp(opts = {}) {
|
|
13
|
+
const command = opts.command ?? 'typescript-language-server';
|
|
14
|
+
return new StdioLspClient(command, ['--stdio']);
|
|
15
|
+
}
|
|
16
|
+
export function tsLanguageIdFor(file) {
|
|
17
|
+
if (file.endsWith('.tsx'))
|
|
18
|
+
return 'typescriptreact';
|
|
19
|
+
if (file.endsWith('.jsx'))
|
|
20
|
+
return 'javascriptreact';
|
|
21
|
+
if (file.endsWith('.ts'))
|
|
22
|
+
return 'typescript';
|
|
23
|
+
if (file.endsWith('.js'))
|
|
24
|
+
return 'javascript';
|
|
25
|
+
if (file.endsWith('.mjs') || file.endsWith('.cjs'))
|
|
26
|
+
return 'javascript';
|
|
27
|
+
return 'plaintext';
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=typescript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../src/lsp/typescript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA6B,EAAE;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,4BAA4B,CAAC;IAC7D,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,YAAY,CAAC;IACxE,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type Parser from 'tree-sitter';
|
|
2
|
+
import { type ChunkOptions, type ParsedSymbol, type NodeKind } from './parser.js';
|
|
3
|
+
/**
|
|
4
|
+
* Language-agnostic chunking helper.
|
|
5
|
+
*
|
|
6
|
+
* Each parser's visit-function calls this whenever it enters a function-like
|
|
7
|
+
* node. We split the body's top-level statements (whatever `bodyNode`'s
|
|
8
|
+
* named children are) into chunks whose token sum is roughly maxTokens.
|
|
9
|
+
*
|
|
10
|
+
* Returns `null` if the function should NOT be chunked (small enough, or
|
|
11
|
+
* chunking disabled). Returns the emitted chunk symbols if it WAS chunked,
|
|
12
|
+
* along with a `visitStmt` callback the caller invokes per statement so that
|
|
13
|
+
* call edges attribute to the correct chunk id.
|
|
14
|
+
*/
|
|
15
|
+
export interface ChunkResult {
|
|
16
|
+
symbols: ParsedSymbol[];
|
|
17
|
+
/** Per-statement walker for the caller — must be invoked in order. */
|
|
18
|
+
walkStatements: (visitStmt: (stmt: Parser.SyntaxNode) => void) => void;
|
|
19
|
+
}
|
|
20
|
+
export declare function tryChunkBody(args: {
|
|
21
|
+
file: string;
|
|
22
|
+
source: string;
|
|
23
|
+
qualifiedName: string;
|
|
24
|
+
bareName: string;
|
|
25
|
+
kind: NodeKind;
|
|
26
|
+
body: Parser.SyntaxNode | null;
|
|
27
|
+
chunkOptions?: ChunkOptions;
|
|
28
|
+
/**
|
|
29
|
+
* Push/pop caller stack around each chunk walk so the body's calls
|
|
30
|
+
* attribute to the chunk id instead of the parent.
|
|
31
|
+
*/
|
|
32
|
+
callerStack: string[];
|
|
33
|
+
}): ChunkResult | null;
|
|
34
|
+
//# sourceMappingURL=chunking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunking.d.ts","sourceRoot":"","sources":["../../src/parsers/chunking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAgB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEhG;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,sEAAsE;IACtE,cAAc,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,KAAK,IAAI,KAAK,IAAI,CAAC;CACxE;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;IAC/B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,GACA,WAAW,GAAG,IAAI,CA+EpB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { approxTokens } from './parser.js';
|
|
2
|
+
export function tryChunkBody(args) {
|
|
3
|
+
const { file, source, qualifiedName, body, chunkOptions, callerStack, kind } = args;
|
|
4
|
+
if (!chunkOptions?.enabled || !body)
|
|
5
|
+
return null;
|
|
6
|
+
const bodyText = source.slice(body.startIndex, body.endIndex);
|
|
7
|
+
if (approxTokens(bodyText) <= chunkOptions.maxTokens)
|
|
8
|
+
return null;
|
|
9
|
+
const statements = [];
|
|
10
|
+
for (let i = 0; i < body.namedChildCount; i++) {
|
|
11
|
+
const c = body.namedChild(i);
|
|
12
|
+
if (c)
|
|
13
|
+
statements.push(c);
|
|
14
|
+
}
|
|
15
|
+
if (statements.length < 2)
|
|
16
|
+
return null;
|
|
17
|
+
const stmtTokens = statements.map((s) => approxTokens(source.slice(s.startIndex, s.endIndex)));
|
|
18
|
+
const stmtsTotal = stmtTokens.reduce((a, b) => a + b, 0);
|
|
19
|
+
// Use the larger of (maxTokens) and (stmtsTotal / 2) so we always split at
|
|
20
|
+
// least once when the body is over threshold.
|
|
21
|
+
const target = Math.max(chunkOptions.maxTokens, Math.ceil(stmtsTotal / 2));
|
|
22
|
+
const groups = [];
|
|
23
|
+
let current = [];
|
|
24
|
+
let currentTokens = 0;
|
|
25
|
+
for (let i = 0; i < statements.length; i++) {
|
|
26
|
+
const stmt = statements[i];
|
|
27
|
+
if (currentTokens + stmtTokens[i] > target && current.length > 0) {
|
|
28
|
+
groups.push({ start: current[0], end: current[current.length - 1], members: current });
|
|
29
|
+
current = [];
|
|
30
|
+
currentTokens = 0;
|
|
31
|
+
}
|
|
32
|
+
current.push(stmt);
|
|
33
|
+
currentTokens += stmtTokens[i];
|
|
34
|
+
}
|
|
35
|
+
if (current.length > 0) {
|
|
36
|
+
groups.push({ start: current[0], end: current[current.length - 1], members: current });
|
|
37
|
+
}
|
|
38
|
+
if (groups.length < 2) {
|
|
39
|
+
// Body exceeded threshold but greedy packing put everything in one group.
|
|
40
|
+
// Fall back to a midpoint split so the user still gets >=2 chunks.
|
|
41
|
+
const mid = Math.ceil(statements.length / 2);
|
|
42
|
+
const a = statements.slice(0, mid);
|
|
43
|
+
const b = statements.slice(mid);
|
|
44
|
+
if (a.length === 0 || b.length === 0)
|
|
45
|
+
return null;
|
|
46
|
+
groups.length = 0;
|
|
47
|
+
groups.push({ start: a[0], end: a[a.length - 1], members: a });
|
|
48
|
+
groups.push({ start: b[0], end: b[b.length - 1], members: b });
|
|
49
|
+
}
|
|
50
|
+
const symbols = groups.map((g, index) => {
|
|
51
|
+
const text = source.slice(g.start.startIndex, g.end.endIndex);
|
|
52
|
+
const baseLeaf = qualifiedName.split('.').pop() ?? qualifiedName;
|
|
53
|
+
return {
|
|
54
|
+
id: `${file}:${qualifiedName}#${index}`,
|
|
55
|
+
name: `${baseLeaf}#${index}`,
|
|
56
|
+
file,
|
|
57
|
+
kind,
|
|
58
|
+
startLine: g.start.startPosition.row + 1,
|
|
59
|
+
endLine: g.end.endPosition.row + 1,
|
|
60
|
+
tokens: approxTokens(text),
|
|
61
|
+
chunk: { parent: qualifiedName, index },
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
const walkStatements = (visitStmt) => {
|
|
65
|
+
groups.forEach((g, index) => {
|
|
66
|
+
callerStack.push(symbols[index].id);
|
|
67
|
+
for (const member of g.members)
|
|
68
|
+
visitStmt(member);
|
|
69
|
+
callerStack.pop();
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
return { symbols, walkStatements };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=chunking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunking.js","sourceRoot":"","sources":["../../src/parsers/chunking.ts"],"names":[],"mappings":"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"}
|
package/dist/parsers/parser.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { NodeKind } from '../core/graph.js';
|
|
2
|
+
export type { NodeKind } from '../core/graph.js';
|
|
2
3
|
export interface ParsedSymbol {
|
|
3
4
|
id: string;
|
|
4
5
|
name: string;
|
|
@@ -7,6 +8,16 @@ export interface ParsedSymbol {
|
|
|
7
8
|
startLine: number;
|
|
8
9
|
endLine: number;
|
|
9
10
|
tokens: number;
|
|
11
|
+
/** Present on sub-symbol chunks emitted from a large parent function. */
|
|
12
|
+
chunk?: {
|
|
13
|
+
parent: string;
|
|
14
|
+
index: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface ChunkOptions {
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
/** Functions whose body exceeds this token count get split into chunks. */
|
|
20
|
+
maxTokens: number;
|
|
10
21
|
}
|
|
11
22
|
export interface ParsedImport {
|
|
12
23
|
source: string;
|
|
@@ -16,6 +27,9 @@ export interface ParsedImport {
|
|
|
16
27
|
export interface ParsedCall {
|
|
17
28
|
from: string;
|
|
18
29
|
toName: string;
|
|
30
|
+
/** Optional source position of the callee identifier (1-based line, 0-based col). */
|
|
31
|
+
line?: number;
|
|
32
|
+
character?: number;
|
|
19
33
|
}
|
|
20
34
|
export interface ParseResult {
|
|
21
35
|
symbols: ParsedSymbol[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parsers/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parsers/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC;CAClD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parsers/parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parsers/parser.ts"],"names":[],"mappings":"AA+CA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/parsers/php.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type ParseResult } from './parser.js';
|
|
2
|
-
export declare function parsePhp(file: string, source: string): ParseResult;
|
|
1
|
+
import { type ChunkOptions, type ParseResult } from './parser.js';
|
|
2
|
+
export declare function parsePhp(file: string, source: string, chunkOptions?: ChunkOptions): ParseResult;
|
|
3
3
|
//# sourceMappingURL=php.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"php.d.ts","sourceRoot":"","sources":["../../src/parsers/php.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"php.d.ts","sourceRoot":"","sources":["../../src/parsers/php.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,YAAY,EAGjB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AASrB,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,YAAY,GAC1B,WAAW,CAoBb"}
|
package/dist/parsers/php.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import Parser from 'tree-sitter';
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
3
|
import { approxTokens, } from './parser.js';
|
|
4
|
+
import { tryChunkBody } from './chunking.js';
|
|
4
5
|
const require_ = createRequire(import.meta.url);
|
|
5
6
|
const Php = require_('tree-sitter-php');
|
|
6
7
|
const phpParser = new Parser();
|
|
7
8
|
phpParser.setLanguage(Php.php);
|
|
8
|
-
export function parsePhp(file, source) {
|
|
9
|
+
export function parsePhp(file, source, chunkOptions) {
|
|
9
10
|
let tree;
|
|
10
11
|
try {
|
|
11
12
|
tree = phpParser.parse(source);
|
|
@@ -21,6 +22,7 @@ export function parsePhp(file, source) {
|
|
|
21
22
|
calls: [],
|
|
22
23
|
classStack: [],
|
|
23
24
|
callerStack: [],
|
|
25
|
+
chunkOptions,
|
|
24
26
|
};
|
|
25
27
|
visit(tree.rootNode, ctx);
|
|
26
28
|
return { symbols: ctx.symbols, imports: ctx.imports, calls: ctx.calls };
|
|
@@ -30,10 +32,25 @@ function visit(node, ctx) {
|
|
|
30
32
|
case 'function_definition': {
|
|
31
33
|
const name = node.childForFieldName('name')?.text;
|
|
32
34
|
if (name) {
|
|
35
|
+
const body = node.childForFieldName('body');
|
|
36
|
+
const chunked = tryChunkBody({
|
|
37
|
+
file: ctx.file,
|
|
38
|
+
source: ctx.source,
|
|
39
|
+
qualifiedName: name,
|
|
40
|
+
bareName: name,
|
|
41
|
+
kind: 'function',
|
|
42
|
+
body,
|
|
43
|
+
chunkOptions: ctx.chunkOptions,
|
|
44
|
+
callerStack: ctx.callerStack,
|
|
45
|
+
});
|
|
46
|
+
if (chunked) {
|
|
47
|
+
ctx.symbols.push(...chunked.symbols);
|
|
48
|
+
chunked.walkStatements((stmt) => visit(stmt, ctx));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
33
51
|
const sym = mk(ctx, node, name, name, 'function');
|
|
34
52
|
ctx.symbols.push(sym);
|
|
35
53
|
ctx.callerStack.push(sym.id);
|
|
36
|
-
const body = node.childForFieldName('body');
|
|
37
54
|
if (body)
|
|
38
55
|
visit(body, ctx);
|
|
39
56
|
ctx.callerStack.pop();
|
|
@@ -67,10 +84,25 @@ function visit(node, ctx) {
|
|
|
67
84
|
break;
|
|
68
85
|
const cls = ctx.classStack[ctx.classStack.length - 1];
|
|
69
86
|
const qualified = cls ? `${cls}.${name}` : name;
|
|
87
|
+
const body = node.childForFieldName('body');
|
|
88
|
+
const chunked = tryChunkBody({
|
|
89
|
+
file: ctx.file,
|
|
90
|
+
source: ctx.source,
|
|
91
|
+
qualifiedName: qualified,
|
|
92
|
+
bareName: name,
|
|
93
|
+
kind: 'method',
|
|
94
|
+
body,
|
|
95
|
+
chunkOptions: ctx.chunkOptions,
|
|
96
|
+
callerStack: ctx.callerStack,
|
|
97
|
+
});
|
|
98
|
+
if (chunked) {
|
|
99
|
+
ctx.symbols.push(...chunked.symbols);
|
|
100
|
+
chunked.walkStatements((stmt) => visit(stmt, ctx));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
70
103
|
const sym = mk(ctx, node, name, qualified, 'method');
|
|
71
104
|
ctx.symbols.push(sym);
|
|
72
105
|
ctx.callerStack.push(sym.id);
|
|
73
|
-
const body = node.childForFieldName('body');
|
|
74
106
|
if (body)
|
|
75
107
|
visit(body, ctx);
|
|
76
108
|
ctx.callerStack.pop();
|
package/dist/parsers/php.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"php.js","sourceRoot":"","sources":["../../src/parsers/php.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,YAAY,
|
|
1
|
+
{"version":3,"file":"php.js","sourceRoot":"","sources":["../../src/parsers/php.ts"],"names":[],"mappings":"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"}
|
package/dist/parsers/py.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type ParseResult } from './parser.js';
|
|
2
|
-
export declare function parsePython(file: string, source: string): ParseResult;
|
|
1
|
+
import { type ChunkOptions, type ParseResult } from './parser.js';
|
|
2
|
+
export declare function parsePython(file: string, source: string, chunkOptions?: ChunkOptions): ParseResult;
|
|
3
3
|
//# sourceMappingURL=py.d.ts.map
|
package/dist/parsers/py.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"py.d.ts","sourceRoot":"","sources":["../../src/parsers/py.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"py.d.ts","sourceRoot":"","sources":["../../src/parsers/py.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,YAAY,EAGjB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AASrB,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,YAAY,GAC1B,WAAW,CAoBb"}
|
package/dist/parsers/py.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import Parser from 'tree-sitter';
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
3
|
import { approxTokens, } from './parser.js';
|
|
4
|
+
import { tryChunkBody } from './chunking.js';
|
|
4
5
|
const require_ = createRequire(import.meta.url);
|
|
5
6
|
const Python = require_('tree-sitter-python');
|
|
6
7
|
const pyParser = new Parser();
|
|
7
8
|
pyParser.setLanguage(Python);
|
|
8
|
-
export function parsePython(file, source) {
|
|
9
|
+
export function parsePython(file, source, chunkOptions) {
|
|
9
10
|
let tree;
|
|
10
11
|
try {
|
|
11
12
|
tree = pyParser.parse(source);
|
|
@@ -21,6 +22,7 @@ export function parsePython(file, source) {
|
|
|
21
22
|
calls: [],
|
|
22
23
|
classStack: [],
|
|
23
24
|
callerStack: [],
|
|
25
|
+
chunkOptions,
|
|
24
26
|
};
|
|
25
27
|
visit(tree.rootNode, ctx);
|
|
26
28
|
return { symbols: ctx.symbols, imports: ctx.imports, calls: ctx.calls };
|
|
@@ -34,11 +36,26 @@ function visit(node, ctx) {
|
|
|
34
36
|
const bareName = nameNode.text;
|
|
35
37
|
const cls = ctx.classStack[ctx.classStack.length - 1];
|
|
36
38
|
const qualified = cls ? `${cls}.${bareName}` : bareName;
|
|
37
|
-
const
|
|
39
|
+
const kind = cls ? 'method' : 'function';
|
|
40
|
+
const body = node.childForFieldName('body');
|
|
41
|
+
const chunked = tryChunkBody({
|
|
42
|
+
file: ctx.file,
|
|
43
|
+
source: ctx.source,
|
|
44
|
+
qualifiedName: qualified,
|
|
45
|
+
bareName,
|
|
46
|
+
kind,
|
|
47
|
+
body,
|
|
48
|
+
chunkOptions: ctx.chunkOptions,
|
|
49
|
+
callerStack: ctx.callerStack,
|
|
50
|
+
});
|
|
51
|
+
if (chunked) {
|
|
52
|
+
ctx.symbols.push(...chunked.symbols);
|
|
53
|
+
chunked.walkStatements((stmt) => visit(stmt, ctx));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const sym = makeSym(ctx, node, bareName, qualified, kind);
|
|
38
57
|
ctx.symbols.push(sym);
|
|
39
58
|
ctx.callerStack.push(sym.id);
|
|
40
|
-
// Walk the body — nested defs/calls.
|
|
41
|
-
const body = node.childForFieldName('body');
|
|
42
59
|
if (body)
|
|
43
60
|
visit(body, ctx);
|
|
44
61
|
ctx.callerStack.pop();
|