milens 0.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.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +213 -0
  3. package/dist/analyzer/engine.d.ts +11 -0
  4. package/dist/analyzer/engine.d.ts.map +1 -0
  5. package/dist/analyzer/engine.js +163 -0
  6. package/dist/analyzer/engine.js.map +1 -0
  7. package/dist/analyzer/resolver.d.ts +12 -0
  8. package/dist/analyzer/resolver.d.ts.map +1 -0
  9. package/dist/analyzer/resolver.js +119 -0
  10. package/dist/analyzer/resolver.js.map +1 -0
  11. package/dist/analyzer/scanner.d.ts +6 -0
  12. package/dist/analyzer/scanner.d.ts.map +1 -0
  13. package/dist/analyzer/scanner.js +73 -0
  14. package/dist/analyzer/scanner.js.map +1 -0
  15. package/dist/cli.d.ts +3 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +269 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/parser/extract.d.ts +24 -0
  20. package/dist/parser/extract.d.ts.map +1 -0
  21. package/dist/parser/extract.js +239 -0
  22. package/dist/parser/extract.js.map +1 -0
  23. package/dist/parser/lang-go.d.ts +4 -0
  24. package/dist/parser/lang-go.d.ts.map +1 -0
  25. package/dist/parser/lang-go.js +45 -0
  26. package/dist/parser/lang-go.js.map +1 -0
  27. package/dist/parser/lang-java.d.ts +4 -0
  28. package/dist/parser/lang-java.d.ts.map +1 -0
  29. package/dist/parser/lang-java.js +46 -0
  30. package/dist/parser/lang-java.js.map +1 -0
  31. package/dist/parser/lang-js.d.ts +4 -0
  32. package/dist/parser/lang-js.d.ts.map +1 -0
  33. package/dist/parser/lang-js.js +64 -0
  34. package/dist/parser/lang-js.js.map +1 -0
  35. package/dist/parser/lang-php.d.ts +4 -0
  36. package/dist/parser/lang-php.d.ts.map +1 -0
  37. package/dist/parser/lang-php.js +54 -0
  38. package/dist/parser/lang-php.js.map +1 -0
  39. package/dist/parser/lang-py.d.ts +4 -0
  40. package/dist/parser/lang-py.d.ts.map +1 -0
  41. package/dist/parser/lang-py.js +46 -0
  42. package/dist/parser/lang-py.js.map +1 -0
  43. package/dist/parser/lang-rust.d.ts +4 -0
  44. package/dist/parser/lang-rust.d.ts.map +1 -0
  45. package/dist/parser/lang-rust.js +54 -0
  46. package/dist/parser/lang-rust.js.map +1 -0
  47. package/dist/parser/lang-ts.d.ts +4 -0
  48. package/dist/parser/lang-ts.d.ts.map +1 -0
  49. package/dist/parser/lang-ts.js +88 -0
  50. package/dist/parser/lang-ts.js.map +1 -0
  51. package/dist/parser/lang-vue.d.ts +12 -0
  52. package/dist/parser/lang-vue.d.ts.map +1 -0
  53. package/dist/parser/lang-vue.js +28 -0
  54. package/dist/parser/lang-vue.js.map +1 -0
  55. package/dist/parser/languages.d.ts +6 -0
  56. package/dist/parser/languages.d.ts.map +1 -0
  57. package/dist/parser/languages.js +24 -0
  58. package/dist/parser/languages.js.map +1 -0
  59. package/dist/parser/loader.d.ts +5 -0
  60. package/dist/parser/loader.d.ts.map +1 -0
  61. package/dist/parser/loader.js +37 -0
  62. package/dist/parser/loader.js.map +1 -0
  63. package/dist/server/mcp.d.ts +5 -0
  64. package/dist/server/mcp.d.ts.map +1 -0
  65. package/dist/server/mcp.js +355 -0
  66. package/dist/server/mcp.js.map +1 -0
  67. package/dist/skills.d.ts +8 -0
  68. package/dist/skills.d.ts.map +1 -0
  69. package/dist/skills.js +178 -0
  70. package/dist/skills.js.map +1 -0
  71. package/dist/store/db.d.ts +59 -0
  72. package/dist/store/db.d.ts.map +1 -0
  73. package/dist/store/db.js +260 -0
  74. package/dist/store/db.js.map +1 -0
  75. package/dist/store/registry.d.ts +13 -0
  76. package/dist/store/registry.d.ts.map +1 -0
  77. package/dist/store/registry.js +69 -0
  78. package/dist/store/registry.js.map +1 -0
  79. package/dist/store/schema.sql +60 -0
  80. package/dist/types.d.ts +67 -0
  81. package/dist/types.d.ts.map +1 -0
  82. package/dist/types.js +3 -0
  83. package/dist/types.js.map +1 -0
  84. package/package.json +60 -0
