@optave/codegraph 3.5.0 → 3.7.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 (346) hide show
  1. package/README.md +47 -21
  2. package/dist/ast-analysis/engine.d.ts.map +1 -1
  3. package/dist/ast-analysis/engine.js +119 -127
  4. package/dist/ast-analysis/engine.js.map +1 -1
  5. package/dist/ast-analysis/visitors/ast-store-visitor.d.ts.map +1 -1
  6. package/dist/ast-analysis/visitors/ast-store-visitor.js +14 -1
  7. package/dist/ast-analysis/visitors/ast-store-visitor.js.map +1 -1
  8. package/dist/ast-analysis/visitors/complexity-visitor.d.ts.map +1 -1
  9. package/dist/ast-analysis/visitors/complexity-visitor.js +11 -13
  10. package/dist/ast-analysis/visitors/complexity-visitor.js.map +1 -1
  11. package/dist/db/connection.d.ts +12 -2
  12. package/dist/db/connection.d.ts.map +1 -1
  13. package/dist/db/connection.js +81 -53
  14. package/dist/db/connection.js.map +1 -1
  15. package/dist/db/index.d.ts +1 -1
  16. package/dist/db/index.d.ts.map +1 -1
  17. package/dist/db/index.js +1 -1
  18. package/dist/db/index.js.map +1 -1
  19. package/dist/db/migrations.d.ts.map +1 -1
  20. package/dist/db/migrations.js +38 -32
  21. package/dist/db/migrations.js.map +1 -1
  22. package/dist/domain/analysis/context.d.ts.map +1 -1
  23. package/dist/domain/analysis/context.js +51 -66
  24. package/dist/domain/analysis/context.js.map +1 -1
  25. package/dist/domain/analysis/dependencies.d.ts.map +1 -1
  26. package/dist/domain/analysis/dependencies.js +62 -70
  27. package/dist/domain/analysis/dependencies.js.map +1 -1
  28. package/dist/domain/analysis/diff-impact.d.ts +9 -7
  29. package/dist/domain/analysis/diff-impact.d.ts.map +1 -1
  30. package/dist/domain/analysis/exports.d.ts.map +1 -1
  31. package/dist/domain/analysis/exports.js +29 -33
  32. package/dist/domain/analysis/exports.js.map +1 -1
  33. package/dist/domain/analysis/fn-impact.d.ts +15 -17
  34. package/dist/domain/analysis/fn-impact.d.ts.map +1 -1
  35. package/dist/domain/analysis/fn-impact.js +35 -65
  36. package/dist/domain/analysis/fn-impact.js.map +1 -1
  37. package/dist/domain/analysis/module-map.d.ts.map +1 -1
  38. package/dist/domain/analysis/module-map.js +91 -6
  39. package/dist/domain/analysis/module-map.js.map +1 -1
  40. package/dist/domain/analysis/query-helpers.d.ts +20 -0
  41. package/dist/domain/analysis/query-helpers.d.ts.map +1 -0
  42. package/dist/domain/analysis/query-helpers.js +27 -0
  43. package/dist/domain/analysis/query-helpers.js.map +1 -0
  44. package/dist/domain/graph/builder/helpers.d.ts.map +1 -1
  45. package/dist/domain/graph/builder/helpers.js +15 -9
  46. package/dist/domain/graph/builder/helpers.js.map +1 -1
  47. package/dist/domain/graph/builder/incremental.d.ts.map +1 -1
  48. package/dist/domain/graph/builder/incremental.js +3 -2
  49. package/dist/domain/graph/builder/incremental.js.map +1 -1
  50. package/dist/domain/graph/builder/pipeline.d.ts.map +1 -1
  51. package/dist/domain/graph/builder/pipeline.js +69 -3
  52. package/dist/domain/graph/builder/pipeline.js.map +1 -1
  53. package/dist/domain/graph/builder/stages/build-edges.d.ts.map +1 -1
  54. package/dist/domain/graph/builder/stages/build-edges.js +7 -51
  55. package/dist/domain/graph/builder/stages/build-edges.js.map +1 -1
  56. package/dist/domain/graph/builder/stages/build-structure.d.ts.map +1 -1
  57. package/dist/domain/graph/builder/stages/build-structure.js +7 -5
  58. package/dist/domain/graph/builder/stages/build-structure.js.map +1 -1
  59. package/dist/domain/graph/builder/stages/collect-files.js +2 -2
  60. package/dist/domain/graph/builder/stages/collect-files.js.map +1 -1
  61. package/dist/domain/graph/builder/stages/detect-changes.d.ts.map +1 -1
  62. package/dist/domain/graph/builder/stages/detect-changes.js +2 -2
  63. package/dist/domain/graph/builder/stages/detect-changes.js.map +1 -1
  64. package/dist/domain/graph/builder/stages/finalize.d.ts.map +1 -1
  65. package/dist/domain/graph/builder/stages/finalize.js +124 -105
  66. package/dist/domain/graph/builder/stages/finalize.js.map +1 -1
  67. package/dist/domain/graph/builder/stages/insert-nodes.d.ts.map +1 -1
  68. package/dist/domain/graph/builder/stages/insert-nodes.js +28 -15
  69. package/dist/domain/graph/builder/stages/insert-nodes.js.map +1 -1
  70. package/dist/domain/graph/builder/stages/resolve-imports.d.ts.map +1 -1
  71. package/dist/domain/graph/builder/stages/resolve-imports.js +3 -2
  72. package/dist/domain/graph/builder/stages/resolve-imports.js.map +1 -1
  73. package/dist/domain/graph/resolve.d.ts +0 -4
  74. package/dist/domain/graph/resolve.d.ts.map +1 -1
  75. package/dist/domain/graph/resolve.js +32 -48
  76. package/dist/domain/graph/resolve.js.map +1 -1
  77. package/dist/domain/graph/watcher.d.ts.map +1 -1
  78. package/dist/domain/graph/watcher.js +12 -12
  79. package/dist/domain/graph/watcher.js.map +1 -1
  80. package/dist/domain/parser.d.ts +1 -1
  81. package/dist/domain/parser.d.ts.map +1 -1
  82. package/dist/domain/parser.js +206 -101
  83. package/dist/domain/parser.js.map +1 -1
  84. package/dist/domain/search/search/cli-formatter.d.ts.map +1 -1
  85. package/dist/domain/search/search/cli-formatter.js +88 -83
  86. package/dist/domain/search/search/cli-formatter.js.map +1 -1
  87. package/dist/extractors/bash.d.ts +6 -0
  88. package/dist/extractors/bash.d.ts.map +1 -0
  89. package/dist/extractors/bash.js +91 -0
  90. package/dist/extractors/bash.js.map +1 -0
  91. package/dist/extractors/c.d.ts +6 -0
  92. package/dist/extractors/c.d.ts.map +1 -0
  93. package/dist/extractors/c.js +204 -0
  94. package/dist/extractors/c.js.map +1 -0
  95. package/dist/extractors/cpp.d.ts +6 -0
  96. package/dist/extractors/cpp.d.ts.map +1 -0
  97. package/dist/extractors/cpp.js +283 -0
  98. package/dist/extractors/cpp.js.map +1 -0
  99. package/dist/extractors/csharp.d.ts.map +1 -1
  100. package/dist/extractors/csharp.js +42 -54
  101. package/dist/extractors/csharp.js.map +1 -1
  102. package/dist/extractors/dart.d.ts +6 -0
  103. package/dist/extractors/dart.d.ts.map +1 -0
  104. package/dist/extractors/dart.js +277 -0
  105. package/dist/extractors/dart.js.map +1 -0
  106. package/dist/extractors/elixir.d.ts +9 -0
  107. package/dist/extractors/elixir.d.ts.map +1 -0
  108. package/dist/extractors/elixir.js +223 -0
  109. package/dist/extractors/elixir.js.map +1 -0
  110. package/dist/extractors/go.d.ts.map +1 -1
  111. package/dist/extractors/go.js +126 -130
  112. package/dist/extractors/go.js.map +1 -1
  113. package/dist/extractors/haskell.d.ts +8 -0
  114. package/dist/extractors/haskell.d.ts.map +1 -0
  115. package/dist/extractors/haskell.js +217 -0
  116. package/dist/extractors/haskell.js.map +1 -0
  117. package/dist/extractors/hcl.js +6 -6
  118. package/dist/extractors/hcl.js.map +1 -1
  119. package/dist/extractors/helpers.d.ts +32 -1
  120. package/dist/extractors/helpers.d.ts.map +1 -1
  121. package/dist/extractors/helpers.js +74 -0
  122. package/dist/extractors/helpers.js.map +1 -1
  123. package/dist/extractors/index.d.ts +12 -0
  124. package/dist/extractors/index.d.ts.map +1 -1
  125. package/dist/extractors/index.js +12 -0
  126. package/dist/extractors/index.js.map +1 -1
  127. package/dist/extractors/java.d.ts.map +1 -1
  128. package/dist/extractors/java.js +32 -47
  129. package/dist/extractors/java.js.map +1 -1
  130. package/dist/extractors/javascript.d.ts.map +1 -1
  131. package/dist/extractors/javascript.js +306 -292
  132. package/dist/extractors/javascript.js.map +1 -1
  133. package/dist/extractors/kotlin.d.ts +6 -0
  134. package/dist/extractors/kotlin.d.ts.map +1 -0
  135. package/dist/extractors/kotlin.js +275 -0
  136. package/dist/extractors/kotlin.js.map +1 -0
  137. package/dist/extractors/lua.d.ts +6 -0
  138. package/dist/extractors/lua.d.ts.map +1 -0
  139. package/dist/extractors/lua.js +162 -0
  140. package/dist/extractors/lua.js.map +1 -0
  141. package/dist/extractors/ocaml.d.ts +6 -0
  142. package/dist/extractors/ocaml.d.ts.map +1 -0
  143. package/dist/extractors/ocaml.js +236 -0
  144. package/dist/extractors/ocaml.js.map +1 -0
  145. package/dist/extractors/php.d.ts.map +1 -1
  146. package/dist/extractors/php.js +39 -44
  147. package/dist/extractors/php.js.map +1 -1
  148. package/dist/extractors/python.d.ts.map +1 -1
  149. package/dist/extractors/python.js +75 -93
  150. package/dist/extractors/python.js.map +1 -1
  151. package/dist/extractors/ruby.js +6 -13
  152. package/dist/extractors/ruby.js.map +1 -1
  153. package/dist/extractors/rust.d.ts.map +1 -1
  154. package/dist/extractors/rust.js +58 -83
  155. package/dist/extractors/rust.js.map +1 -1
  156. package/dist/extractors/scala.d.ts +6 -0
  157. package/dist/extractors/scala.d.ts.map +1 -0
  158. package/dist/extractors/scala.js +269 -0
  159. package/dist/extractors/scala.js.map +1 -0
  160. package/dist/extractors/swift.d.ts +6 -0
  161. package/dist/extractors/swift.d.ts.map +1 -0
  162. package/dist/extractors/swift.js +275 -0
  163. package/dist/extractors/swift.js.map +1 -0
  164. package/dist/extractors/zig.d.ts +9 -0
  165. package/dist/extractors/zig.d.ts.map +1 -0
  166. package/dist/extractors/zig.js +276 -0
  167. package/dist/extractors/zig.js.map +1 -0
  168. package/dist/features/ast.d.ts +2 -0
  169. package/dist/features/ast.d.ts.map +1 -1
  170. package/dist/features/ast.js +9 -24
  171. package/dist/features/ast.js.map +1 -1
  172. package/dist/features/audit.d.ts.map +1 -1
  173. package/dist/features/audit.js +17 -21
  174. package/dist/features/audit.js.map +1 -1
  175. package/dist/features/branch-compare.d.ts.map +1 -1
  176. package/dist/features/branch-compare.js +47 -3
  177. package/dist/features/branch-compare.js.map +1 -1
  178. package/dist/features/cfg.d.ts +7 -1
  179. package/dist/features/cfg.d.ts.map +1 -1
  180. package/dist/features/cfg.js +72 -61
  181. package/dist/features/cfg.js.map +1 -1
  182. package/dist/features/check.d.ts.map +1 -1
  183. package/dist/features/check.js +79 -62
  184. package/dist/features/check.js.map +1 -1
  185. package/dist/features/complexity-query.d.ts.map +1 -1
  186. package/dist/features/complexity-query.js +142 -137
  187. package/dist/features/complexity-query.js.map +1 -1
  188. package/dist/features/complexity.d.ts +7 -1
  189. package/dist/features/complexity.d.ts.map +1 -1
  190. package/dist/features/complexity.js +62 -1
  191. package/dist/features/complexity.js.map +1 -1
  192. package/dist/features/dataflow.d.ts +7 -1
  193. package/dist/features/dataflow.d.ts.map +1 -1
  194. package/dist/features/dataflow.js +356 -188
  195. package/dist/features/dataflow.js.map +1 -1
  196. package/dist/features/graph-enrichment.d.ts.map +1 -1
  197. package/dist/features/graph-enrichment.js +117 -104
  198. package/dist/features/graph-enrichment.js.map +1 -1
  199. package/dist/features/sequence.d.ts.map +1 -1
  200. package/dist/features/sequence.js +25 -4
  201. package/dist/features/sequence.js.map +1 -1
  202. package/dist/features/structure-query.d.ts.map +1 -1
  203. package/dist/features/structure-query.js +29 -4
  204. package/dist/features/structure-query.js.map +1 -1
  205. package/dist/features/structure.d.ts.map +1 -1
  206. package/dist/features/structure.js +35 -15
  207. package/dist/features/structure.js.map +1 -1
  208. package/dist/graph/algorithms/leiden/adapter.d.ts.map +1 -1
  209. package/dist/graph/algorithms/leiden/adapter.js +88 -73
  210. package/dist/graph/algorithms/leiden/adapter.js.map +1 -1
  211. package/dist/graph/algorithms/leiden/index.js +43 -28
  212. package/dist/graph/algorithms/leiden/index.js.map +1 -1
  213. package/dist/graph/algorithms/leiden/optimiser.d.ts.map +1 -1
  214. package/dist/graph/algorithms/leiden/optimiser.js +90 -104
  215. package/dist/graph/algorithms/leiden/optimiser.js.map +1 -1
  216. package/dist/graph/algorithms/leiden/partition.d.ts.map +1 -1
  217. package/dist/graph/algorithms/leiden/partition.js +89 -106
  218. package/dist/graph/algorithms/leiden/partition.js.map +1 -1
  219. package/dist/graph/model.d.ts +2 -0
  220. package/dist/graph/model.d.ts.map +1 -1
  221. package/dist/graph/model.js +20 -8
  222. package/dist/graph/model.js.map +1 -1
  223. package/dist/infrastructure/config.d.ts +0 -8
  224. package/dist/infrastructure/config.d.ts.map +1 -1
  225. package/dist/infrastructure/config.js +73 -62
  226. package/dist/infrastructure/config.js.map +1 -1
  227. package/dist/infrastructure/registry.d.ts +0 -8
  228. package/dist/infrastructure/registry.d.ts.map +1 -1
  229. package/dist/infrastructure/registry.js +12 -14
  230. package/dist/infrastructure/registry.js.map +1 -1
  231. package/dist/mcp/server.d.ts.map +1 -1
  232. package/dist/mcp/server.js +45 -36
  233. package/dist/mcp/server.js.map +1 -1
  234. package/dist/presentation/audit.d.ts.map +1 -1
  235. package/dist/presentation/audit.js +61 -57
  236. package/dist/presentation/audit.js.map +1 -1
  237. package/dist/presentation/branch-compare.d.ts.map +1 -1
  238. package/dist/presentation/branch-compare.js +56 -38
  239. package/dist/presentation/branch-compare.js.map +1 -1
  240. package/dist/presentation/check.d.ts.map +1 -1
  241. package/dist/presentation/check.js +30 -32
  242. package/dist/presentation/check.js.map +1 -1
  243. package/dist/presentation/colors.d.ts.map +1 -1
  244. package/dist/presentation/colors.js +2 -0
  245. package/dist/presentation/colors.js.map +1 -1
  246. package/dist/presentation/complexity.d.ts.map +1 -1
  247. package/dist/presentation/complexity.js +25 -19
  248. package/dist/presentation/complexity.js.map +1 -1
  249. package/dist/presentation/queries-cli/exports.d.ts.map +1 -1
  250. package/dist/presentation/queries-cli/exports.js +15 -15
  251. package/dist/presentation/queries-cli/exports.js.map +1 -1
  252. package/dist/presentation/queries-cli/impact.d.ts.map +1 -1
  253. package/dist/presentation/queries-cli/impact.js +29 -19
  254. package/dist/presentation/queries-cli/impact.js.map +1 -1
  255. package/dist/types.d.ts +182 -7
  256. package/dist/types.d.ts.map +1 -1
  257. package/grammars/tree-sitter-bash.wasm +0 -0
  258. package/grammars/tree-sitter-c.wasm +0 -0
  259. package/grammars/tree-sitter-cpp.wasm +0 -0
  260. package/grammars/tree-sitter-dart.wasm +0 -0
  261. package/grammars/tree-sitter-elixir.wasm +0 -0
  262. package/grammars/tree-sitter-haskell.wasm +0 -0
  263. package/grammars/tree-sitter-kotlin.wasm +0 -0
  264. package/grammars/tree-sitter-lua.wasm +0 -0
  265. package/grammars/tree-sitter-ocaml.wasm +0 -0
  266. package/grammars/tree-sitter-scala.wasm +0 -0
  267. package/grammars/tree-sitter-swift.wasm +0 -0
  268. package/grammars/tree-sitter-zig.wasm +0 -0
  269. package/package.json +19 -7
  270. package/src/ast-analysis/engine.ts +147 -138
  271. package/src/ast-analysis/visitors/ast-store-visitor.ts +15 -2
  272. package/src/ast-analysis/visitors/complexity-visitor.ts +11 -11
  273. package/src/db/connection.ts +90 -59
  274. package/src/db/index.ts +1 -0
  275. package/src/db/migrations.ts +36 -32
  276. package/src/domain/analysis/context.ts +73 -75
  277. package/src/domain/analysis/dependencies.ts +78 -68
  278. package/src/domain/analysis/exports.ts +45 -34
  279. package/src/domain/analysis/fn-impact.ts +67 -64
  280. package/src/domain/analysis/module-map.ts +103 -8
  281. package/src/domain/analysis/query-helpers.ts +35 -0
  282. package/src/domain/graph/builder/helpers.ts +12 -6
  283. package/src/domain/graph/builder/incremental.ts +3 -2
  284. package/src/domain/graph/builder/pipeline.ts +71 -3
  285. package/src/domain/graph/builder/stages/build-edges.ts +10 -75
  286. package/src/domain/graph/builder/stages/build-structure.ts +9 -7
  287. package/src/domain/graph/builder/stages/collect-files.ts +2 -2
  288. package/src/domain/graph/builder/stages/detect-changes.ts +7 -2
  289. package/src/domain/graph/builder/stages/finalize.ts +159 -125
  290. package/src/domain/graph/builder/stages/insert-nodes.ts +32 -21
  291. package/src/domain/graph/builder/stages/resolve-imports.ts +3 -2
  292. package/src/domain/graph/resolve.ts +34 -46
  293. package/src/domain/graph/watcher.ts +12 -14
  294. package/src/domain/parser.ts +222 -97
  295. package/src/domain/search/search/cli-formatter.ts +121 -94
  296. package/src/extractors/bash.ts +97 -0
  297. package/src/extractors/c.ts +212 -0
  298. package/src/extractors/cpp.ts +298 -0
  299. package/src/extractors/csharp.ts +53 -56
  300. package/src/extractors/dart.ts +304 -0
  301. package/src/extractors/elixir.ts +251 -0
  302. package/src/extractors/go.ts +152 -134
  303. package/src/extractors/haskell.ts +235 -0
  304. package/src/extractors/hcl.ts +6 -6
  305. package/src/extractors/helpers.ts +93 -1
  306. package/src/extractors/index.ts +12 -0
  307. package/src/extractors/java.ts +43 -48
  308. package/src/extractors/javascript.ts +328 -281
  309. package/src/extractors/kotlin.ts +293 -0
  310. package/src/extractors/lua.ts +169 -0
  311. package/src/extractors/ocaml.ts +259 -0
  312. package/src/extractors/php.ts +46 -40
  313. package/src/extractors/python.ts +81 -104
  314. package/src/extractors/ruby.ts +6 -13
  315. package/src/extractors/rust.ts +65 -85
  316. package/src/extractors/scala.ts +285 -0
  317. package/src/extractors/swift.ts +293 -0
  318. package/src/extractors/zig.ts +294 -0
  319. package/src/features/ast.ts +10 -25
  320. package/src/features/audit.ts +24 -20
  321. package/src/features/branch-compare.ts +51 -4
  322. package/src/features/cfg.ts +113 -65
  323. package/src/features/check.ts +90 -74
  324. package/src/features/complexity-query.ts +181 -163
  325. package/src/features/complexity.ts +64 -1
  326. package/src/features/dataflow.ts +462 -217
  327. package/src/features/graph-enrichment.ts +161 -117
  328. package/src/features/sequence.ts +27 -4
  329. package/src/features/structure-query.ts +43 -4
  330. package/src/features/structure.ts +50 -22
  331. package/src/graph/algorithms/leiden/adapter.ts +126 -71
  332. package/src/graph/algorithms/leiden/index.ts +67 -28
  333. package/src/graph/algorithms/leiden/optimiser.ts +114 -105
  334. package/src/graph/algorithms/leiden/partition.ts +131 -98
  335. package/src/graph/model.ts +19 -7
  336. package/src/infrastructure/config.ts +60 -58
  337. package/src/infrastructure/registry.ts +17 -14
  338. package/src/mcp/server.ts +46 -37
  339. package/src/presentation/audit.ts +72 -67
  340. package/src/presentation/branch-compare.ts +54 -50
  341. package/src/presentation/check.ts +34 -34
  342. package/src/presentation/colors.ts +2 -0
  343. package/src/presentation/complexity.ts +39 -33
  344. package/src/presentation/queries-cli/exports.ts +17 -17
  345. package/src/presentation/queries-cli/impact.ts +30 -22
  346. package/src/types.ts +195 -7
