@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.
- package/README.md +47 -21
- package/dist/ast-analysis/engine.d.ts.map +1 -1
- package/dist/ast-analysis/engine.js +119 -127
- package/dist/ast-analysis/engine.js.map +1 -1
- package/dist/ast-analysis/visitors/ast-store-visitor.d.ts.map +1 -1
- package/dist/ast-analysis/visitors/ast-store-visitor.js +14 -1
- package/dist/ast-analysis/visitors/ast-store-visitor.js.map +1 -1
- package/dist/ast-analysis/visitors/complexity-visitor.d.ts.map +1 -1
- package/dist/ast-analysis/visitors/complexity-visitor.js +11 -13
- package/dist/ast-analysis/visitors/complexity-visitor.js.map +1 -1
- package/dist/db/connection.d.ts +12 -2
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +81 -53
- package/dist/db/connection.js.map +1 -1
- package/dist/db/index.d.ts +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +38 -32
- package/dist/db/migrations.js.map +1 -1
- package/dist/domain/analysis/context.d.ts.map +1 -1
- package/dist/domain/analysis/context.js +51 -66
- package/dist/domain/analysis/context.js.map +1 -1
- package/dist/domain/analysis/dependencies.d.ts.map +1 -1
- package/dist/domain/analysis/dependencies.js +62 -70
- package/dist/domain/analysis/dependencies.js.map +1 -1
- package/dist/domain/analysis/diff-impact.d.ts +9 -7
- package/dist/domain/analysis/diff-impact.d.ts.map +1 -1
- package/dist/domain/analysis/exports.d.ts.map +1 -1
- package/dist/domain/analysis/exports.js +29 -33
- package/dist/domain/analysis/exports.js.map +1 -1
- package/dist/domain/analysis/fn-impact.d.ts +15 -17
- package/dist/domain/analysis/fn-impact.d.ts.map +1 -1
- package/dist/domain/analysis/fn-impact.js +35 -65
- package/dist/domain/analysis/fn-impact.js.map +1 -1
- package/dist/domain/analysis/module-map.d.ts.map +1 -1
- package/dist/domain/analysis/module-map.js +91 -6
- package/dist/domain/analysis/module-map.js.map +1 -1
- package/dist/domain/analysis/query-helpers.d.ts +20 -0
- package/dist/domain/analysis/query-helpers.d.ts.map +1 -0
- package/dist/domain/analysis/query-helpers.js +27 -0
- package/dist/domain/analysis/query-helpers.js.map +1 -0
- package/dist/domain/graph/builder/helpers.d.ts.map +1 -1
- package/dist/domain/graph/builder/helpers.js +15 -9
- package/dist/domain/graph/builder/helpers.js.map +1 -1
- package/dist/domain/graph/builder/incremental.d.ts.map +1 -1
- package/dist/domain/graph/builder/incremental.js +3 -2
- package/dist/domain/graph/builder/incremental.js.map +1 -1
- package/dist/domain/graph/builder/pipeline.d.ts.map +1 -1
- package/dist/domain/graph/builder/pipeline.js +69 -3
- package/dist/domain/graph/builder/pipeline.js.map +1 -1
- package/dist/domain/graph/builder/stages/build-edges.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/build-edges.js +7 -51
- package/dist/domain/graph/builder/stages/build-edges.js.map +1 -1
- package/dist/domain/graph/builder/stages/build-structure.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/build-structure.js +7 -5
- package/dist/domain/graph/builder/stages/build-structure.js.map +1 -1
- package/dist/domain/graph/builder/stages/collect-files.js +2 -2
- package/dist/domain/graph/builder/stages/collect-files.js.map +1 -1
- package/dist/domain/graph/builder/stages/detect-changes.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/detect-changes.js +2 -2
- package/dist/domain/graph/builder/stages/detect-changes.js.map +1 -1
- package/dist/domain/graph/builder/stages/finalize.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/finalize.js +124 -105
- package/dist/domain/graph/builder/stages/finalize.js.map +1 -1
- package/dist/domain/graph/builder/stages/insert-nodes.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/insert-nodes.js +28 -15
- package/dist/domain/graph/builder/stages/insert-nodes.js.map +1 -1
- package/dist/domain/graph/builder/stages/resolve-imports.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/resolve-imports.js +3 -2
- package/dist/domain/graph/builder/stages/resolve-imports.js.map +1 -1
- package/dist/domain/graph/resolve.d.ts +0 -4
- package/dist/domain/graph/resolve.d.ts.map +1 -1
- package/dist/domain/graph/resolve.js +32 -48
- package/dist/domain/graph/resolve.js.map +1 -1
- package/dist/domain/graph/watcher.d.ts.map +1 -1
- package/dist/domain/graph/watcher.js +12 -12
- package/dist/domain/graph/watcher.js.map +1 -1
- package/dist/domain/parser.d.ts +1 -1
- package/dist/domain/parser.d.ts.map +1 -1
- package/dist/domain/parser.js +206 -101
- package/dist/domain/parser.js.map +1 -1
- package/dist/domain/search/search/cli-formatter.d.ts.map +1 -1
- package/dist/domain/search/search/cli-formatter.js +88 -83
- package/dist/domain/search/search/cli-formatter.js.map +1 -1
- package/dist/extractors/bash.d.ts +6 -0
- package/dist/extractors/bash.d.ts.map +1 -0
- package/dist/extractors/bash.js +91 -0
- package/dist/extractors/bash.js.map +1 -0
- package/dist/extractors/c.d.ts +6 -0
- package/dist/extractors/c.d.ts.map +1 -0
- package/dist/extractors/c.js +204 -0
- package/dist/extractors/c.js.map +1 -0
- package/dist/extractors/cpp.d.ts +6 -0
- package/dist/extractors/cpp.d.ts.map +1 -0
- package/dist/extractors/cpp.js +283 -0
- package/dist/extractors/cpp.js.map +1 -0
- package/dist/extractors/csharp.d.ts.map +1 -1
- package/dist/extractors/csharp.js +42 -54
- package/dist/extractors/csharp.js.map +1 -1
- package/dist/extractors/dart.d.ts +6 -0
- package/dist/extractors/dart.d.ts.map +1 -0
- package/dist/extractors/dart.js +277 -0
- package/dist/extractors/dart.js.map +1 -0
- package/dist/extractors/elixir.d.ts +9 -0
- package/dist/extractors/elixir.d.ts.map +1 -0
- package/dist/extractors/elixir.js +223 -0
- package/dist/extractors/elixir.js.map +1 -0
- package/dist/extractors/go.d.ts.map +1 -1
- package/dist/extractors/go.js +126 -130
- package/dist/extractors/go.js.map +1 -1
- package/dist/extractors/haskell.d.ts +8 -0
- package/dist/extractors/haskell.d.ts.map +1 -0
- package/dist/extractors/haskell.js +217 -0
- package/dist/extractors/haskell.js.map +1 -0
- package/dist/extractors/hcl.js +6 -6
- package/dist/extractors/hcl.js.map +1 -1
- package/dist/extractors/helpers.d.ts +32 -1
- package/dist/extractors/helpers.d.ts.map +1 -1
- package/dist/extractors/helpers.js +74 -0
- package/dist/extractors/helpers.js.map +1 -1
- package/dist/extractors/index.d.ts +12 -0
- package/dist/extractors/index.d.ts.map +1 -1
- package/dist/extractors/index.js +12 -0
- package/dist/extractors/index.js.map +1 -1
- package/dist/extractors/java.d.ts.map +1 -1
- package/dist/extractors/java.js +32 -47
- package/dist/extractors/java.js.map +1 -1
- package/dist/extractors/javascript.d.ts.map +1 -1
- package/dist/extractors/javascript.js +306 -292
- package/dist/extractors/javascript.js.map +1 -1
- package/dist/extractors/kotlin.d.ts +6 -0
- package/dist/extractors/kotlin.d.ts.map +1 -0
- package/dist/extractors/kotlin.js +275 -0
- package/dist/extractors/kotlin.js.map +1 -0
- package/dist/extractors/lua.d.ts +6 -0
- package/dist/extractors/lua.d.ts.map +1 -0
- package/dist/extractors/lua.js +162 -0
- package/dist/extractors/lua.js.map +1 -0
- package/dist/extractors/ocaml.d.ts +6 -0
- package/dist/extractors/ocaml.d.ts.map +1 -0
- package/dist/extractors/ocaml.js +236 -0
- package/dist/extractors/ocaml.js.map +1 -0
- package/dist/extractors/php.d.ts.map +1 -1
- package/dist/extractors/php.js +39 -44
- package/dist/extractors/php.js.map +1 -1
- package/dist/extractors/python.d.ts.map +1 -1
- package/dist/extractors/python.js +75 -93
- package/dist/extractors/python.js.map +1 -1
- package/dist/extractors/ruby.js +6 -13
- package/dist/extractors/ruby.js.map +1 -1
- package/dist/extractors/rust.d.ts.map +1 -1
- package/dist/extractors/rust.js +58 -83
- package/dist/extractors/rust.js.map +1 -1
- package/dist/extractors/scala.d.ts +6 -0
- package/dist/extractors/scala.d.ts.map +1 -0
- package/dist/extractors/scala.js +269 -0
- package/dist/extractors/scala.js.map +1 -0
- package/dist/extractors/swift.d.ts +6 -0
- package/dist/extractors/swift.d.ts.map +1 -0
- package/dist/extractors/swift.js +275 -0
- package/dist/extractors/swift.js.map +1 -0
- package/dist/extractors/zig.d.ts +9 -0
- package/dist/extractors/zig.d.ts.map +1 -0
- package/dist/extractors/zig.js +276 -0
- package/dist/extractors/zig.js.map +1 -0
- package/dist/features/ast.d.ts +2 -0
- package/dist/features/ast.d.ts.map +1 -1
- package/dist/features/ast.js +9 -24
- package/dist/features/ast.js.map +1 -1
- package/dist/features/audit.d.ts.map +1 -1
- package/dist/features/audit.js +17 -21
- package/dist/features/audit.js.map +1 -1
- package/dist/features/branch-compare.d.ts.map +1 -1
- package/dist/features/branch-compare.js +47 -3
- package/dist/features/branch-compare.js.map +1 -1
- package/dist/features/cfg.d.ts +7 -1
- package/dist/features/cfg.d.ts.map +1 -1
- package/dist/features/cfg.js +72 -61
- package/dist/features/cfg.js.map +1 -1
- package/dist/features/check.d.ts.map +1 -1
- package/dist/features/check.js +79 -62
- package/dist/features/check.js.map +1 -1
- package/dist/features/complexity-query.d.ts.map +1 -1
- package/dist/features/complexity-query.js +142 -137
- package/dist/features/complexity-query.js.map +1 -1
- package/dist/features/complexity.d.ts +7 -1
- package/dist/features/complexity.d.ts.map +1 -1
- package/dist/features/complexity.js +62 -1
- package/dist/features/complexity.js.map +1 -1
- package/dist/features/dataflow.d.ts +7 -1
- package/dist/features/dataflow.d.ts.map +1 -1
- package/dist/features/dataflow.js +356 -188
- package/dist/features/dataflow.js.map +1 -1
- package/dist/features/graph-enrichment.d.ts.map +1 -1
- package/dist/features/graph-enrichment.js +117 -104
- package/dist/features/graph-enrichment.js.map +1 -1
- package/dist/features/sequence.d.ts.map +1 -1
- package/dist/features/sequence.js +25 -4
- package/dist/features/sequence.js.map +1 -1
- package/dist/features/structure-query.d.ts.map +1 -1
- package/dist/features/structure-query.js +29 -4
- package/dist/features/structure-query.js.map +1 -1
- package/dist/features/structure.d.ts.map +1 -1
- package/dist/features/structure.js +35 -15
- package/dist/features/structure.js.map +1 -1
- package/dist/graph/algorithms/leiden/adapter.d.ts.map +1 -1
- package/dist/graph/algorithms/leiden/adapter.js +88 -73
- package/dist/graph/algorithms/leiden/adapter.js.map +1 -1
- package/dist/graph/algorithms/leiden/index.js +43 -28
- package/dist/graph/algorithms/leiden/index.js.map +1 -1
- package/dist/graph/algorithms/leiden/optimiser.d.ts.map +1 -1
- package/dist/graph/algorithms/leiden/optimiser.js +90 -104
- package/dist/graph/algorithms/leiden/optimiser.js.map +1 -1
- package/dist/graph/algorithms/leiden/partition.d.ts.map +1 -1
- package/dist/graph/algorithms/leiden/partition.js +89 -106
- package/dist/graph/algorithms/leiden/partition.js.map +1 -1
- package/dist/graph/model.d.ts +2 -0
- package/dist/graph/model.d.ts.map +1 -1
- package/dist/graph/model.js +20 -8
- package/dist/graph/model.js.map +1 -1
- package/dist/infrastructure/config.d.ts +0 -8
- package/dist/infrastructure/config.d.ts.map +1 -1
- package/dist/infrastructure/config.js +73 -62
- package/dist/infrastructure/config.js.map +1 -1
- package/dist/infrastructure/registry.d.ts +0 -8
- package/dist/infrastructure/registry.d.ts.map +1 -1
- package/dist/infrastructure/registry.js +12 -14
- package/dist/infrastructure/registry.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +45 -36
- package/dist/mcp/server.js.map +1 -1
- package/dist/presentation/audit.d.ts.map +1 -1
- package/dist/presentation/audit.js +61 -57
- package/dist/presentation/audit.js.map +1 -1
- package/dist/presentation/branch-compare.d.ts.map +1 -1
- package/dist/presentation/branch-compare.js +56 -38
- package/dist/presentation/branch-compare.js.map +1 -1
- package/dist/presentation/check.d.ts.map +1 -1
- package/dist/presentation/check.js +30 -32
- package/dist/presentation/check.js.map +1 -1
- package/dist/presentation/colors.d.ts.map +1 -1
- package/dist/presentation/colors.js +2 -0
- package/dist/presentation/colors.js.map +1 -1
- package/dist/presentation/complexity.d.ts.map +1 -1
- package/dist/presentation/complexity.js +25 -19
- package/dist/presentation/complexity.js.map +1 -1
- package/dist/presentation/queries-cli/exports.d.ts.map +1 -1
- package/dist/presentation/queries-cli/exports.js +15 -15
- package/dist/presentation/queries-cli/exports.js.map +1 -1
- package/dist/presentation/queries-cli/impact.d.ts.map +1 -1
- package/dist/presentation/queries-cli/impact.js +29 -19
- package/dist/presentation/queries-cli/impact.js.map +1 -1
- package/dist/types.d.ts +182 -7
- package/dist/types.d.ts.map +1 -1
- package/grammars/tree-sitter-bash.wasm +0 -0
- package/grammars/tree-sitter-c.wasm +0 -0
- package/grammars/tree-sitter-cpp.wasm +0 -0
- package/grammars/tree-sitter-dart.wasm +0 -0
- package/grammars/tree-sitter-elixir.wasm +0 -0
- package/grammars/tree-sitter-haskell.wasm +0 -0
- package/grammars/tree-sitter-kotlin.wasm +0 -0
- package/grammars/tree-sitter-lua.wasm +0 -0
- package/grammars/tree-sitter-ocaml.wasm +0 -0
- package/grammars/tree-sitter-scala.wasm +0 -0
- package/grammars/tree-sitter-swift.wasm +0 -0
- package/grammars/tree-sitter-zig.wasm +0 -0
- package/package.json +19 -7
- package/src/ast-analysis/engine.ts +147 -138
- package/src/ast-analysis/visitors/ast-store-visitor.ts +15 -2
- package/src/ast-analysis/visitors/complexity-visitor.ts +11 -11
- package/src/db/connection.ts +90 -59
- package/src/db/index.ts +1 -0
- package/src/db/migrations.ts +36 -32
- package/src/domain/analysis/context.ts +73 -75
- package/src/domain/analysis/dependencies.ts +78 -68
- package/src/domain/analysis/exports.ts +45 -34
- package/src/domain/analysis/fn-impact.ts +67 -64
- package/src/domain/analysis/module-map.ts +103 -8
- package/src/domain/analysis/query-helpers.ts +35 -0
- package/src/domain/graph/builder/helpers.ts +12 -6
- package/src/domain/graph/builder/incremental.ts +3 -2
- package/src/domain/graph/builder/pipeline.ts +71 -3
- package/src/domain/graph/builder/stages/build-edges.ts +10 -75
- package/src/domain/graph/builder/stages/build-structure.ts +9 -7
- package/src/domain/graph/builder/stages/collect-files.ts +2 -2
- package/src/domain/graph/builder/stages/detect-changes.ts +7 -2
- package/src/domain/graph/builder/stages/finalize.ts +159 -125
- package/src/domain/graph/builder/stages/insert-nodes.ts +32 -21
- package/src/domain/graph/builder/stages/resolve-imports.ts +3 -2
- package/src/domain/graph/resolve.ts +34 -46
- package/src/domain/graph/watcher.ts +12 -14
- package/src/domain/parser.ts +222 -97
- package/src/domain/search/search/cli-formatter.ts +121 -94
- package/src/extractors/bash.ts +97 -0
- package/src/extractors/c.ts +212 -0
- package/src/extractors/cpp.ts +298 -0
- package/src/extractors/csharp.ts +53 -56
- package/src/extractors/dart.ts +304 -0
- package/src/extractors/elixir.ts +251 -0
- package/src/extractors/go.ts +152 -134
- package/src/extractors/haskell.ts +235 -0
- package/src/extractors/hcl.ts +6 -6
- package/src/extractors/helpers.ts +93 -1
- package/src/extractors/index.ts +12 -0
- package/src/extractors/java.ts +43 -48
- package/src/extractors/javascript.ts +328 -281
- package/src/extractors/kotlin.ts +293 -0
- package/src/extractors/lua.ts +169 -0
- package/src/extractors/ocaml.ts +259 -0
- package/src/extractors/php.ts +46 -40
- package/src/extractors/python.ts +81 -104
- package/src/extractors/ruby.ts +6 -13
- package/src/extractors/rust.ts +65 -85
- package/src/extractors/scala.ts +285 -0
- package/src/extractors/swift.ts +293 -0
- package/src/extractors/zig.ts +294 -0
- package/src/features/ast.ts +10 -25
- package/src/features/audit.ts +24 -20
- package/src/features/branch-compare.ts +51 -4
- package/src/features/cfg.ts +113 -65
- package/src/features/check.ts +90 -74
- package/src/features/complexity-query.ts +181 -163
- package/src/features/complexity.ts +64 -1
- package/src/features/dataflow.ts +462 -217
- package/src/features/graph-enrichment.ts +161 -117
- package/src/features/sequence.ts +27 -4
- package/src/features/structure-query.ts +43 -4
- package/src/features/structure.ts +50 -22
- package/src/graph/algorithms/leiden/adapter.ts +126 -71
- package/src/graph/algorithms/leiden/index.ts +67 -28
- package/src/graph/algorithms/leiden/optimiser.ts +114 -105
- package/src/graph/algorithms/leiden/partition.ts +131 -98
- package/src/graph/model.ts +19 -7
- package/src/infrastructure/config.ts +60 -58
- package/src/infrastructure/registry.ts +17 -14
- package/src/mcp/server.ts +46 -37
- package/src/presentation/audit.ts +72 -67
- package/src/presentation/branch-compare.ts +54 -50
- package/src/presentation/check.ts +34 -34
- package/src/presentation/colors.ts +2 -0
- package/src/presentation/complexity.ts +39 -33
- package/src/presentation/queries-cli/exports.ts +17 -17
- package/src/presentation/queries-cli/impact.ts +30 -22
- 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,
|
package/src/extractors/index.ts
CHANGED
|
@@ -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';
|
package/src/extractors/java.ts
CHANGED
|
@@ -6,7 +6,14 @@ import type {
|
|
|
6
6
|
TreeSitterTree,
|
|
7
7
|
TypeMapEntry,
|
|
8
8
|
} from '../types.js';
|
|
9
|
-
import {
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|