package/dist/cli.js ADDED
@@ -0,0 +1,269 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { resolve, join, dirname, basename } from 'node:path';
4
+ import { mkdirSync, existsSync, readFileSync, rmSync } from 'node:fs';
5
+ import { createHash } from 'node:crypto';
6
+ const program = new Command();
7
+ program
8
+ .name('milens')
9
+ .description('Code intelligence engine — analyze codebases, build knowledge graphs, serve via MCP')
10
+ .version('0.2.0');
11
+ program
12
+ .command('analyze')
13
+ .description('Index a codebase: parse symbols, resolve dependencies, build search index')
14
+ .option('-p, --path <path>', 'Repository root path', '.')
15
+ .option('-o, --output <dir>', 'Output directory for database')
16
+ .option('-v, --verbose', 'Show detailed progress')
17
+ .option('-f, --force', 'Force full re-index')
18
+ .option('-s, --skills', 'Generate SKILL.md files for each code area')
19
+ .action(async (opts) => {
20
+ const rootPath = resolve(opts.path);
21
+ const outDir = opts.output ?? join(rootPath, '.milens');
22
+ mkdirSync(outDir, { recursive: true });
23
+ const dbPath = join(outDir, 'milens.db');
24
+ // Load project aliases (tsconfig paths, etc.)
25
+ const aliases = loadAliases(rootPath);
26
+ const { analyze } = await import('./analyzer/engine.js');
27
+ const stats = await analyze({
28
+ rootPath,
29
+ dbPath,
30
+ verbose: opts.verbose,
31
+ force: opts.force,
32
+ aliases,
33
+ });
34
+ // Register in global registry
35
+ const contentHash = createHash('sha256').update(JSON.stringify(stats)).digest('hex').slice(0, 12);
36
+ const { RepoRegistry } = await import('./store/registry.js');
37
+ new RepoRegistry().register(rootPath, dbPath, contentHash);
38
+ console.log(`\n✓ Indexed ${stats.symbolCount} symbols, ${stats.linkCount} links across ${stats.filesParsed} files (${stats.durationMs}ms)`);
39
+ if (opts.skills) {
40
+ const { Database } = await import('./store/db.js');
41
+ const { generateSkills } = await import('./skills.js');
42
+ const db = new Database(dbPath);
43
+ const result = generateSkills(db, rootPath);
44
+ db.close();
45
+ console.log(`✓ Generated ${result.count} skill files for each editor:`);
46
+ for (const d of result.dirs)
47
+ console.log(` ${d}`);
48
+ }
49
+ });
50
+ program
51
+ .command('search <query>')
52
+ .description('Search symbols by name')
53
+ .option('-l, --limit <n>', 'Max results', '20')
54
+ .option('-p, --path <path>', 'Repository root path', '.')
55
+ .action(async (query, opts) => {
56
+ const { Database } = await import('./store/db.js');
57
+ const { RepoRegistry } = await import('./store/registry.js');
58
+ const dbPath = new RepoRegistry().findDbPath(resolve(opts.path));
59
+ if (!dbPath) {
60
+ console.error('Not indexed. Run `milens analyze` first.');
61
+ process.exit(1);
62
+ }
63
+ const db = new Database(dbPath);
64
+ const results = db.searchSymbols(query, parseInt(opts.limit));
65
+ for (const s of results) {
66
+ console.log(`${s.name} [${s.kind}] ${s.filePath}:${s.startLine}${s.exported ? ' (exported)' : ''}`);
67
+ }
68
+ db.close();
69
+ });
70
+ program
71
+ .command('inspect <symbol>')
72
+ .description('360° view of a symbol: refs, deps, hierarchy')
73
+ .option('-p, --path <path>', 'Repository root path', '.')
74
+ .action(async (symbol, opts) => {
75
+ const { Database } = await import('./store/db.js');
76
+ const { RepoRegistry } = await import('./store/registry.js');
77
+ const dbPath = new RepoRegistry().findDbPath(resolve(opts.path));
78
+ if (!dbPath) {
79
+ console.error('Not indexed. Run `milens analyze` first.');
80
+ process.exit(1);
81
+ }
82
+ const db = new Database(dbPath);
83
+ const symbols = db.findSymbolByName(symbol);
84
+ for (const sym of symbols) {
85
+ console.log(`\n${sym.name} [${sym.kind}] ${sym.filePath}:${sym.startLine}`);
86
+ const incoming = db.getIncomingLinks(sym.id);
87
+ if (incoming.length) {
88
+ console.log(' incoming:');
89
+ for (const l of incoming) {
90
+ const from = db.findSymbolById(l.fromId);
91
+ console.log(` ${l.type}: ${from?.name ?? l.fromId} (${from?.filePath ?? '?'})`);
92
+ }
93
+ }
94
+ const outgoing = db.getOutgoingLinks(sym.id);
95
+ if (outgoing.length) {
96
+ console.log(' outgoing:');
97
+ for (const l of outgoing) {
98
+ const to = db.findSymbolById(l.toId);
99
+ console.log(` ${l.type}: ${to?.name ?? l.toId} (${to?.filePath ?? '?'})`);
100
+ }
101
+ }
102
+ }
103
+ db.close();
104
+ });
105
+ program
106
+ .command('impact <symbol>')
107
+ .description('Blast radius: what breaks if this symbol changes?')
108
+ .option('-d, --direction <dir>', 'upstream or downstream', 'upstream')
109
+ .option('--depth <n>', 'Max traversal depth', '3')
110
+ .option('-p, --path <path>', 'Repository root path', '.')
111
+ .action(async (symbol, opts) => {
112
+ const { Database } = await import('./store/db.js');
113
+ const { RepoRegistry } = await import('./store/registry.js');
114
+ const dbPath = new RepoRegistry().findDbPath(resolve(opts.path));
115
+ if (!dbPath) {
116
+ console.error('Not indexed. Run `milens analyze` first.');
117
+ process.exit(1);
118
+ }
119
+ const db = new Database(dbPath);
120
+ const symbols = db.findSymbolByName(symbol);
121
+ const depth = parseInt(opts.depth);
122
+ for (const sym of symbols) {
123
+ console.log(`\nTARGET: ${sym.name} [${sym.kind}] ${sym.filePath}:${sym.startLine}`);
124
+ const refs = opts.direction === 'upstream'
125
+ ? db.findUpstream(sym.id, depth)
126
+ : db.findDownstream(sym.id, depth);
127
+ if (refs.length === 0) {
128
+ console.log(` No ${opts.direction} dependencies.`);
129
+ }
130
+ for (const { symbol: ref, depth: d, via } of refs) {
131
+ console.log(` [depth ${d}] ${ref.name} [${ref.kind}] ${ref.filePath}:${ref.startLine} (${via})`);
132
+ }
133
+ }
134
+ db.close();
135
+ });
136
+ program
137
+ .command('serve')
138
+ .description('Start MCP server')
139
+ .option('-p, --path <path>', 'Repository root path', '.')
140
+ .option('--http', 'Use HTTP transport instead of stdio')
141
+ .option('--port <port>', 'HTTP port', '3100')
142
+ .action(async (opts) => {
143
+ if (opts.http) {
144
+ const { startHttp } = await import('./server/mcp.js');
145
+ await startHttp(parseInt(opts.port), resolve(opts.path));
146
+ }
147
+ else {
148
+ const { startStdio } = await import('./server/mcp.js');
149
+ await startStdio(resolve(opts.path));
150
+ }
151
+ });
152
+ program
153
+ .command('status')
154
+ .description('Show index status')
155
+ .option('-p, --path <path>', 'Repository root path', '.')
156
+ .action(async (opts) => {
157
+ const { Database } = await import('./store/db.js');
158
+ const { RepoRegistry } = await import('./store/registry.js');
159
+ const reg = new RepoRegistry();
160
+ const entry = reg.findByRoot(resolve(opts.path));
161
+ if (!entry) {
162
+ console.log('Not indexed.');
163
+ return;
164
+ }
165
+ const db = new Database(entry.dbPath);
166
+ const stats = db.getStats();
167
+ console.log(`Repository: ${entry.rootPath}`);
168
+ console.log(`Database: ${entry.dbPath}`);
169
+ console.log(`Indexed: ${entry.analyzedAt}`);
170
+ console.log(`Symbols: ${stats.symbols}`);
171
+ console.log(`Links: ${stats.links}`);
172
+ console.log(`Files: ${stats.files}`);
173
+ db.close();
174
+ });
175
+ program
176
+ .command('list')
177
+ .description('List all indexed repositories')
178
+ .action(async () => {
179
+ const { RepoRegistry } = await import('./store/registry.js');
180
+ const entries = new RepoRegistry().listAll();
181
+ if (entries.length === 0) {
182
+ console.log('No indexed repositories.');
183
+ return;
184
+ }
185
+ console.log(`${entries.length} indexed repositories:\n`);
186
+ for (const entry of entries) {
187
+ console.log(` ${entry.rootPath}`);
188
+ console.log(` DB: ${entry.dbPath}`);
189
+ console.log(` Indexed: ${entry.analyzedAt}`);
190
+ console.log('');
191
+ }
192
+ });
193
+ program
194
+ .command('clean')
195
+ .description('Remove index for a repository')
196
+ .option('-p, --path <path>', 'Repository root path', '.')
197
+ .option('--all', 'Remove all indexes')
198
+ .action(async (opts) => {
199
+ const { RepoRegistry } = await import('./store/registry.js');
200
+ const reg = new RepoRegistry();
201
+ if (opts.all) {
202
+ const entries = reg.listAll();
203
+ for (const e of entries) {
204
+ deleteIndex(e.dbPath);
205
+ reg.remove(e.rootPath);
206
+ }
207
+ console.log(`Cleaned ${entries.length} repositories.`);
208
+ }
209
+ else {
210
+ const rootPath = resolve(opts.path);
211
+ const entry = reg.findByRoot(rootPath);
212
+ if (!entry) {
213
+ console.log('Not indexed.');
214
+ return;
215
+ }
216
+ deleteIndex(entry.dbPath);
217
+ reg.remove(rootPath);
218
+ console.log(`Cleaned index for ${rootPath}`);
219
+ }
220
+ });
221
+ program.parse();
222
+ // ── Helpers ──
223
+ function loadAliases(rootPath) {
224
+ const aliases = {};
225
+ const tsconfigPath = join(rootPath, 'tsconfig.json');
226
+ if (existsSync(tsconfigPath)) {
227
+ try {
228
+ const raw = readFileSync(tsconfigPath, 'utf-8')
229
+ .replace(/\/\/.*$/gm, '')
230
+ .replace(/\/\*[\s\S]*?\*\//g, '');
231
+ const cfg = JSON.parse(raw);
232
+ const paths = cfg.compilerOptions?.paths ?? {};
233
+ for (const [alias, targets] of Object.entries(paths)) {
234
+ const clean = alias.replace('/*', '');
235
+ const target = targets[0]?.replace('/*', '').replace('./', '') ?? '';
236
+ if (clean && target)
237
+ aliases[clean] = target;
238
+ }
239
+ }
240
+ catch { /* ignore */ }
241
+ }
242
+ // PSR-4 from composer.json
243
+ const composerPath = join(rootPath, 'composer.json');
244
+ if (existsSync(composerPath)) {
245
+ try {
246
+ const composer = JSON.parse(readFileSync(composerPath, 'utf-8'));
247
+ for (const [ns, dir] of Object.entries(composer.autoload?.['psr-4'] ?? {})) {
248
+ aliases[ns] = dir.replace(/\/$/, '');
249
+ }
250
+ }
251
+ catch { /* ignore */ }
252
+ }
253
+ return aliases;
254
+ }
255
+ function deleteIndex(dbPath) {
256
+ const dir = dirname(dbPath);
257
+ if (basename(dir) === '.milens') {
258
+ rmSync(dir, { recursive: true, force: true });
259
+ }
260
+ else {
261
+ for (const suffix of ['', '-wal', '-shm']) {
262
+ try {
263
+ rmSync(dbPath + suffix, { force: true });
264
+ }
265
+ catch { /* ignore */ }
266
+ }
267
+ }
268
+ }
269
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type Parser from 'web-tree-sitter';
2
+ import type { ExtractionResult } from '../types.js';
3
+ export interface LangSpec {
4
+ id: string;
5
+ extensions: string[];
6
+ wasmName: string;
7
+ queries: {
8
+ functions?: string;
9
+ classes?: string;
10
+ methods?: string;
11
+ interfaces?: string;
12
+ enums?: string;
13
+ structs?: string;
14
+ traits?: string;
15
+ imports?: string;
16
+ calls?: string;
17
+ exports?: string;
18
+ heritage?: string;
19
+ };
20
+ resolveImport(raw: string, fromFile: string, root: string, aliases: Record<string, string>): string | null;
21
+ }
22
+ export declare function clearQueryCache(): void;
23
+ export declare function extractFromTree(tree: Parser.Tree, lang: Parser.Language, spec: LangSpec, filePath: string): ExtractionResult;
24
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/parser/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAA+C,gBAAgB,EAAc,MAAM,aAAa,CAAC;AAI7G,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;CAC5G;AAqBD,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAqHD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,IAAI,EAAE,MAAM,CAAC,QAAQ,EACrB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAmIlB"}
@@ -0,0 +1,239 @@
1
+ // ── Compiled query cache: compile once per (language, queryString) ──
2
+ // Key = langPtr + "|" + queryString, Value = compiled Query (or null if invalid)
3
+ const queryCache = new Map();
4
+ function getOrCompileQuery(lang, queryStr) {
5
+ // Use the language pointer address as part of cache key (each Language instance is unique per WASM)
6
+ const cacheKey = `${lang.ptr ?? lang.toString()}|${queryStr}`;
7
+ if (queryCache.has(cacheKey))
8
+ return queryCache.get(cacheKey);
9
+ try {
10
+ const q = lang.query(queryStr);
11
+ queryCache.set(cacheKey, q);
12
+ return q;
13
+ }
14
+ catch {
15
+ queryCache.set(cacheKey, null);
16
+ return null;
17
+ }
18
+ }
19
+ export function clearQueryCache() {
20
+ queryCache.clear();
21
+ }
22
+ // ── Helpers (stateless, hoisted out of hot path) ──
23
+ function captureText(match, captureName) {
24
+ const captures = match.captures;
25
+ for (let i = 0; i < captures.length; i++) {
26
+ if (captures[i].name === captureName)
27
+ return captures[i].node.text;
28
+ }
29
+ }
30
+ function captureNode(match, captureName) {
31
+ const captures = match.captures;
32
+ for (let i = 0; i < captures.length; i++) {
33
+ if (captures[i].name === captureName)
34
+ return captures[i].node;
35
+ }
36
+ }
37
+ // ── Import name extraction from AST ──
38
+ function collectImportNames(defNode) {
39
+ const names = [];
40
+ walkImportNames(defNode, names);
41
+ return names;
42
+ }
43
+ function walkImportNames(node, out) {
44
+ // TS/JS: import { Foo, Bar as B }
45
+ if (node.type === 'import_specifier') {
46
+ const n = node.childForFieldName('name');
47
+ const a = node.childForFieldName('alias');
48
+ if (n)
49
+ out.push({ name: n.text, alias: a?.text });
50
+ return;
51
+ }
52
+ // TS/JS: default import (identifier directly under import_clause)
53
+ if (node.type === 'identifier' && node.parent?.type === 'import_clause') {
54
+ out.push({ name: node.text });
55
+ return;
56
+ }
57
+ // Python: from x import Foo, Bar as B
58
+ if (node.type === 'import_from_statement') {
59
+ for (let i = 0; i < node.namedChildCount; i++) {
60
+ const child = node.namedChild(i);
61
+ if (child === node.childForFieldName('module_name'))
62
+ continue;
63
+ if (child.type === 'dotted_name')
64
+ out.push({ name: child.text });
65
+ else if (child.type === 'aliased_import') {
66
+ const n = child.childForFieldName('name');
67
+ const a = child.childForFieldName('alias');
68
+ if (n)
69
+ out.push({ name: n.text, alias: a?.text });
70
+ }
71
+ }
72
+ return;
73
+ }
74
+ // Recurse for other node types (import_clause, named_imports, etc.)
75
+ for (let i = 0; i < node.namedChildCount; i++) {
76
+ walkImportNames(node.namedChild(i), out);
77
+ }
78
+ }
79
+ // ── Heritage type detection from AST ancestry ──
80
+ function detectHeritageType(node) {
81
+ let cur = node.parent;
82
+ while (cur) {
83
+ const t = cur.type;
84
+ if (t === 'implements_clause' || t === 'super_interfaces' || t === 'class_interface_clause' || t === 'impl_item') {
85
+ return 'implements';
86
+ }
87
+ if (t === 'extends_clause' || t === 'superclass' || t === 'base_clause') {
88
+ return 'extends';
89
+ }
90
+ cur = cur.parent;
91
+ }
92
+ return 'extends';
93
+ }
94
+ function buildSpanIndex(symbols) {
95
+ const spans = [];
96
+ for (const s of symbols) {
97
+ if (s.kind === 'function' || s.kind === 'method' || s.kind === 'class' || s.kind === 'struct' || s.kind === 'trait') {
98
+ spans.push({ startLine: s.startLine, endLine: s.endLine, id: s.id });
99
+ }
100
+ }
101
+ // Sort by startLine desc so we find the innermost (tightest) enclosing first
102
+ spans.sort((a, b) => b.startLine - a.startLine);
103
+ return spans;
104
+ }
105
+ function findEnclosing(spans, line) {
106
+ // Linear scan on pre-sorted array — tightest match wins (innermost symbol)
107
+ for (let i = 0; i < spans.length; i++) {
108
+ const sp = spans[i];
109
+ if (sp.startLine <= line && sp.endLine >= line)
110
+ return sp.id;
111
+ }
112
+ }
113
+ // ── Symbol query type mapping (constant) ──
114
+ const SYMBOL_QUERY_TYPES = [
115
+ { key: 'functions', kind: 'function' },
116
+ { key: 'classes', kind: 'class' },
117
+ { key: 'methods', kind: 'method' },
118
+ { key: 'interfaces', kind: 'interface' },
119
+ { key: 'enums', kind: 'enum' },
120
+ { key: 'structs', kind: 'struct' },
121
+ { key: 'traits', kind: 'trait' },
122
+ ];
123
+ // Container kinds for method → parent resolution
124
+ const CONTAINER_KINDS = new Set(['class', 'struct', 'trait']);
125
+ // ── Universal symbol extractor ──
126
+ export function extractFromTree(tree, lang, spec, filePath) {
127
+ const symbols = [];
128
+ const imports = [];
129
+ const calls = [];
130
+ const heritage = [];
131
+ const exportedNames = new Set();
132
+ const root = tree.rootNode;
133
+ function runQuery(queryStr) {
134
+ const q = getOrCompileQuery(lang, queryStr);
135
+ return q ? q.matches(root) : [];
136
+ }
137
+ function makeSymbolId(kind, name, line) {
138
+ return `${filePath}#${kind}:${name}:${line}`;
139
+ }
140
+ // ── Extract symbol definitions ──
141
+ for (const { key, kind } of SYMBOL_QUERY_TYPES) {
142
+ const queryStr = spec.queries[key];
143
+ if (!queryStr)
144
+ continue;
145
+ for (const match of runQuery(queryStr)) {
146
+ const name = captureText(match, 'name');
147
+ const defNode = captureNode(match, 'def');
148
+ if (!name || !defNode)
149
+ continue;
150
+ const sym = {
151
+ id: makeSymbolId(kind, name, defNode.startPosition.row + 1),
152
+ name,
153
+ kind,
154
+ filePath,
155
+ startLine: defNode.startPosition.row + 1,
156
+ endLine: defNode.endPosition.row + 1,
157
+ exported: false,
158
+ };
159
+ // For methods, find parent class/struct/trait
160
+ if (kind === 'method') {
161
+ const parentClass = symbols.find(s => CONTAINER_KINDS.has(s.kind) &&
162
+ s.startLine <= sym.startLine && s.endLine >= sym.endLine);
163
+ if (parentClass)
164
+ sym.parentId = parentClass.id;
165
+ }
166
+ symbols.push(sym);
167
+ }
168
+ }
169
+ // ── Extract exports ──
170
+ if (spec.queries.exports) {
171
+ for (const match of runQuery(spec.queries.exports)) {
172
+ const name = captureText(match, 'name');
173
+ if (name)
174
+ exportedNames.add(name);
175
+ }
176
+ }
177
+ // Mark exported symbols
178
+ for (const sym of symbols) {
179
+ if (exportedNames.has(sym.name))
180
+ sym.exported = true;
181
+ }
182
+ // ── Extract imports ──
183
+ if (spec.queries.imports) {
184
+ for (const match of runQuery(spec.queries.imports)) {
185
+ const source = captureText(match, 'source');
186
+ const defNode = captureNode(match, 'def');
187
+ if (!source || !defNode)
188
+ continue;
189
+ const cleanSource = source.replace(/^['"]|['"]$/g, '');
190
+ const names = collectImportNames(defNode);
191
+ imports.push({
192
+ filePath,
193
+ modulePath: cleanSource,
194
+ names,
195
+ isDefault: false,
196
+ isWildcard: names.length === 0,
197
+ line: defNode.startPosition.row + 1,
198
+ });
199
+ }
200
+ }
201
+ // ── Extract calls (with span index for fast enclosing lookup) ──
202
+ if (spec.queries.calls) {
203
+ const spans = buildSpanIndex(symbols);
204
+ for (const match of runQuery(spec.queries.calls)) {
205
+ const callee = captureText(match, 'callee');
206
+ const defNode = captureNode(match, 'def');
207
+ if (!callee || !defNode)
208
+ continue;
209
+ const callLine = defNode.startPosition.row + 1;
210
+ const receiver = captureText(match, 'receiver');
211
+ calls.push({
212
+ filePath,
213
+ enclosingSymbolId: findEnclosing(spans, callLine) ?? `${filePath}#module:_top:0`,
214
+ calleeName: callee,
215
+ receiver,
216
+ line: callLine,
217
+ });
218
+ }
219
+ }
220
+ // ── Extract heritage (extends/implements) ──
221
+ if (spec.queries.heritage) {
222
+ for (const match of runQuery(spec.queries.heritage)) {
223
+ const child = captureText(match, 'child');
224
+ const parentNode = captureNode(match, 'parent');
225
+ if (!child || !parentNode)
226
+ continue;
227
+ const defNode = captureNode(match, 'def');
228
+ heritage.push({
229
+ filePath,
230
+ childName: child,
231
+ parentName: parentNode.text,
232
+ type: detectHeritageType(parentNode),
233
+ line: defNode?.startPosition.row ? defNode.startPosition.row + 1 : 0,
234
+ });
235
+ }
236
+ }
237
+ return { symbols, imports, calls, heritage, exportedNames };
238
+ }
239
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/parser/extract.ts"],"names":[],"mappings":"AAyBA,uEAAuE;AACvE,iFAAiF;AACjF,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAC;AAE1D,SAAS,iBAAiB,CAAC,IAAqB,EAAE,QAAgB;IAChE,oGAAoG;IACpG,MAAM,QAAQ,GAAG,GAAI,IAAY,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC;IACvE,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/B,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,UAAU,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC;AAED,qDAAqD;AAErD,SAAS,WAAW,CAAC,KAAwB,EAAE,WAAmB;IAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACrE,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAwB,EAAE,WAAmB;IAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,CAAC;AACH,CAAC;AAED,wCAAwC;AAExC,SAAS,kBAAkB,CAAC,OAA0B;IACpD,MAAM,KAAK,GAA4C,EAAE,CAAC;IAC1D,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,IAAuB,EAAE,GAA4C;IAC5F,kCAAkC;IAClC,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IACD,kEAAkE;IAClE,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,eAAe,EAAE,CAAC;QACxE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,sCAAsC;IACtC,IAAI,IAAI,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;YAClC,IAAI,KAAK,KAAK,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC;gBAAE,SAAS;YAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;iBAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACzC,MAAM,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBAC3C,IAAI,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IACD,oEAAoE;IACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,kDAAkD;AAElD,SAAS,kBAAkB,CAAC,IAAuB;IACjD,IAAI,GAAG,GAA6B,IAAI,CAAC,MAAM,CAAC;IAChD,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,mBAAmB,IAAI,CAAC,KAAK,kBAAkB,IAAI,CAAC,KAAK,wBAAwB,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC;YACjH,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,KAAK,gBAAgB,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,aAAa,EAAE,CAAC;YACxE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAMD,SAAS,cAAc,CAAC,OAAqB;IAC3C,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACpH,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,6EAA6E;IAC7E,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,IAAY;IAChD,2EAA2E;IAC3E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,EAAE,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,IAAI,IAAI;YAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,6CAA6C;AAE7C,MAAM,kBAAkB,GAAwE;IAC9F,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE;IACtC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;IACjC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;IAClC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE;IACxC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;IAC9B,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;IAClC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;CACjC,CAAC;AAEF,iDAAiD;AACjD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1E,mCAAmC;AAEnC,MAAM,UAAU,eAAe,CAC7B,IAAiB,EACjB,IAAqB,EACrB,IAAc,EACd,QAAgB;IAEhB,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;IAE3B,SAAS,QAAQ,CAAC,QAAgB;QAChC,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClC,CAAC;IAED,SAAS,YAAY,CAAC,IAAgB,EAAE,IAAY,EAAE,IAAY;QAChE,OAAO,GAAG,QAAQ,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,mCAAmC;IAEnC,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,kBAAkB,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEhC,MAAM,GAAG,GAAe;gBACtB,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;gBAC3D,IAAI;gBACJ,IAAI;gBACJ,QAAQ;gBACR,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC;gBACxC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;gBACpC,QAAQ,EAAE,KAAK;aAChB,CAAC;YAEF,8CAA8C;YAC9C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC3B,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAC9D,CAAC;gBACF,IAAI,WAAW;oBAAE,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC;YACjD,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,wBAAwB;IAExB,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACxC,IAAI,IAAI;gBAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvD,CAAC;IAED,wBAAwB;IAExB,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;gBAAE,SAAS;YAElC,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAE1C,OAAO,CAAC,IAAI,CAAC;gBACX,QAAQ;gBACR,UAAU,EAAE,WAAW;gBACvB,KAAK;gBACL,SAAS,EAAE,KAAK;gBAChB,UAAU,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC;gBAC9B,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,kEAAkE;IAElE,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAEtC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;gBAAE,SAAS;YAElC,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAEhD,KAAK,CAAC,IAAI,CAAC;gBACT,QAAQ;gBACR,iBAAiB,EAAE,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,GAAG,QAAQ,gBAAgB;gBAChF,UAAU,EAAE,MAAM;gBAClB,QAAQ;gBACR,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,8CAA8C;IAE9C,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAChD,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU;gBAAE,SAAS;YAEpC,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC;gBACZ,QAAQ;gBACR,SAAS,EAAE,KAAK;gBAChB,UAAU,EAAE,UAAU,CAAC,IAAI;gBAC3B,IAAI,EAAE,kBAAkB,CAAC,UAAU,CAAC;gBACpC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aACrE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { LangSpec } from './extract.js';
2
+ declare const spec: LangSpec;
3
+ export default spec;
4
+ //# sourceMappingURL=lang-go.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lang-go.d.ts","sourceRoot":"","sources":["../../src/parser/lang-go.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,QAAA,MAAM,IAAI,EAAE,QAsCX,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { join, relative } from 'node:path';
2
+ import { existsSync } from 'node:fs';
3
+ const spec = {
4
+ id: 'go',
5
+ extensions: ['.go'],
6
+ wasmName: 'tree-sitter-go',
7
+ queries: {
8
+ functions: `(function_declaration name: (identifier) @name) @def`,
9
+ methods: `(method_declaration
10
+ name: (field_identifier) @name
11
+ ) @def`,
12
+ structs: `(type_declaration
13
+ (type_spec
14
+ name: (type_identifier) @name
15
+ type: (struct_type)
16
+ )
17
+ ) @def`,
18
+ interfaces: `(type_declaration
19
+ (type_spec
20
+ name: (type_identifier) @name
21
+ type: (interface_type)
22
+ )
23
+ ) @def`,
24
+ imports: `(import_spec
25
+ path: (interpreted_string_literal) @source
26
+ ) @def`,
27
+ calls: `
28
+ (call_expression function: (identifier) @callee) @def
29
+ (call_expression function: (selector_expression field: (field_identifier) @callee)) @def
30
+ `,
31
+ },
32
+ resolveImport(raw, fromFile, root, _aliases) {
33
+ // Go imports are package paths — only resolve local packages
34
+ const cleanPath = raw.replace(/^"|"$/g, '');
35
+ if (cleanPath.includes('.'))
36
+ return null; // external module
37
+ // Local package: look for directory under root
38
+ const pkgDir = join(root, cleanPath);
39
+ if (existsSync(pkgDir))
40
+ return relative(root, pkgDir).replace(/\\/g, '/');
41
+ return null;
42
+ },
43
+ };
44
+ export default spec;
45
+ //# sourceMappingURL=lang-go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lang-go.js","sourceRoot":"","sources":["../../src/parser/lang-go.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAW,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,MAAM,IAAI,GAAa;IACrB,EAAE,EAAE,IAAI;IACR,UAAU,EAAE,CAAC,KAAK,CAAC;IACnB,QAAQ,EAAE,gBAAgB;IAC1B,OAAO,EAAE;QACP,SAAS,EAAE,sDAAsD;QACjE,OAAO,EAAE;;WAEF;QACP,OAAO,EAAE;;;;;WAKF;QACP,UAAU,EAAE;;;;;WAKL;QACP,OAAO,EAAE;;WAEF;QACP,KAAK,EAAE;;;KAGN;KACF;IACD,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;QACzC,6DAA6D;QAC7D,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,kBAAkB;QAC5D,+CAA+C;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACrC,IAAI,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { LangSpec } from './extract.js';
2
+ declare const spec: LangSpec;
3
+ export default spec;
4
+ //# sourceMappingURL=lang-java.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lang-java.d.ts","sourceRoot":"","sources":["../../src/parser/lang-java.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,QAAA,MAAM,IAAI,EAAE,QAuCX,CAAC;AAEF,eAAe,IAAI,CAAC"}