@nithin554/code-crawler 0.1.36 → 0.1.37

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.
@@ -1,3 +1,4 @@
1
+ import { annotationNodeId } from "./schema.js";
1
2
  function nodeToRef(node) {
2
3
  return {
3
4
  id: node.id,
@@ -11,6 +12,18 @@ function nodeToRef(node) {
11
12
  function resolveNode(store, symbol) {
12
13
  return store.getNode(symbol) ?? store.getNodeByQualifiedName(symbol);
13
14
  }
15
+ /** Edge kinds a traversal should follow, ordered from most to least certain. */
16
+ export function traversalEdgeKinds(opts = {}) {
17
+ const kinds = ["CALLS"];
18
+ if (opts.includeDynamic)
19
+ kinds.push("DYNAMIC_DISPATCH");
20
+ if (opts.includeAdvice)
21
+ kinds.push("ADVISES");
22
+ return kinds;
23
+ }
24
+ function sqlKinds(kinds) {
25
+ return kinds.map((k) => `'${k}'`).join(",");
26
+ }
14
27
  /**
15
28
  * Find every symbol that calls the given symbol, directly or transitively.
16
29
  * Each row includes the edge chain depth so clients can render a call tree.
@@ -22,42 +35,51 @@ export function getCallers(store, symbol, opts = {}) {
22
35
  const transitive = opts.transitive ?? true;
23
36
  const maxDepth = Math.max(1, opts.maxDepth ?? store.maxDepth ?? 10);
24
37
  const limit = opts.limit ?? 100;
38
+ const kinds = traversalEdgeKinds(opts);
25
39
  if (!transitive) {
26
- const rows = store.raw(`SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties, e.properties AS edge_props
40
+ const rows = store.raw(`SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties,
41
+ e.properties AS edge_props, e.kind AS edge_kind
27
42
  FROM edges e
28
43
  JOIN nodes n ON n.id = e.source
29
- WHERE e.target = ? AND e.kind = 'CALLS'
30
- ORDER BY e.source
31
- LIMIT ?`, symbol, limit);
44
+ WHERE e.target = ? AND e.kind IN (${sqlKinds(kinds)})
45
+ ORDER BY e.kind, e.source
46
+ LIMIT ?`, target.id, limit);
32
47
  return {
33
48
  target: nodeToRef(target),
34
49
  callers: rows.map((r) => ({
35
50
  caller: rowToRef(r),
36
51
  depth: 1,
37
52
  callSiteLine: edgeLine(r.edge_props),
53
+ edgeKind: r.edge_kind,
38
54
  })),
39
55
  };
40
56
  }
41
- const rows = store.raw(`WITH RECURSIVE callers(id, depth, path) AS (
42
- SELECT e.source, 1, e.source || '/' || e.target
57
+ const rows = store.raw(`WITH RECURSIVE callers(id, depth, path, edge_kind, edge_props) AS (
58
+ SELECT e.source, 1, e.source || '/' || e.target, e.kind, e.properties
43
59
  FROM edges e
44
- WHERE e.target = ? AND e.kind = 'CALLS'
60
+ WHERE e.target = ? AND e.kind IN (${sqlKinds(kinds)})
45
61
  UNION ALL
46
- SELECT e.source, c.depth + 1, c.path || '/' || e.source
62
+ SELECT e.source, c.depth + 1, c.path || '/' || e.source, e.kind, e.properties
47
63
  FROM edges e
48
64
  JOIN callers c ON e.target = c.id
49
- WHERE e.kind = 'CALLS'
65
+ WHERE e.kind IN (${sqlKinds(kinds)})
50
66
  AND c.depth < ?
51
- AND e.source || '/' || e.target NOT LIKE c.path || '/%'
67
+ AND instr('|' || c.path || '|', '|' || e.source || '|') = 0
52
68
  )
53
- SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties, c.depth
69
+ SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties,
70
+ c.depth, c.edge_kind, c.edge_props
54
71
  FROM callers c
55
72
  JOIN nodes n ON n.id = c.id
56
73
  ORDER BY c.depth, n.id
57
- LIMIT ?`, symbol, maxDepth, limit);
74
+ LIMIT ?`, target.id, maxDepth, limit);
58
75
  return {
59
76
  target: nodeToRef(target),
60
- callers: rows.map((r) => ({ caller: rowToRef(r), depth: r.depth })),
77
+ callers: rows.map((r) => ({
78
+ caller: rowToRef(r),
79
+ depth: r.depth,
80
+ callSiteLine: edgeLine(r.edge_props),
81
+ edgeKind: r.edge_kind,
82
+ })),
61
83
  };
62
84
  }
63
85
  /**
@@ -70,47 +92,56 @@ export function getCallees(store, symbol, opts = {}) {
70
92
  const transitive = opts.transitive ?? true;
71
93
  const maxDepth = Math.max(1, opts.maxDepth ?? store.maxDepth ?? 10);
72
94
  const limit = opts.limit ?? 100;
95
+ const kinds = traversalEdgeKinds(opts);
73
96
  if (!transitive) {
74
- const rows = store.raw(`SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties, e.properties AS edge_props
97
+ const rows = store.raw(`SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties,
98
+ e.properties AS edge_props, e.kind AS edge_kind
75
99
  FROM edges e
76
100
  JOIN nodes n ON n.id = e.target
77
- WHERE e.source = ? AND e.kind = 'CALLS'
78
- ORDER BY e.target
79
- LIMIT ?`, symbol, limit);
101
+ WHERE e.source = ? AND e.kind IN (${sqlKinds(kinds)})
102
+ ORDER BY e.kind, e.target
103
+ LIMIT ?`, source.id, limit);
80
104
  return {
81
105
  source: nodeToRef(source),
82
106
  callees: rows.map((r) => ({
83
107
  callee: rowToRef(r),
84
108
  depth: 1,
85
109
  callSiteLine: edgeLine(r.edge_props),
110
+ edgeKind: r.edge_kind,
86
111
  })),
87
112
  };
88
113
  }
89
- const rows = store.raw(`WITH RECURSIVE callees(id, depth, path) AS (
90
- SELECT e.target, 1, e.source || '/' || e.target
114
+ const rows = store.raw(`WITH RECURSIVE callees(id, depth, path, edge_kind, edge_props) AS (
115
+ SELECT e.target, 1, e.source || '/' || e.target, e.kind, e.properties
91
116
  FROM edges e
92
- WHERE e.source = ? AND e.kind = 'CALLS'
117
+ WHERE e.source = ? AND e.kind IN (${sqlKinds(kinds)})
93
118
  UNION ALL
94
- SELECT e.target, c.depth + 1, c.path || '/' || e.target
119
+ SELECT e.target, c.depth + 1, c.path || '/' || e.target, e.kind, e.properties
95
120
  FROM edges e
96
121
  JOIN callees c ON e.source = c.id
97
- WHERE e.kind = 'CALLS'
122
+ WHERE e.kind IN (${sqlKinds(kinds)})
98
123
  AND c.depth < ?
99
- AND e.source || '/' || e.target NOT LIKE c.path || '/%'
124
+ AND instr('|' || c.path || '|', '|' || e.target || '|') = 0
100
125
  )
101
- SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties, c.depth
126
+ SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties,
127
+ c.depth, c.edge_kind, c.edge_props
102
128
  FROM callees c
103
129
  JOIN nodes n ON n.id = c.id
104
130
  ORDER BY c.depth, n.id
105
- LIMIT ?`, symbol, maxDepth, limit);
131
+ LIMIT ?`, source.id, maxDepth, limit);
106
132
  return {
107
133
  source: nodeToRef(source),
108
- callees: rows.map((r) => ({ callee: rowToRef(r), depth: r.depth })),
134
+ callees: rows.map((r) => ({
135
+ callee: rowToRef(r),
136
+ depth: r.depth,
137
+ callSiteLine: edgeLine(r.edge_props),
138
+ edgeKind: r.edge_kind,
139
+ })),
109
140
  };
110
141
  }
111
142
  /**
112
- * Find up to `limit` static call paths between two symbols.
113
- * BFS over CALLS edges so the shortest paths come first.
143
+ * Find up to `limit` call paths between two symbols.
144
+ * BFS over the selected edge kinds so the shortest paths come first.
114
145
  */
115
146
  export function tracePath(store, from, to, opts = {}) {
116
147
  const start = resolveNode(store, from);
@@ -119,16 +150,19 @@ export function tracePath(store, from, to, opts = {}) {
119
150
  return null;
120
151
  const maxDepth = Math.max(1, opts.maxDepth ?? store.maxDepth ?? 10);
121
152
  const limit = opts.limit ?? 10;
153
+ const kinds = sqlKinds(traversalEdgeKinds(opts));
122
154
  // BFS in SQL via recursive CTE that accumulates the path taken.
123
155
  const rows = store.raw(`WITH RECURSIVE paths(id, depth, path, edge_path) AS (
124
- SELECT e.target, 1, e.source || '/' || e.target, e.source || '/' || e.target
156
+ SELECT e.target, 1, e.source || '/' || e.target,
157
+ e.source || '>' || e.target || '>' || e.kind
125
158
  FROM edges e
126
- WHERE e.source = ? AND e.kind = 'CALLS'
159
+ WHERE e.source = ? AND e.kind IN (${kinds})
127
160
  UNION ALL
128
- SELECT e.target, p.depth + 1, p.path || '/' || e.target, p.edge_path || '|' || e.source || '/' || e.target
161
+ SELECT e.target, p.depth + 1, p.path || '/' || e.target,
162
+ p.edge_path || '|' || e.source || '>' || e.target || '>' || e.kind
129
163
  FROM edges e
130
164
  JOIN paths p ON e.source = p.id
131
- WHERE e.kind = 'CALLS'
165
+ WHERE e.kind IN (${kinds})
132
166
  AND p.depth < ?
133
167
  AND instr('|' || p.path || '|', '|' || e.target || '|') = 0
134
168
  )
@@ -136,16 +170,94 @@ export function tracePath(store, from, to, opts = {}) {
136
170
  FROM paths
137
171
  WHERE id = ?
138
172
  ORDER BY depth
139
- LIMIT ?`, from, maxDepth, to, limit);
173
+ LIMIT ?`, start.id, maxDepth, goal.id, limit);
140
174
  return rows.map((r) => {
141
175
  const ids = r.path.split("/");
142
- const edges = r.edge_path.split("|").map((pair) => {
143
- const [src, tgt] = pair.split("/");
144
- return { source: src ?? "", target: tgt ?? "" };
176
+ const edges = r.edge_path.split("|").map((triple) => {
177
+ const [src, tgt, kind, ...rest] = triple.split(">");
178
+ // Method ids may contain '>'? No, node ids use type#method and $field.
179
+ void rest;
180
+ const edge = {
181
+ source: src ?? "",
182
+ target: tgt ?? "",
183
+ kind: kind ?? undefined,
184
+ callSiteLine: undefined,
185
+ resolved: undefined,
186
+ };
187
+ const props = store.raw("SELECT properties FROM edges WHERE source = ? AND target = ? AND kind = ? LIMIT 1", edge.source, edge.target, edge.kind);
188
+ const parsed = props[0]
189
+ ? JSON.parse(props[0].properties)
190
+ : undefined;
191
+ edge.callSiteLine = parsed?.line;
192
+ edge.resolved = parsed?.resolved;
193
+ return edge;
145
194
  });
146
195
  return { path: ids, length: r.depth, edges };
147
196
  });
148
197
  }
198
+ /**
199
+ * Dynamic execution trace: follows static + virtual dispatch edges and weaves
200
+ * in aspect advice. When a call reaches an advised method, the advice method
201
+ * is visited first (an `INTERCEPT` edge), then the method itself.
202
+ */
203
+ export function traceExecution(store, symbol, opts = {}) {
204
+ const root = resolveNode(store, symbol);
205
+ if (!root)
206
+ return null;
207
+ const includeDynamic = opts.includeDynamic ?? true;
208
+ const includeAdvice = opts.includeAdvice ?? true;
209
+ const maxDepth = Math.max(1, opts.maxDepth ?? store.maxDepth ?? 10);
210
+ const limit = opts.limit ?? 200;
211
+ const baseKinds = ["CALLS"];
212
+ if (includeDynamic)
213
+ baseKinds.push("DYNAMIC_DISPATCH");
214
+ const base = sqlKinds(baseKinds);
215
+ // Advice intercepts an advised method, so the woven hop runs
216
+ // advised-method -> advice-method. ADVISES itself is a relation, not a call,
217
+ // and must not be traversed as an ordinary edge.
218
+ const interceptJoin = includeAdvice
219
+ ? `UNION ALL
220
+ SELECT a.target, a.source, 'INTERCEPT', a.properties, 0
221
+ FROM edges a
222
+ WHERE a.kind = 'ADVISES'`
223
+ : "";
224
+ const rows = store.raw(`WITH RECURSIVE flow(source, target, kind, properties, advice_hop) AS (
225
+ SELECT source, target, kind, properties, 0 FROM edges WHERE kind IN (${base})
226
+ ${interceptJoin}
227
+ ),
228
+ walk(id, depth, path, parent, via, properties) AS (
229
+ SELECT ?, 0, ?, NULL, NULL, NULL
230
+ UNION ALL
231
+ SELECT f.target, w.depth + 1, w.path || '/' || f.target, w.id, f.kind, f.properties
232
+ FROM flow f
233
+ JOIN walk w ON f.source = w.id
234
+ WHERE w.depth < ?
235
+ AND instr('|' || w.path || '|', '|' || f.target || '|') = 0
236
+ )
237
+ SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties,
238
+ w.depth, w.via, w.properties AS step_props
239
+ FROM walk w
240
+ JOIN nodes n ON n.id = w.id
241
+ WHERE w.depth > 0
242
+ ORDER BY w.depth, n.id
243
+ LIMIT ?`, root.id, root.id, maxDepth, limit);
244
+ // Multiple runtime paths can reach the same symbol; report it once at the
245
+ // shallowest depth so the trace reads as execution order, not all paths.
246
+ const seen = new Set();
247
+ const steps = [];
248
+ for (const r of rows) {
249
+ if (seen.has(r.id))
250
+ continue;
251
+ seen.add(r.id);
252
+ steps.push({
253
+ symbol: rowToRef(r),
254
+ depth: r.depth,
255
+ via: r.via ?? undefined,
256
+ callSiteLine: edgeLine(r.step_props ?? undefined),
257
+ });
258
+ }
259
+ return { root: nodeToRef(root), steps };
260
+ }
149
261
  /**
150
262
  * Extract the neighborhood around a symbol (any edge kinds), useful for
151
263
  * visualization and for letting an LLM see the local shape of the graph.
@@ -155,7 +267,19 @@ export function getSubgraph(store, symbol, opts = {}) {
155
267
  if (!center)
156
268
  return { center: null, nodes: [], edges: [] };
157
269
  const radius = Math.max(1, opts.radius ?? 2);
158
- const edgeKinds = opts.edgeKinds ?? ["CALLS", "DECLARED_IN", "CONTAINS", "EXTENDS", "IMPLEMENTS", "REFERENCES", "IMPORTS"];
270
+ const edgeKinds = opts.edgeKinds ??
271
+ [
272
+ "CALLS",
273
+ "DYNAMIC_DISPATCH",
274
+ "ADVISES",
275
+ "DECLARED_IN",
276
+ "CONTAINS",
277
+ "EXTENDS",
278
+ "IMPLEMENTS",
279
+ "ANNOTATED_WITH",
280
+ "REFERENCES",
281
+ "IMPORTS",
282
+ ];
159
283
  const limit = opts.limit ?? 500;
160
284
  const kinds = edgeKinds.map((k) => `'${k}'`).join(",");
161
285
  const rows = store.raw(`WITH RECURSIVE reach(id, depth) AS (
@@ -175,7 +299,7 @@ export function getSubgraph(store, symbol, opts = {}) {
175
299
  FROM reach r
176
300
  JOIN nodes n ON n.id = r.id
177
301
  ORDER BY r.depth, n.id
178
- LIMIT ?`, symbol, radius, radius, limit);
302
+ LIMIT ?`, center.id, radius, radius, limit);
179
303
  const nodes = rows.map(rowToRef);
180
304
  const ids = nodes.map((n) => n.id);
181
305
  if (ids.length === 0)
@@ -223,10 +347,11 @@ export function searchSymbols(store, query, opts = {}) {
223
347
  ELSE 2 END,
224
348
  n.qualified_name
225
349
  LIMIT ?`, ...params);
226
- // Re-rank: exact-qualified-name matches first.
350
+ // Re-rank: exact name matches first, then keep alphabetical ordering so the
351
+ // SQL ordering is not silently discarded.
227
352
  return rows
228
353
  .map((r) => rowToRef(r))
229
- .sort((a, b) => rank(a, q) - rank(b, q));
354
+ .sort((a, b) => rank(a, q) - rank(b, q) || a.qualifiedName.localeCompare(b.qualifiedName));
230
355
  }
231
356
  function rank(ref, q) {
232
357
  if (ref.qualifiedName.toLowerCase() === q)
@@ -247,6 +372,227 @@ export function suggestSymbols(store, symbol, limit = 8) {
247
372
  const best = tokens[0] ?? symbol.slice(-20);
248
373
  return searchSymbols(store, best, { limit });
249
374
  }
375
+ /**
376
+ * Find every type that implements/extends a given interface or superclass,
377
+ * directly or transitively.
378
+ */
379
+ export function findImplementations(store, symbol, opts = {}) {
380
+ const target = resolveNode(store, symbol);
381
+ if (!target)
382
+ return null;
383
+ const maxDepth = Math.max(1, opts.maxDepth ?? store.maxDepth ?? 10);
384
+ const limit = opts.limit ?? 100;
385
+ const rows = store.raw(`WITH RECURSIVE impl(id, depth, path, via) AS (
386
+ SELECT e.source, 1, e.source || '/' || e.target, e.kind
387
+ FROM edges e
388
+ WHERE e.target = ? AND e.kind IN ('EXTENDS', 'IMPLEMENTS')
389
+ UNION ALL
390
+ SELECT e.source, i.depth + 1, i.path || '/' || e.source, e.kind
391
+ FROM edges e
392
+ JOIN impl i ON e.target = i.id
393
+ WHERE e.kind IN ('EXTENDS', 'IMPLEMENTS')
394
+ AND i.depth < ?
395
+ AND instr('|' || i.path || '|', '|' || e.source || '|') = 0
396
+ )
397
+ SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties,
398
+ i.depth, i.via
399
+ FROM impl i
400
+ JOIN nodes n ON n.id = i.id
401
+ WHERE n.kind IN ('class', 'interface', 'enum', 'aspect', 'annotation_type')
402
+ ORDER BY i.depth, n.qualified_name
403
+ LIMIT ?`, target.id, maxDepth, limit);
404
+ return {
405
+ target: nodeToRef(target),
406
+ implementations: rows.map((r) => ({
407
+ type: rowToRef(r),
408
+ depth: r.depth,
409
+ via: r.via,
410
+ })),
411
+ };
412
+ }
413
+ /** List aspects, their advice methods, and the methods each advice intercepts. */
414
+ export function getAspects(store, opts = {}) {
415
+ const limit = opts.limit ?? store.defaultLimit ?? 50;
416
+ const aspectRows = store.raw(`SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties
417
+ FROM nodes n
418
+ WHERE n.kind = 'aspect'
419
+ ORDER BY n.qualified_name
420
+ LIMIT ?`, limit);
421
+ return aspectRows.map((row) => {
422
+ const aspect = rowToRef(row);
423
+ const members = store.raw(`SELECT m.id, m.qualified_name, m.kind, m.file_path, m.properties
424
+ FROM edges e
425
+ JOIN nodes m ON m.id = e.target
426
+ WHERE e.source = ? AND e.kind = 'CONTAINS'
427
+ AND m.kind = 'method'
428
+ ORDER BY m.qualified_name`, aspect.id);
429
+ const advice = [];
430
+ for (const member of members) {
431
+ const props = JSON.parse(member.properties);
432
+ const advisedRows = store.raw(`SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties
433
+ FROM edges e
434
+ JOIN nodes n ON n.id = e.target
435
+ WHERE e.source = ? AND e.kind = 'ADVISES'
436
+ ORDER BY n.qualified_name`, member.id);
437
+ if (!props.adviceKind && advisedRows.length === 0)
438
+ continue;
439
+ advice.push({
440
+ method: rowToRef(member),
441
+ adviceKind: props.adviceKind,
442
+ pointcut: props.pointcut,
443
+ advised: advisedRows.map(rowToRef),
444
+ });
445
+ }
446
+ return { aspect, advice };
447
+ });
448
+ }
449
+ function decoratorsFor(store, ids) {
450
+ if (ids.length === 0)
451
+ return [];
452
+ const placeholders = ids.map(() => "?").join(",");
453
+ const rows = store.raw(`SELECT a.qualified_name, a.properties AS ann_props, e.properties AS edge_props
454
+ FROM edges e
455
+ JOIN nodes a ON a.id = e.target
456
+ WHERE e.kind = 'ANNOTATED_WITH' AND e.source IN (${placeholders})
457
+ ORDER BY a.qualified_name`, ...ids);
458
+ return rows.map((r) => {
459
+ const ann = JSON.parse(r.ann_props);
460
+ const edge = JSON.parse(r.edge_props);
461
+ return {
462
+ name: ann.name ?? r.qualified_name,
463
+ fqn: ann.fqn,
464
+ decorator: ann.decorator ?? false,
465
+ line: edge.line,
466
+ arguments: edge.arguments ?? [],
467
+ };
468
+ });
469
+ }
470
+ /**
471
+ * Decorators/annotations applied to a symbol, optionally including the
472
+ * annotations on its declared members (methods, constructors, fields).
473
+ */
474
+ export function getDecorators(store, symbol, opts = {}) {
475
+ const node = resolveNode(store, symbol);
476
+ if (!node)
477
+ return null;
478
+ const decorators = decoratorsFor(store, [node.id]);
479
+ if (!opts.includeMembers)
480
+ return { symbol: nodeToRef(node), decorators, members: [] };
481
+ const memberRows = store.raw(`SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties
482
+ FROM edges e
483
+ JOIN nodes n ON n.id = e.target
484
+ WHERE e.source = ? AND e.kind = 'CONTAINS'
485
+ AND n.kind IN ('method', 'constructor', 'field')
486
+ ORDER BY n.qualified_name`, node.id);
487
+ return {
488
+ symbol: nodeToRef(node),
489
+ decorators,
490
+ members: memberRows
491
+ .map((row) => {
492
+ const ref = rowToRef(row);
493
+ return { symbol: ref, decorators: decoratorsFor(store, [ref.id]) };
494
+ })
495
+ .filter((m) => m.decorators.length > 0),
496
+ };
497
+ }
498
+ /**
499
+ * Find every symbol annotated/decorated with the given annotation. Accepts a
500
+ * simple name (`Transactional`), a node id (`@Transactional`) or an FQN.
501
+ */
502
+ export function findAnnotated(store, annotation, opts = {}) {
503
+ const trimmed = annotation.trim();
504
+ if (!trimmed)
505
+ return [];
506
+ const name = trimmed.startsWith("@") ? trimmed.slice(1) : trimmed;
507
+ const limit = opts.limit ?? store.defaultLimit ?? 50;
508
+ const kindClause = opts.kind ? "AND n.kind = ?" : "";
509
+ const params = [
510
+ annotationNodeId(name),
511
+ name,
512
+ `%.${name}`,
513
+ `%"name":"${name}"%`,
514
+ ];
515
+ if (opts.kind)
516
+ params.push(opts.kind);
517
+ params.push(limit);
518
+ const rows = store.raw(`SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties,
519
+ a.properties AS ann_props, e.properties AS edge_props
520
+ FROM edges e
521
+ JOIN nodes n ON n.id = e.source
522
+ JOIN nodes a ON a.id = e.target
523
+ WHERE e.kind = 'ANNOTATED_WITH'
524
+ AND (a.id = ? OR a.qualified_name = ? OR a.qualified_name LIKE ? OR LOWER(a.properties) LIKE LOWER(?))
525
+ ${kindClause}
526
+ ORDER BY n.qualified_name
527
+ LIMIT ?`, ...params);
528
+ return rows.map((r) => {
529
+ const ann = JSON.parse(r.ann_props);
530
+ const edge = JSON.parse(r.edge_props);
531
+ return {
532
+ symbol: rowToRef(r),
533
+ annotation: { name: ann.name ?? name, fqn: ann.fqn },
534
+ line: edge.line,
535
+ arguments: edge.arguments ?? [],
536
+ };
537
+ });
538
+ }
539
+ /** Rank callable symbols by incoming/outgoing call volume. */
540
+ export function hotspots(store, opts = {}) {
541
+ const limit = opts.limit ?? store.defaultLimit ?? 50;
542
+ const minFanIn = opts.minFanIn ?? 0;
543
+ const kinds = sqlKinds(traversalEdgeKinds({ includeDynamic: opts.includeDynamic ?? true }));
544
+ const rows = store.raw(`SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties,
545
+ (SELECT COUNT(DISTINCT e.source) FROM edges e
546
+ WHERE e.target = n.id AND e.kind IN (${kinds})) AS fan_in,
547
+ (SELECT COUNT(DISTINCT e.target) FROM edges e
548
+ WHERE e.source = n.id AND e.kind IN (${kinds})) AS fan_out,
549
+ (SELECT COUNT(*) FROM edges e
550
+ WHERE e.target = n.id AND e.kind = 'ADVISES') AS advice_count
551
+ FROM nodes n
552
+ WHERE n.kind IN ('method', 'constructor')
553
+ ORDER BY fan_in DESC, fan_out DESC, n.qualified_name
554
+ LIMIT ?`, limit * 4);
555
+ return rows
556
+ .filter((r) => r.fan_in >= minFanIn)
557
+ .slice(0, limit)
558
+ .map((r) => ({
559
+ symbol: rowToRef(r),
560
+ fanIn: r.fan_in,
561
+ fanOut: r.fan_out,
562
+ adviceCount: r.advice_count,
563
+ }));
564
+ }
565
+ /**
566
+ * Find methods/constructors with no incoming call, dispatch or advice edges.
567
+ * Heuristic: framework entry points, tests and constructors are excluded by
568
+ * default because they are invoked reflectively or by containers.
569
+ */
570
+ export function deadCode(store, opts = {}) {
571
+ const limit = opts.limit ?? store.defaultLimit ?? 50;
572
+ const kinds = sqlKinds(traversalEdgeKinds({ includeDynamic: opts.includeDynamic ?? true }));
573
+ const conditions = [
574
+ "n.kind IN ('method', 'constructor')",
575
+ `NOT EXISTS (
576
+ SELECT 1 FROM edges e
577
+ WHERE e.target = n.id AND e.kind IN (${kinds}, 'ADVISES')
578
+ )`,
579
+ "COALESCE(json_extract(n.properties, '$.name'), '') <> 'main'",
580
+ ];
581
+ if (!opts.includeConstructors)
582
+ conditions.push("n.kind <> 'constructor'");
583
+ if (!opts.includeTests) {
584
+ conditions.push("REPLACE(n.file_path, '\\', '/') NOT LIKE '%/test/%'", "REPLACE(n.file_path, '\\', '/') NOT LIKE '%/tests/%'", "n.qualified_name NOT LIKE '%Test#%'", "n.qualified_name NOT LIKE '%Tests#%'", "n.qualified_name NOT LIKE '%IT#%'");
585
+ }
586
+ const rows = store.raw(`SELECT n.id, n.qualified_name, n.kind, n.file_path, n.properties
587
+ FROM nodes n
588
+ WHERE ${conditions.join(" AND ")}
589
+ ORDER BY n.qualified_name
590
+ LIMIT ?`, limit);
591
+ return rows.map((r) => ({
592
+ symbol: rowToRef(r),
593
+ reason: "no incoming call, dynamic-dispatch or advice edge",
594
+ }));
595
+ }
250
596
  function rowToRef(r) {
251
597
  return {
252
598
  id: r.id,
@@ -1 +1 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/graph/queries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/graph/queries.ts"],"names":[],"mappings":"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"}
@@ -9,12 +9,14 @@
9
9
  * can attach extra metadata (signatures, modifiers, confidence scores) without
10
10
  * schema migrations.
11
11
  */
12
- export declare const NODE_KINDS: readonly ["file", "package", "class", "interface", "enum", "method", "constructor", "field", "import", "unknown_symbol"];
12
+ export declare const NODE_KINDS: readonly ["file", "package", "class", "interface", "enum", "annotation_type", "annotation", "aspect", "method", "constructor", "field", "import", "unknown_symbol"];
13
13
  export type NodeKind = (typeof NODE_KINDS)[number];
14
- export declare const EDGE_KINDS: readonly ["CALLS", "DECLARED_IN", "CONTAINS", "IMPLEMENTS", "EXTENDS", "IMPORTS", "REFERENCES"];
14
+ export declare const EDGE_KINDS: readonly ["CALLS", "DYNAMIC_DISPATCH", "ADVISES", "DECLARED_IN", "CONTAINS", "IMPLEMENTS", "EXTENDS", "IMPORTS", "ANNOTATED_WITH", "REFERENCES"];
15
15
  export type EdgeKind = (typeof EDGE_KINDS)[number];
16
16
  /** Kinds that may appear as call *targets* (nodes at the arrow end of CALLS). */
17
17
  export declare const CALLABLE_KINDS: readonly NodeKind[];
18
+ /** Kinds that can be annotated/decorated. */
19
+ export declare const DECORATABLE_KINDS: readonly NodeKind[];
18
20
  export interface NodeProperties {
19
21
  /** Zero-based line of the declaration start. */
20
22
  startLine?: number;
@@ -24,6 +26,14 @@ export interface NodeProperties {
24
26
  name?: string;
25
27
  /** Fully-qualified name when distinct from the node id. */
26
28
  qualifiedName?: string;
29
+ /** Simple names of annotations/decorators applied to this symbol. */
30
+ annotations?: string[];
31
+ /** True when a class is an aspect (e.g. annotated with `@Aspect`). */
32
+ aspect?: boolean;
33
+ /** For advice methods: before | after | around | afterReturning | afterThrowing. */
34
+ adviceKind?: string;
35
+ /** For advice/pointcut methods: the AspectJ pointcut expression. */
36
+ pointcut?: string;
27
37
  /** Free-form language-specific metadata. */
28
38
  [key: string]: string | number | boolean | (string | number)[] | undefined;
29
39
  }
@@ -43,8 +53,16 @@ export interface EdgeProperties {
43
53
  resolved?: boolean;
44
54
  /** For CALLS edges: heuristic confidence 0..1 when resolved. */
45
55
  confidence?: number;
56
+ /** For DYNAMIC_DISPATCH: why the runtime target was inferred. */
57
+ via?: string;
58
+ /** For ADVISES: the advice kind that intercepts the call. */
59
+ adviceKind?: string;
60
+ /** For ADVISES: the pointcut expression that matched. */
61
+ pointcut?: string;
62
+ /** For ANNOTATED_WITH: raw annotation arguments as written in source. */
63
+ arguments?: string[];
46
64
  /** Free-form language-specific metadata. */
47
- [key: string]: string | number | boolean | undefined;
65
+ [key: string]: string | number | boolean | (string | number)[] | undefined;
48
66
  }
49
67
  export interface GraphEdge {
50
68
  source: string;
@@ -61,3 +79,8 @@ export declare function fieldNodeId(qualifiedType: string, fieldName: string): s
61
79
  export declare function importNodeId(fqn: string): string;
62
80
  /** Fallback id for calls that could not be statically resolved. */
63
81
  export declare function unknownNodeId(qualifiedName: string): string;
82
+ /**
83
+ * Annotation/decorator ids share one node per annotation name so that
84
+ * `find_annotated` and `get_decorators` can pivot across the whole project.
85
+ */
86
+ export declare function annotationNodeId(name: string): string;