@@ -1,4 +1,4 @@
1
- import type { TreeSitterNode } from '../types.js';
1
+ import type { SubDeclaration, TreeSitterNode, TypeMapEntry } from '../types.js';
2
2
 
3
3
  /**
4
4
  * Maximum recursion depth for tree-sitter AST walkers.
@@ -18,6 +18,22 @@ export function findChild(node: TreeSitterNode, type: string): TreeSitterNode |
18
18
  return null;
19
19
  }
20
20
 
21
+ /**
22
+ * Merge a type-map entry, keeping the higher-confidence one.
23
+ * Shared across all language extractors that build type maps for call resolution.
24
+ */
25
+ export function setTypeMapEntry(
26
+ typeMap: Map<string, TypeMapEntry>,
27
+ name: string,
28
+ type: string,
29
+ confidence: number,
30
+ ): void {
31
+ const existing = typeMap.get(name);
32
+ if (!existing || confidence > existing.confidence) {
33
+ typeMap.set(name, { type, confidence });
34
+ }
35
+ }
36
+
21
37
  /**
22
38
  * Extract visibility from a node by scanning its children for modifier keywords.
23
39
  * Works for Java, C#, PHP, and similar languages where modifiers are child nodes.
@@ -70,6 +86,82 @@ export function rustVisibility(node: TreeSitterNode): 'public' | 'private' {
70
86
  return 'private';
71
87
  }
72
88
 
89
+ // ── Parser abstraction helpers ─────────────────────────────────────────────
90
+
91
+ /**
92
+ * Walk up the parent chain to find an enclosing node whose type is in `typeNames`.
93
+ * Returns the text of `nameField` (default `'name'`) on the matching ancestor, or null.
94
+ *
95
+ * Replaces per-language `findParentClass` / `findParentType` / `findCurrentImpl` helpers.
96
+ */
97
+ export function findParentNode(
98
+ node: TreeSitterNode,
99
+ typeNames: readonly string[],
100
+ nameField: string = 'name',
101
+ ): string | null {
102
+ let current = node.parent;
103
+ while (current) {
104
+ if (typeNames.includes(current.type)) {
105
+ const nameNode = current.childForFieldName(nameField);
106
+ return nameNode ? nameNode.text : null;
107
+ }
108
+ current = current.parent;
109
+ }
110
+ return null;
111
+ }
112
+
113
+ /**
114
+ * Extract child declarations from a container node's body.
115
+ * Finds the body via `bodyFields` (tries childForFieldName then findChild for each),
116
+ * iterates its children, filters by `memberType`, extracts `nameField`, and returns SubDeclarations.
117
+ *
118
+ * Replaces per-language extractStructFields / extractEnumVariants / extractEnumConstants helpers
119
+ * for the common case where each member has a direct name field.
120
+ */
121
+ export function extractBodyMembers(
122
+ containerNode: TreeSitterNode,
123
+ bodyFields: readonly string[],
124
+ memberType: string,
125
+ kind: SubDeclaration['kind'],
126
+ nameField: string = 'name',
127
+ visibility?: (member: TreeSitterNode) => SubDeclaration['visibility'],
128
+ ): SubDeclaration[] {
129
+ const members: SubDeclaration[] = [];
130
+ let body: TreeSitterNode | null = null;
131
+ for (const field of bodyFields) {
132
+ body = containerNode.childForFieldName(field) || findChild(containerNode, field);
133
+ if (body) break;
134
+ }
135
+ if (!body) return members;
136
+ for (let i = 0; i < body.childCount; i++) {
137
+ const member = body.child(i);
138
+ if (!member || member.type !== memberType) continue;
139
+ const nn = member.childForFieldName(nameField);
140
+ if (nn) {
141
+ const entry: SubDeclaration = { name: nn.text, kind, line: member.startPosition.row + 1 };
142
+ if (visibility) entry.visibility = visibility(member);
143
+ members.push(entry);
144
+ }
145
+ }
146
+ return members;
147
+ }
148
+
149
+ /**
150
+ * Strip leading/trailing quotes (single, double, or backtick) from a string.
151
+ * Strips only the leading/trailing delimiter; interior quotes are untouched.
152
+ */
153
+ export function stripQuotes(text: string): string {
154
+ return text.replace(/^['"`]|['"`]$/g, '');
155
+ }
156
+
157
+ /**
158
+ * Extract the last segment of a delimited path.
159
+ * e.g. `lastPathSegment('java.util.List', '.')` → `'List'`
160
+ */
161
+ export function lastPathSegment(path: string, separator: string = '/'): string {
162
+ return path.split(separator).pop() ?? path;
163
+ }
164
+
73
165
  export function extractModifierVisibility(
74
166
  node: TreeSitterNode,
75
167
  modifierTypes: Set<string> = DEFAULT_MODIFIER_TYPES,
@@ -1,9 +1,21 @@
1
+ export { extractBashSymbols } from './bash.js';
2
+ export { extractCSymbols } from './c.js';
3
+ export { extractCppSymbols } from './cpp.js';
1
4
  export { extractCSharpSymbols } from './csharp.js';
5
+ export { extractDartSymbols } from './dart.js';
6
+ export { extractElixirSymbols } from './elixir.js';
2
7
  export { extractGoSymbols } from './go.js';
8
+ export { extractHaskellSymbols } from './haskell.js';
3
9
  export { extractHCLSymbols } from './hcl.js';
4
10
  export { extractJavaSymbols } from './java.js';
5
11
  export { extractSymbols } from './javascript.js';
12
+ export { extractKotlinSymbols } from './kotlin.js';
13
+ export { extractLuaSymbols } from './lua.js';
14
+ export { extractOCamlSymbols } from './ocaml.js';
6
15
  export { extractPHPSymbols } from './php.js';
7
16
  export { extractPythonSymbols } from './python.js';
8
17
  export { extractRubySymbols } from './ruby.js';
9
18
  export { extractRustSymbols } from './rust.js';
19
+ export { extractScalaSymbols } from './scala.js';
20
+ export { extractSwiftSymbols } from './swift.js';
21
+ export { extractZigSymbols } from './zig.js';
@@ -6,7 +6,14 @@ import type {
6
6
  TreeSitterTree,
7
7
  TypeMapEntry,
8
8
  } from '../types.js';
9
- import { extractModifierVisibility, findChild, nodeEndLine } from './helpers.js';
9
+ import {
10
+ extractBodyMembers,
11
+ extractModifierVisibility,
12
+ findChild,
13
+ findParentNode,
14
+ lastPathSegment,
15
+ nodeEndLine,
16
+ } from './helpers.js';
10
17
 
11
18
  /**
12
19
  * Extract symbols from Java files.
@@ -104,6 +111,25 @@ function handleJavaClassDecl(node: TreeSitterNode, ctx: ExtractorOutput): void {
104
111
  }
105
112
  }
106
113
 
114
+ const JAVA_TYPE_NODE_TYPES = new Set(['type_identifier', 'identifier', 'generic_type']);
115
+
116
+ /** Resolve interface name from a type node (handles generic_type unwrapping). */
117
+ function resolveJavaIfaceName(node: TreeSitterNode): string | undefined {
118
+ return node.type === 'generic_type' ? node.child(0)?.text : node.text;
119
+ }
120
+
121
+ /** Push a single interface type node as an implements entry. */
122
+ function pushJavaIface(
123
+ node: TreeSitterNode,
124
+ className: string,
125
+ line: number,
126
+ ctx: ExtractorOutput,
127
+ ): void {
128
+ if (!JAVA_TYPE_NODE_TYPES.has(node.type)) return;
129
+ const ifaceName = resolveJavaIfaceName(node);
130
+ if (ifaceName) ctx.classes.push({ name: className, implements: ifaceName, line });
131
+ }
132
+
107
133
  function extractJavaInterfaces(
108
134
  interfaces: TreeSitterNode,
109
135
  className: string,
@@ -112,28 +138,15 @@ function extractJavaInterfaces(
112
138
  ): void {
113
139
  for (let i = 0; i < interfaces.childCount; i++) {
114
140
  const child = interfaces.child(i);
115
- if (
116
- child &&
117
- (child.type === 'type_identifier' ||
118
- child.type === 'identifier' ||
119
- child.type === 'type_list' ||
120
- child.type === 'generic_type')
121
- ) {
122
- if (child.type === 'type_list') {
123
- for (let j = 0; j < child.childCount; j++) {
124
- const t = child.child(j);
125
- if (
126
- t &&
127
- (t.type === 'type_identifier' || t.type === 'identifier' || t.type === 'generic_type')
128
- ) {
129
- const ifaceName = t.type === 'generic_type' ? t.child(0)?.text : t.text;
130
- if (ifaceName) ctx.classes.push({ name: className, implements: ifaceName, line });
131
- }
132
- }
133
- } else {
134
- const ifaceName = child.type === 'generic_type' ? child.child(0)?.text : child.text;
135
- if (ifaceName) ctx.classes.push({ name: className, implements: ifaceName, line });
141
+ if (!child) continue;
142
+
143
+ if (child.type === 'type_list') {
144
+ for (let j = 0; j < child.childCount; j++) {
145
+ const t = child.child(j);
146
+ if (t) pushJavaIface(t, className, line, ctx);
136
147
  }
148
+ } else {
149
+ pushJavaIface(child, className, line, ctx);
137
150
  }
138
151
  }
139
152
  }
@@ -218,7 +231,7 @@ function handleJavaImportDecl(node: TreeSitterNode, ctx: ExtractorOutput): void
218
231
  const child = node.child(i);
219
232
  if (child && (child.type === 'scoped_identifier' || child.type === 'identifier')) {
220
233
  const fullPath = child.text;
221
- const lastName = fullPath.split('.').pop() ?? fullPath;
234
+ const lastName = lastPathSegment(fullPath, '.');
222
235
  ctx.imports.push({
223
236
  source: fullPath,
224
237
  names: [lastName],
@@ -263,20 +276,13 @@ function handleJavaObjectCreation(node: TreeSitterNode, ctx: ExtractorOutput): v
263
276
  if (typeName) ctx.calls.push({ name: typeName, line: node.startPosition.row + 1 });
264
277
  }
265
278
 
279
+ const JAVA_PARENT_TYPES = [
280
+ 'class_declaration',
281
+ 'enum_declaration',
282
+ 'interface_declaration',
283
+ ] as const;
266
284
  function findJavaParentClass(node: TreeSitterNode): string | null {
267
- let current = node.parent;
268
- while (current) {
269
- if (
270
- current.type === 'class_declaration' ||
271
- current.type === 'enum_declaration' ||
272
- current.type === 'interface_declaration'
273
- ) {
274
- const nameNode = current.childForFieldName('name');
275
- return nameNode ? nameNode.text : null;
276
- }
277
- current = current.parent;
278
- }
279
- return null;
285
+ return findParentNode(node, JAVA_PARENT_TYPES);
280
286
  }
281
287
 
282
288
  // ── Child extraction helpers ────────────────────────────────────────────────
@@ -333,16 +339,5 @@ function extractClassFields(classNode: TreeSitterNode): SubDeclaration[] {
333
339
  }
334
340
 
335
341
  function extractEnumConstants(enumNode: TreeSitterNode): SubDeclaration[] {
336
- const constants: SubDeclaration[] = [];
337
- const body = enumNode.childForFieldName('body') || findChild(enumNode, 'enum_body');
338
- if (!body) return constants;
339
- for (let i = 0; i < body.childCount; i++) {
340
- const member = body.child(i);
341
- if (!member || member.type !== 'enum_constant') continue;
342
- const nameNode = member.childForFieldName('name');
343
- if (nameNode) {
344
- constants.push({ name: nameNode.text, kind: 'constant', line: member.startPosition.row + 1 });
345
- }
346
- }
347
- return constants;
342
+ return extractBodyMembers(enumNode, ['body', 'enum_body'], 'enum_constant', 'constant');
348
343
  }