@optave/codegraph 3.13.0 → 3.15.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 +35 -34
- package/dist/ast-analysis/engine.d.ts.map +1 -1
- package/dist/ast-analysis/engine.js +38 -40
- package/dist/ast-analysis/engine.js.map +1 -1
- package/dist/ast-analysis/rules/b2.d.ts +7 -0
- package/dist/ast-analysis/rules/b2.d.ts.map +1 -0
- package/dist/ast-analysis/rules/b2.js +240 -0
- package/dist/ast-analysis/rules/b2.js.map +1 -0
- package/dist/ast-analysis/rules/b3.d.ts +6 -0
- package/dist/ast-analysis/rules/b3.d.ts.map +1 -0
- package/dist/ast-analysis/rules/b3.js +105 -0
- package/dist/ast-analysis/rules/b3.js.map +1 -0
- package/dist/ast-analysis/rules/b4.d.ts +9 -0
- package/dist/ast-analysis/rules/b4.d.ts.map +1 -0
- package/dist/ast-analysis/rules/b4.js +361 -0
- package/dist/ast-analysis/rules/b4.js.map +1 -0
- package/dist/ast-analysis/rules/b5.d.ts +4 -0
- package/dist/ast-analysis/rules/b5.d.ts.map +1 -0
- package/dist/ast-analysis/rules/b5.js +52 -0
- package/dist/ast-analysis/rules/b5.js.map +1 -0
- package/dist/ast-analysis/rules/c.d.ts +4 -0
- package/dist/ast-analysis/rules/c.d.ts.map +1 -0
- package/dist/ast-analysis/rules/c.js +143 -0
- package/dist/ast-analysis/rules/c.js.map +1 -0
- package/dist/ast-analysis/rules/index.d.ts.map +1 -1
- package/dist/ast-analysis/rules/index.js +34 -0
- package/dist/ast-analysis/rules/index.js.map +1 -1
- package/dist/ast-analysis/rules/javascript.d.ts.map +1 -1
- package/dist/ast-analysis/rules/javascript.js +3 -0
- package/dist/ast-analysis/rules/javascript.js.map +1 -1
- package/dist/ast-analysis/shared.d.ts.map +1 -1
- package/dist/ast-analysis/shared.js +2 -0
- package/dist/ast-analysis/shared.js.map +1 -1
- package/dist/ast-analysis/visitor-utils.d.ts +1 -0
- package/dist/ast-analysis/visitor-utils.d.ts.map +1 -1
- package/dist/ast-analysis/visitor-utils.js +5 -0
- package/dist/ast-analysis/visitor-utils.js.map +1 -1
- package/dist/ast-analysis/visitor.d.ts.map +1 -1
- package/dist/ast-analysis/visitor.js +60 -47
- package/dist/ast-analysis/visitor.js.map +1 -1
- package/dist/ast-analysis/visitors/cfg-visitor.d.ts.map +1 -1
- package/dist/ast-analysis/visitors/cfg-visitor.js +126 -76
- package/dist/ast-analysis/visitors/cfg-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 +27 -15
- package/dist/ast-analysis/visitors/complexity-visitor.js.map +1 -1
- package/dist/ast-analysis/visitors/dataflow-visitor.d.ts.map +1 -1
- package/dist/ast-analysis/visitors/dataflow-visitor.js +54 -21
- package/dist/ast-analysis/visitors/dataflow-visitor.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +137 -134
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/roles.d.ts.map +1 -1
- package/dist/cli/commands/roles.js +6 -1
- package/dist/cli/commands/roles.js.map +1 -1
- package/dist/db/better-sqlite3.d.ts +2 -1
- package/dist/db/better-sqlite3.d.ts.map +1 -1
- package/dist/db/better-sqlite3.js.map +1 -1
- package/dist/db/connection.d.ts +7 -1
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +20 -5
- 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 +68 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/repository/build-stmts.d.ts.map +1 -1
- package/dist/db/repository/build-stmts.js +18 -0
- package/dist/db/repository/build-stmts.js.map +1 -1
- package/dist/db/repository/dataflow.d.ts +5 -0
- package/dist/db/repository/dataflow.d.ts.map +1 -1
- package/dist/db/repository/dataflow.js +14 -0
- package/dist/db/repository/dataflow.js.map +1 -1
- package/dist/db/repository/index.d.ts +1 -1
- package/dist/db/repository/index.d.ts.map +1 -1
- package/dist/db/repository/index.js +1 -1
- package/dist/db/repository/index.js.map +1 -1
- package/dist/db/repository/native-repository.d.ts.map +1 -1
- package/dist/db/repository/native-repository.js +47 -34
- package/dist/db/repository/native-repository.js.map +1 -1
- package/dist/domain/analysis/context.d.ts +2 -2
- package/dist/domain/analysis/dependencies.d.ts +2 -2
- package/dist/domain/analysis/diff-impact.d.ts +2 -2
- package/dist/domain/analysis/fn-impact.d.ts +3 -1
- package/dist/domain/analysis/fn-impact.d.ts.map +1 -1
- package/dist/domain/analysis/fn-impact.js +4 -0
- package/dist/domain/analysis/fn-impact.js.map +1 -1
- package/dist/domain/analysis/implementations.d.ts +2 -2
- package/dist/domain/analysis/module-map.d.ts.map +1 -1
- package/dist/domain/analysis/module-map.js +32 -5
- package/dist/domain/analysis/module-map.js.map +1 -1
- package/dist/domain/analysis/roles.d.ts +7 -1
- package/dist/domain/analysis/roles.d.ts.map +1 -1
- package/dist/domain/analysis/roles.js +16 -0
- package/dist/domain/analysis/roles.js.map +1 -1
- package/dist/domain/analysis/symbol-lookup.d.ts +4 -4
- package/dist/domain/graph/builder/call-resolver.d.ts +17 -5
- package/dist/domain/graph/builder/call-resolver.d.ts.map +1 -1
- package/dist/domain/graph/builder/call-resolver.js +85 -220
- package/dist/domain/graph/builder/call-resolver.js.map +1 -1
- package/dist/domain/graph/builder/context.d.ts +1 -0
- package/dist/domain/graph/builder/context.d.ts.map +1 -1
- package/dist/domain/graph/builder/context.js.map +1 -1
- package/dist/domain/graph/builder/helpers.d.ts +16 -1
- package/dist/domain/graph/builder/helpers.d.ts.map +1 -1
- package/dist/domain/graph/builder/helpers.js +162 -72
- 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 +166 -97
- 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 +10 -4
- 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 +496 -250
- package/dist/domain/graph/builder/stages/build-edges.js.map +1 -1
- package/dist/domain/graph/builder/stages/collect-files.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/collect-files.js +10 -7
- 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 -1
- package/dist/domain/graph/builder/stages/detect-changes.js.map +1 -1
- package/dist/domain/graph/builder/stages/native-orchestrator.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/native-orchestrator.js +895 -545
- package/dist/domain/graph/builder/stages/native-orchestrator.js.map +1 -1
- package/dist/domain/graph/resolver/points-to.d.ts.map +1 -1
- package/dist/domain/graph/resolver/points-to.js +105 -57
- package/dist/domain/graph/resolver/points-to.js.map +1 -1
- package/dist/domain/graph/resolver/strategy.d.ts +61 -0
- package/dist/domain/graph/resolver/strategy.d.ts.map +1 -0
- package/dist/domain/graph/resolver/strategy.js +222 -0
- package/dist/domain/graph/resolver/strategy.js.map +1 -0
- package/dist/domain/graph/watcher.d.ts.map +1 -1
- package/dist/domain/graph/watcher.js +16 -9
- package/dist/domain/graph/watcher.js.map +1 -1
- package/dist/domain/parser.d.ts +12 -0
- package/dist/domain/parser.d.ts.map +1 -1
- package/dist/domain/parser.js +12 -2
- package/dist/domain/parser.js.map +1 -1
- package/dist/domain/queries.d.ts +1 -1
- package/dist/domain/queries.d.ts.map +1 -1
- package/dist/domain/queries.js +1 -1
- package/dist/domain/queries.js.map +1 -1
- package/dist/domain/wasm-worker-entry.js +3 -0
- package/dist/domain/wasm-worker-entry.js.map +1 -1
- package/dist/domain/wasm-worker-pool.d.ts.map +1 -1
- package/dist/domain/wasm-worker-pool.js +24 -5
- package/dist/domain/wasm-worker-pool.js.map +1 -1
- package/dist/domain/wasm-worker-protocol.d.ts +7 -0
- package/dist/domain/wasm-worker-protocol.d.ts.map +1 -1
- package/dist/extractors/dart.js +48 -3
- package/dist/extractors/dart.js.map +1 -1
- package/dist/extractors/groovy.js +62 -3
- package/dist/extractors/groovy.js.map +1 -1
- package/dist/extractors/helpers.d.ts +4 -2
- package/dist/extractors/helpers.d.ts.map +1 -1
- package/dist/extractors/helpers.js +5 -1
- package/dist/extractors/helpers.js.map +1 -1
- package/dist/extractors/java.js +77 -1
- package/dist/extractors/java.js.map +1 -1
- package/dist/extractors/javascript.d.ts.map +1 -1
- package/dist/extractors/javascript.js +549 -163
- package/dist/extractors/javascript.js.map +1 -1
- package/dist/extractors/kotlin.js +58 -3
- package/dist/extractors/kotlin.js.map +1 -1
- package/dist/extractors/objc.js +25 -2
- package/dist/extractors/objc.js.map +1 -1
- package/dist/extractors/scala.js +62 -2
- package/dist/extractors/scala.js.map +1 -1
- package/dist/extractors/swift.js +52 -3
- package/dist/extractors/swift.js.map +1 -1
- package/dist/features/audit.js +26 -23
- package/dist/features/audit.js.map +1 -1
- package/dist/features/boundaries.d.ts.map +1 -1
- package/dist/features/boundaries.js +12 -9
- package/dist/features/boundaries.js.map +1 -1
- package/dist/features/cfg.d.ts.map +1 -1
- package/dist/features/cfg.js +25 -18
- package/dist/features/cfg.js.map +1 -1
- package/dist/features/check.d.ts.map +1 -1
- package/dist/features/check.js +18 -5
- package/dist/features/check.js.map +1 -1
- package/dist/features/communities.d.ts +4 -2
- package/dist/features/communities.d.ts.map +1 -1
- package/dist/features/communities.js +6 -4
- package/dist/features/communities.js.map +1 -1
- package/dist/features/dataflow.d.ts +60 -0
- package/dist/features/dataflow.d.ts.map +1 -1
- package/dist/features/dataflow.js +530 -6
- package/dist/features/dataflow.js.map +1 -1
- package/dist/features/manifesto.d.ts.map +1 -1
- package/dist/features/manifesto.js +59 -72
- package/dist/features/manifesto.js.map +1 -1
- package/dist/features/sequence.d.ts.map +1 -1
- package/dist/features/sequence.js +27 -22
- package/dist/features/sequence.js.map +1 -1
- package/dist/features/snapshot.d.ts.map +1 -1
- package/dist/features/snapshot.js +36 -28
- package/dist/features/snapshot.js.map +1 -1
- package/dist/features/structure.d.ts.map +1 -1
- package/dist/features/structure.js +150 -62
- package/dist/features/structure.js.map +1 -1
- package/dist/features/triage.d.ts.map +1 -1
- package/dist/features/triage.js +18 -11
- package/dist/features/triage.js.map +1 -1
- package/dist/graph/algorithms/bfs.d.ts +1 -1
- package/dist/graph/algorithms/bfs.d.ts.map +1 -1
- package/dist/graph/algorithms/bfs.js +14 -13
- package/dist/graph/algorithms/bfs.js.map +1 -1
- package/dist/graph/algorithms/tarjan.d.ts.map +1 -1
- package/dist/graph/algorithms/tarjan.js +5 -0
- package/dist/graph/algorithms/tarjan.js.map +1 -1
- package/dist/graph/builders/dependency.js +28 -22
- package/dist/graph/builders/dependency.js.map +1 -1
- package/dist/graph/classifiers/roles.d.ts +10 -1
- package/dist/graph/classifiers/roles.d.ts.map +1 -1
- package/dist/graph/classifiers/roles.js +60 -6
- package/dist/graph/classifiers/roles.js.map +1 -1
- package/dist/infrastructure/config.d.ts +10 -0
- package/dist/infrastructure/config.d.ts.map +1 -1
- package/dist/infrastructure/config.js +31 -3
- package/dist/infrastructure/config.js.map +1 -1
- package/dist/infrastructure/registry.d.ts +0 -7
- package/dist/infrastructure/registry.d.ts.map +1 -1
- package/dist/infrastructure/registry.js +29 -13
- package/dist/infrastructure/registry.js.map +1 -1
- package/dist/infrastructure/update-check.d.ts.map +1 -1
- package/dist/infrastructure/update-check.js +49 -31
- package/dist/infrastructure/update-check.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -10
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/ast-query.d.ts +1 -1
- package/dist/mcp/tools/ast-query.d.ts.map +1 -1
- package/dist/mcp/tools/audit.d.ts +1 -1
- package/dist/mcp/tools/audit.d.ts.map +1 -1
- package/dist/mcp/tools/batch-query.d.ts +1 -1
- package/dist/mcp/tools/batch-query.d.ts.map +1 -1
- package/dist/mcp/tools/branch-compare.d.ts +1 -1
- package/dist/mcp/tools/branch-compare.d.ts.map +1 -1
- package/dist/mcp/tools/brief.d.ts +1 -1
- package/dist/mcp/tools/brief.d.ts.map +1 -1
- package/dist/mcp/tools/cfg.d.ts +1 -1
- package/dist/mcp/tools/cfg.d.ts.map +1 -1
- package/dist/mcp/tools/check.d.ts +1 -1
- package/dist/mcp/tools/check.d.ts.map +1 -1
- package/dist/mcp/tools/co-changes.d.ts +1 -1
- package/dist/mcp/tools/co-changes.d.ts.map +1 -1
- package/dist/mcp/tools/code-owners.d.ts +1 -1
- package/dist/mcp/tools/code-owners.d.ts.map +1 -1
- package/dist/mcp/tools/communities.d.ts +1 -1
- package/dist/mcp/tools/communities.d.ts.map +1 -1
- package/dist/mcp/tools/complexity.d.ts +1 -1
- package/dist/mcp/tools/complexity.d.ts.map +1 -1
- package/dist/mcp/tools/context.d.ts +1 -1
- package/dist/mcp/tools/context.d.ts.map +1 -1
- package/dist/mcp/tools/dataflow.d.ts +1 -1
- package/dist/mcp/tools/dataflow.d.ts.map +1 -1
- package/dist/mcp/tools/diff-impact.d.ts +1 -1
- package/dist/mcp/tools/diff-impact.d.ts.map +1 -1
- package/dist/mcp/tools/execution-flow.d.ts +1 -1
- package/dist/mcp/tools/execution-flow.d.ts.map +1 -1
- package/dist/mcp/tools/export-graph.d.ts +1 -1
- package/dist/mcp/tools/export-graph.d.ts.map +1 -1
- package/dist/mcp/tools/file-deps.d.ts +1 -1
- package/dist/mcp/tools/file-deps.d.ts.map +1 -1
- package/dist/mcp/tools/file-exports.d.ts +1 -1
- package/dist/mcp/tools/file-exports.d.ts.map +1 -1
- package/dist/mcp/tools/find-cycles.d.ts +1 -1
- package/dist/mcp/tools/find-cycles.d.ts.map +1 -1
- package/dist/mcp/tools/fn-impact.d.ts +1 -1
- package/dist/mcp/tools/fn-impact.d.ts.map +1 -1
- package/dist/mcp/tools/impact-analysis.d.ts +1 -1
- package/dist/mcp/tools/impact-analysis.d.ts.map +1 -1
- package/dist/mcp/tools/implementations.d.ts +1 -1
- package/dist/mcp/tools/implementations.d.ts.map +1 -1
- package/dist/mcp/tools/index.d.ts +2 -5
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/interfaces.d.ts +1 -1
- package/dist/mcp/tools/interfaces.d.ts.map +1 -1
- package/dist/mcp/tools/list-functions.d.ts +1 -1
- package/dist/mcp/tools/list-functions.d.ts.map +1 -1
- package/dist/mcp/tools/list-repos.d.ts +1 -1
- package/dist/mcp/tools/list-repos.d.ts.map +1 -1
- package/dist/mcp/tools/module-map.d.ts +1 -1
- package/dist/mcp/tools/module-map.d.ts.map +1 -1
- package/dist/mcp/tools/node-roles.d.ts +1 -1
- package/dist/mcp/tools/node-roles.d.ts.map +1 -1
- package/dist/mcp/tools/path.d.ts +1 -1
- package/dist/mcp/tools/path.d.ts.map +1 -1
- package/dist/mcp/tools/query.d.ts +1 -1
- package/dist/mcp/tools/query.d.ts.map +1 -1
- package/dist/mcp/tools/semantic-search.d.ts +1 -1
- package/dist/mcp/tools/semantic-search.d.ts.map +1 -1
- package/dist/mcp/tools/sequence.d.ts +1 -1
- package/dist/mcp/tools/sequence.d.ts.map +1 -1
- package/dist/mcp/tools/structure.d.ts +1 -1
- package/dist/mcp/tools/structure.d.ts.map +1 -1
- package/dist/mcp/tools/symbol-children.d.ts +1 -1
- package/dist/mcp/tools/symbol-children.d.ts.map +1 -1
- package/dist/mcp/tools/triage.d.ts +1 -1
- package/dist/mcp/tools/triage.d.ts.map +1 -1
- package/dist/mcp/tools/where.d.ts +1 -1
- package/dist/mcp/tools/where.d.ts.map +1 -1
- package/dist/mcp/types.d.ts +19 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +6 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/presentation/queries-cli/index.d.ts +1 -1
- package/dist/presentation/queries-cli/index.d.ts.map +1 -1
- package/dist/presentation/queries-cli/index.js +1 -1
- package/dist/presentation/queries-cli/index.js.map +1 -1
- package/dist/presentation/queries-cli/overview.d.ts +1 -0
- package/dist/presentation/queries-cli/overview.d.ts.map +1 -1
- package/dist/presentation/queries-cli/overview.js +20 -1
- package/dist/presentation/queries-cli/overview.js.map +1 -1
- package/dist/presentation/queries-cli.d.ts +1 -1
- package/dist/presentation/queries-cli.d.ts.map +1 -1
- package/dist/presentation/queries-cli.js +1 -1
- package/dist/presentation/queries-cli.js.map +1 -1
- package/dist/presentation/viewer.d.ts.map +1 -1
- package/dist/presentation/viewer.js +45 -32
- package/dist/presentation/viewer.js.map +1 -1
- package/dist/shared/constants.d.ts +21 -0
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +25 -0
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/normalize.d.ts.map +1 -1
- package/dist/shared/normalize.js +12 -22
- package/dist/shared/normalize.js.map +1 -1
- package/dist/shared/paginate.d.ts +4 -17
- package/dist/shared/paginate.d.ts.map +1 -1
- package/dist/shared/paginate.js.map +1 -1
- package/dist/types.d.ts +76 -1
- package/dist/types.d.ts.map +1 -1
- package/grammars/tree-sitter-erlang.wasm +0 -0
- package/package.json +7 -7
- package/src/ast-analysis/engine.ts +43 -63
- package/src/ast-analysis/rules/b2.ts +263 -0
- package/src/ast-analysis/rules/b3.ts +127 -0
- package/src/ast-analysis/rules/b4.ts +378 -0
- package/src/ast-analysis/rules/b5.ts +65 -0
- package/src/ast-analysis/rules/c.ts +157 -0
- package/src/ast-analysis/rules/index.ts +34 -0
- package/src/ast-analysis/rules/javascript.ts +3 -0
- package/src/ast-analysis/shared.ts +2 -0
- package/src/ast-analysis/visitor-utils.ts +5 -0
- package/src/ast-analysis/visitor.ts +82 -52
- package/src/ast-analysis/visitors/cfg-visitor.ts +198 -84
- package/src/ast-analysis/visitors/complexity-visitor.ts +44 -16
- package/src/ast-analysis/visitors/dataflow-visitor.ts +68 -29
- package/src/cli/commands/config.ts +184 -184
- package/src/cli/commands/roles.ts +6 -1
- package/src/db/better-sqlite3.ts +5 -4
- package/src/db/connection.ts +23 -5
- package/src/db/index.ts +1 -0
- package/src/db/migrations.ts +68 -0
- package/src/db/repository/build-stmts.ts +30 -0
- package/src/db/repository/dataflow.ts +16 -0
- package/src/db/repository/index.ts +1 -1
- package/src/db/repository/native-repository.ts +56 -40
- package/src/domain/analysis/fn-impact.ts +4 -0
- package/src/domain/analysis/module-map.ts +38 -6
- package/src/domain/analysis/roles.ts +23 -0
- package/src/domain/graph/builder/call-resolver.ts +112 -232
- package/src/domain/graph/builder/context.ts +1 -0
- package/src/domain/graph/builder/helpers.ts +190 -72
- package/src/domain/graph/builder/incremental.ts +249 -120
- package/src/domain/graph/builder/pipeline.ts +11 -5
- package/src/domain/graph/builder/stages/build-edges.ts +696 -296
- package/src/domain/graph/builder/stages/collect-files.ts +12 -6
- package/src/domain/graph/builder/stages/detect-changes.ts +3 -1
- package/src/domain/graph/builder/stages/native-orchestrator.ts +1102 -590
- package/src/domain/graph/resolver/points-to.ts +182 -59
- package/src/domain/graph/resolver/strategy.ts +265 -0
- package/src/domain/graph/watcher.ts +19 -9
- package/src/domain/parser.ts +12 -2
- package/src/domain/queries.ts +1 -1
- package/src/domain/wasm-worker-entry.ts +3 -0
- package/src/domain/wasm-worker-pool.ts +28 -4
- package/src/domain/wasm-worker-protocol.ts +4 -0
- package/src/extractors/dart.ts +48 -3
- package/src/extractors/groovy.ts +62 -2
- package/src/extractors/helpers.ts +5 -2
- package/src/extractors/java.ts +80 -1
- package/src/extractors/javascript.ts +566 -161
- package/src/extractors/kotlin.ts +57 -3
- package/src/extractors/objc.ts +25 -1
- package/src/extractors/scala.ts +63 -1
- package/src/extractors/swift.ts +46 -3
- package/src/features/audit.ts +43 -34
- package/src/features/boundaries.ts +17 -9
- package/src/features/cfg.ts +31 -22
- package/src/features/check.ts +21 -5
- package/src/features/communities.ts +28 -19
- package/src/features/dataflow.ts +755 -6
- package/src/features/manifesto.ts +76 -75
- package/src/features/sequence.ts +29 -23
- package/src/features/snapshot.ts +36 -25
- package/src/features/structure.ts +185 -55
- package/src/features/triage.ts +28 -15
- package/src/graph/algorithms/bfs.ts +13 -12
- package/src/graph/algorithms/tarjan.ts +5 -0
- package/src/graph/builders/dependency.ts +35 -23
- package/src/graph/classifiers/roles.ts +74 -7
- package/src/infrastructure/config.ts +32 -3
- package/src/infrastructure/registry.ts +44 -20
- package/src/infrastructure/update-check.ts +55 -33
- package/src/mcp/server.ts +2 -8
- package/src/mcp/tools/ast-query.ts +1 -1
- package/src/mcp/tools/audit.ts +1 -1
- package/src/mcp/tools/batch-query.ts +1 -1
- package/src/mcp/tools/branch-compare.ts +1 -1
- package/src/mcp/tools/brief.ts +1 -1
- package/src/mcp/tools/cfg.ts +1 -1
- package/src/mcp/tools/check.ts +1 -1
- package/src/mcp/tools/co-changes.ts +1 -1
- package/src/mcp/tools/code-owners.ts +1 -1
- package/src/mcp/tools/communities.ts +1 -1
- package/src/mcp/tools/complexity.ts +1 -1
- package/src/mcp/tools/context.ts +1 -1
- package/src/mcp/tools/dataflow.ts +1 -1
- package/src/mcp/tools/diff-impact.ts +1 -1
- package/src/mcp/tools/execution-flow.ts +1 -1
- package/src/mcp/tools/export-graph.ts +1 -1
- package/src/mcp/tools/file-deps.ts +1 -1
- package/src/mcp/tools/file-exports.ts +1 -1
- package/src/mcp/tools/find-cycles.ts +1 -1
- package/src/mcp/tools/fn-impact.ts +1 -1
- package/src/mcp/tools/impact-analysis.ts +1 -1
- package/src/mcp/tools/implementations.ts +1 -1
- package/src/mcp/tools/index.ts +2 -5
- package/src/mcp/tools/interfaces.ts +1 -1
- package/src/mcp/tools/list-functions.ts +1 -1
- package/src/mcp/tools/list-repos.ts +1 -1
- package/src/mcp/tools/module-map.ts +1 -1
- package/src/mcp/tools/node-roles.ts +1 -1
- package/src/mcp/tools/path.ts +1 -1
- package/src/mcp/tools/query.ts +1 -1
- package/src/mcp/tools/semantic-search.ts +1 -1
- package/src/mcp/tools/sequence.ts +1 -1
- package/src/mcp/tools/structure.ts +1 -1
- package/src/mcp/tools/symbol-children.ts +1 -1
- package/src/mcp/tools/triage.ts +1 -1
- package/src/mcp/tools/where.ts +1 -1
- package/src/mcp/types.ts +21 -0
- package/src/presentation/queries-cli/index.ts +1 -1
- package/src/presentation/queries-cli/overview.ts +35 -1
- package/src/presentation/queries-cli.ts +1 -0
- package/src/presentation/viewer.ts +98 -87
- package/src/shared/constants.ts +26 -0
- package/src/shared/normalize.ts +13 -22
- package/src/shared/paginate.ts +4 -18
- package/src/types.ts +86 -1
package/src/domain/queries.ts
CHANGED
|
@@ -39,7 +39,7 @@ export {
|
|
|
39
39
|
moduleMapData,
|
|
40
40
|
statsData,
|
|
41
41
|
} from './analysis/module-map.js';
|
|
42
|
-
export { rolesData } from './analysis/roles.js';
|
|
42
|
+
export { dynamicCallsData, rolesData } from './analysis/roles.js';
|
|
43
43
|
// ── Analysis modules ─────────────────────────────────────────────────────
|
|
44
44
|
export {
|
|
45
45
|
childrenData,
|
|
@@ -834,6 +834,9 @@ function serializeExtractorOutput(
|
|
|
834
834
|
? { returnTypeMap: Array.from(symbols.returnTypeMap.entries()) }
|
|
835
835
|
: {}),
|
|
836
836
|
...(symbols.callAssignments?.length ? { callAssignments: symbols.callAssignments } : {}),
|
|
837
|
+
...(symbols.cjsRequireBindings?.length
|
|
838
|
+
? { cjsRequireBindings: symbols.cjsRequireBindings }
|
|
839
|
+
: {}),
|
|
837
840
|
};
|
|
838
841
|
}
|
|
839
842
|
|
|
@@ -86,11 +86,14 @@ interface PendingJob {
|
|
|
86
86
|
*/
|
|
87
87
|
const WORKER_PARSE_TIMEOUT_MS = 60_000;
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
/** Deserialize the core fields and metadata scalars from a serialized result. */
|
|
90
|
+
function deserializeCoreFields(
|
|
91
|
+
ser: SerializedExtractorOutput,
|
|
92
|
+
): Pick<ExtractorOutput, 'definitions' | 'calls' | 'imports' | 'classes' | 'exports' | 'typeMap'> &
|
|
93
|
+
Partial<Pick<ExtractorOutput, '_langId' | '_lineCount' | 'dataflow' | 'astNodes'>> {
|
|
91
94
|
const typeMap = new Map<string, TypeMapEntry>();
|
|
92
95
|
for (const [k, v] of ser.typeMap) typeMap.set(k, v);
|
|
93
|
-
const out:
|
|
96
|
+
const out: ReturnType<typeof deserializeCoreFields> = {
|
|
94
97
|
definitions: ser.definitions,
|
|
95
98
|
calls: ser.calls,
|
|
96
99
|
imports: ser.imports,
|
|
@@ -106,6 +109,11 @@ function deserializeResult(ser: SerializedExtractorOutput | null): ExtractorOutp
|
|
|
106
109
|
// {line, kind, name, text?, receiver?} shape — see engine.ts:822 where the
|
|
107
110
|
// visitor output is cast the same way.
|
|
108
111
|
if (ser.astNodes !== undefined) out.astNodes = ser.astNodes as unknown as ASTNodeRow[];
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Deserialize the simple array binding fields (present when non-empty). */
|
|
116
|
+
function deserializeBindingFields(ser: SerializedExtractorOutput, out: ExtractorOutput): void {
|
|
109
117
|
if (ser.fnRefBindings?.length) out.fnRefBindings = ser.fnRefBindings;
|
|
110
118
|
if (ser.paramBindings?.length) out.paramBindings = ser.paramBindings;
|
|
111
119
|
if (ser.arrayElemBindings?.length) out.arrayElemBindings = ser.arrayElemBindings;
|
|
@@ -117,6 +125,12 @@ function deserializeResult(ser: SerializedExtractorOutput | null): ExtractorOutp
|
|
|
117
125
|
if (ser.objectPropBindings?.length) out.objectPropBindings = ser.objectPropBindings;
|
|
118
126
|
if (ser.thisCallBindings?.length) out.thisCallBindings = ser.thisCallBindings;
|
|
119
127
|
if (ser.newExpressions?.length) out.newExpressions = ser.newExpressions;
|
|
128
|
+
if (ser.callAssignments?.length) out.callAssignments = ser.callAssignments;
|
|
129
|
+
if (ser.cjsRequireBindings?.length) out.cjsRequireBindings = ser.cjsRequireBindings;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Deserialize the Map-typed fields that require entry-by-entry reconstruction. */
|
|
133
|
+
function deserializeMapFields(ser: SerializedExtractorOutput, out: ExtractorOutput): void {
|
|
120
134
|
if (ser.definePropertyReceivers?.length) {
|
|
121
135
|
const m = new Map<string, string>();
|
|
122
136
|
for (const [k, v] of ser.definePropertyReceivers) m.set(k, v);
|
|
@@ -127,7 +141,17 @@ function deserializeResult(ser: SerializedExtractorOutput | null): ExtractorOutp
|
|
|
127
141
|
for (const [k, v] of ser.returnTypeMap) returnTypeMap.set(k, v);
|
|
128
142
|
out.returnTypeMap = returnTypeMap;
|
|
129
143
|
}
|
|
130
|
-
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function deserializeResult(ser: SerializedExtractorOutput | null): ExtractorOutput | null {
|
|
147
|
+
if (!ser) return null;
|
|
148
|
+
// deserializeCoreFields supplies all required ExtractorOutput fields (definitions,
|
|
149
|
+
// calls, imports, classes, exports, typeMap). The cast is safe: every required field
|
|
150
|
+
// is present in the returned Pick. If a new required field is added to ExtractorOutput,
|
|
151
|
+
// add it to deserializeCoreFields' return Pick and body to keep the cast honest.
|
|
152
|
+
const out = { ...deserializeCoreFields(ser) } as ExtractorOutput;
|
|
153
|
+
deserializeBindingFields(ser, out);
|
|
154
|
+
deserializeMapFields(ser, out);
|
|
131
155
|
return out;
|
|
132
156
|
}
|
|
133
157
|
|
|
@@ -77,6 +77,10 @@ export interface SerializedExtractorOutput {
|
|
|
77
77
|
definePropertyReceivers?: Array<[string, string]>;
|
|
78
78
|
returnTypeMap?: Array<[string, TypeMapEntry]>;
|
|
79
79
|
callAssignments?: CallAssignment[];
|
|
80
|
+
/** Variable-level dataflow vertices extracted during parsing (P1+). */
|
|
81
|
+
dataflowVertices?: import('../types.js').DataflowVertex[];
|
|
82
|
+
/** CJS require bindings — see ExtractorOutput.cjsRequireBindings (#1661). */
|
|
83
|
+
cjsRequireBindings?: Array<{ names: string[]; source: string }>;
|
|
80
84
|
}
|
|
81
85
|
|
|
82
86
|
export interface WorkerParseResponseOk {
|
package/src/extractors/dart.ts
CHANGED
|
@@ -255,14 +255,59 @@ function handleDartSelector(node: TreeSitterNode, ctx: ExtractorOutput): void {
|
|
|
255
255
|
const argPart = findChild(node, 'argument_part');
|
|
256
256
|
if (!argPart) return;
|
|
257
257
|
|
|
258
|
-
|
|
258
|
+
const line = node.startPosition.row + 1;
|
|
259
|
+
|
|
260
|
+
// Look for the identifier this selector belongs to.
|
|
261
|
+
// Two layouts are possible depending on grammar version:
|
|
262
|
+
// A) selector has both unconditional_assignable_selector + argument_part (same node)
|
|
263
|
+
// B) one selector node holds unconditional_assignable_selector (.method),
|
|
264
|
+
// the next holds argument_part (the call args) — method name is in the previous sibling
|
|
259
265
|
const unconditional = findChild(node, 'unconditional_assignable_selector');
|
|
266
|
+
let methodName: string | null = null;
|
|
267
|
+
|
|
260
268
|
if (unconditional) {
|
|
261
269
|
const id = findChild(unconditional, 'identifier');
|
|
262
|
-
if (id)
|
|
263
|
-
|
|
270
|
+
if (id) methodName = id.text;
|
|
271
|
+
} else {
|
|
272
|
+
// Layout B: look at the previous sibling selector for the method name
|
|
273
|
+
const parent = node.parent;
|
|
274
|
+
if (parent) {
|
|
275
|
+
for (let i = 0; i < parent.childCount; i++) {
|
|
276
|
+
const sibling = parent.child(i);
|
|
277
|
+
if (sibling === node) break;
|
|
278
|
+
if (sibling?.type === 'selector') {
|
|
279
|
+
const unc2 = findChild(sibling, 'unconditional_assignable_selector');
|
|
280
|
+
if (unc2) {
|
|
281
|
+
const id2 = findChild(unc2, 'identifier');
|
|
282
|
+
if (id2) methodName = id2.text;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
264
286
|
}
|
|
265
287
|
}
|
|
288
|
+
|
|
289
|
+
if (!methodName) return;
|
|
290
|
+
|
|
291
|
+
// Function.apply(fn, positionalArgs, namedArgs) — dynamic higher-order dispatch
|
|
292
|
+
if (methodName === 'apply') {
|
|
293
|
+
const parent = node.parent;
|
|
294
|
+
if (parent) {
|
|
295
|
+
for (let i = 0; i < parent.childCount; i++) {
|
|
296
|
+
const sibling = parent.child(i);
|
|
297
|
+
if (sibling && sibling !== node && sibling.text === 'Function') {
|
|
298
|
+
ctx.calls.push({
|
|
299
|
+
name: '<dynamic:unresolved>',
|
|
300
|
+
line,
|
|
301
|
+
dynamic: true,
|
|
302
|
+
dynamicKind: 'unresolved-dynamic',
|
|
303
|
+
});
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
ctx.calls.push({ name: methodName, line });
|
|
266
311
|
}
|
|
267
312
|
|
|
268
313
|
function handleDartTypeAlias(node: TreeSitterNode, ctx: ExtractorOutput): void {
|
package/src/extractors/groovy.ts
CHANGED
|
@@ -292,8 +292,26 @@ function handleGroovyImport(node: TreeSitterNode, ctx: ExtractorOutput): void {
|
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
|
|
295
|
+
/** Extract the first string literal argument from a Groovy call node. */
|
|
296
|
+
function getFirstStringArgGroovy(node: TreeSitterNode): string | null {
|
|
297
|
+
const args = node.childForFieldName('arguments') || findChild(node, 'argument_list');
|
|
298
|
+
if (!args) return null;
|
|
299
|
+
for (let i = 0; i < args.childCount; i++) {
|
|
300
|
+
const child = args.child(i);
|
|
301
|
+
if (!child) continue;
|
|
302
|
+
const t = child.type;
|
|
303
|
+
if (t === '(' || t === ')' || t === ',') continue;
|
|
304
|
+
if (t === 'string' || t === 'string_literal' || t === 'string_fragment') {
|
|
305
|
+
return child.text.replace(/^["']|["']$/g, '');
|
|
306
|
+
}
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
|
|
295
312
|
function handleGroovyCallExpr(node: TreeSitterNode, ctx: ExtractorOutput): void {
|
|
296
313
|
const call: Call = { name: '', line: node.startPosition.row + 1 };
|
|
314
|
+
let fieldNode: TreeSitterNode | null = null;
|
|
297
315
|
|
|
298
316
|
// Try standard call_expression pattern
|
|
299
317
|
const funcNode = node.childForFieldName('function') || node.childForFieldName('method');
|
|
@@ -301,7 +319,10 @@ function handleGroovyCallExpr(node: TreeSitterNode, ctx: ExtractorOutput): void
|
|
|
301
319
|
if (funcNode.type === 'field_expression' || funcNode.type === 'member_access') {
|
|
302
320
|
const field = funcNode.childForFieldName('field') || funcNode.childForFieldName('property');
|
|
303
321
|
const obj = funcNode.childForFieldName('argument') || funcNode.childForFieldName('object');
|
|
304
|
-
if (field)
|
|
322
|
+
if (field) {
|
|
323
|
+
fieldNode = field;
|
|
324
|
+
call.name = field.text;
|
|
325
|
+
}
|
|
305
326
|
if (obj) call.receiver = obj.text;
|
|
306
327
|
} else {
|
|
307
328
|
call.name = funcNode.text;
|
|
@@ -311,12 +332,51 @@ function handleGroovyCallExpr(node: TreeSitterNode, ctx: ExtractorOutput): void
|
|
|
311
332
|
const nameNode = node.childForFieldName('name');
|
|
312
333
|
const obj = node.childForFieldName('object');
|
|
313
334
|
if (nameNode) {
|
|
335
|
+
fieldNode = nameNode;
|
|
314
336
|
call.name = nameNode.text;
|
|
315
337
|
if (obj) call.receiver = obj.text;
|
|
316
338
|
}
|
|
317
339
|
}
|
|
318
340
|
|
|
319
|
-
if (call.name)
|
|
341
|
+
if (!call.name) return;
|
|
342
|
+
|
|
343
|
+
// obj."$dyn"() or obj."${var}"() — GString method name; cannot resolve statically
|
|
344
|
+
if (fieldNode && (fieldNode.type === 'gstring' || fieldNode.type === 'template_string')) {
|
|
345
|
+
ctx.calls.push({
|
|
346
|
+
name: '<dynamic:unresolved>',
|
|
347
|
+
line: call.line,
|
|
348
|
+
dynamic: true,
|
|
349
|
+
dynamicKind: 'unresolved-dynamic',
|
|
350
|
+
receiver: call.receiver,
|
|
351
|
+
});
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// obj.invokeMethod("name", args) — Groovy's explicit dynamic dispatch
|
|
356
|
+
if (call.name === 'invokeMethod') {
|
|
357
|
+
const literal = getFirstStringArgGroovy(node);
|
|
358
|
+
if (literal) {
|
|
359
|
+
ctx.calls.push({
|
|
360
|
+
name: literal,
|
|
361
|
+
line: call.line,
|
|
362
|
+
dynamic: true,
|
|
363
|
+
dynamicKind: 'reflection',
|
|
364
|
+
keyExpr: literal,
|
|
365
|
+
receiver: call.receiver,
|
|
366
|
+
});
|
|
367
|
+
} else {
|
|
368
|
+
ctx.calls.push({
|
|
369
|
+
name: '<dynamic:computed-key>',
|
|
370
|
+
line: call.line,
|
|
371
|
+
dynamic: true,
|
|
372
|
+
dynamicKind: 'computed-key',
|
|
373
|
+
receiver: call.receiver,
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
ctx.calls.push(call);
|
|
320
380
|
}
|
|
321
381
|
|
|
322
382
|
function handleGroovyObjectCreation(node: TreeSitterNode, ctx: ExtractorOutput): void {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
Call,
|
|
3
|
+
DynamicKind,
|
|
3
4
|
ExtractorOutput,
|
|
4
5
|
Import,
|
|
5
6
|
SubDeclaration,
|
|
@@ -270,18 +271,20 @@ export function extractModifierVisibility(
|
|
|
270
271
|
|
|
271
272
|
/**
|
|
272
273
|
* Append a `Call` to the extractor output. `line` defaults to the start line of
|
|
273
|
-
* `node`; pass `extra` for `receiver` / `dynamic`
|
|
274
|
+
* `node`; pass `extra` for `receiver` / `dynamic` / `dynamicKind` / `keyExpr` fields.
|
|
274
275
|
*/
|
|
275
276
|
export function pushCall(
|
|
276
277
|
ctx: ExtractorOutput,
|
|
277
278
|
node: TreeSitterNode,
|
|
278
279
|
name: string,
|
|
279
|
-
extra: { receiver?: string; dynamic?: boolean } = {},
|
|
280
|
+
extra: { receiver?: string; dynamic?: boolean; dynamicKind?: DynamicKind; keyExpr?: string } = {},
|
|
280
281
|
): void {
|
|
281
282
|
if (!name) return;
|
|
282
283
|
const call: Call = { name, line: nodeStartLine(node) };
|
|
283
284
|
if (extra.receiver !== undefined) call.receiver = extra.receiver;
|
|
284
285
|
if (extra.dynamic !== undefined) call.dynamic = extra.dynamic;
|
|
286
|
+
if (extra.dynamicKind !== undefined) call.dynamicKind = extra.dynamicKind;
|
|
287
|
+
if (extra.keyExpr !== undefined) call.keyExpr = extra.keyExpr;
|
|
285
288
|
ctx.calls.push(call);
|
|
286
289
|
}
|
|
287
290
|
|
package/src/extractors/java.ts
CHANGED
|
@@ -258,11 +258,90 @@ function handleJavaImportDecl(node: TreeSitterNode, ctx: ExtractorOutput): void
|
|
|
258
258
|
}
|
|
259
259
|
}
|
|
260
260
|
|
|
261
|
+
/** Extract the first string literal argument from a method_invocation node. */
|
|
262
|
+
function getFirstStringArgJava(node: TreeSitterNode): string | null {
|
|
263
|
+
const args = node.childForFieldName('arguments') || findChild(node, 'argument_list');
|
|
264
|
+
if (!args) return null;
|
|
265
|
+
for (let i = 0; i < args.childCount; i++) {
|
|
266
|
+
const child = args.child(i);
|
|
267
|
+
if (!child) continue;
|
|
268
|
+
const t = child.type;
|
|
269
|
+
if (t === '(' || t === ')' || t === ',') continue;
|
|
270
|
+
if (t === 'string_literal' || t === 'string_fragment') {
|
|
271
|
+
return child.text.replace(/^["']|["']$/g, '');
|
|
272
|
+
}
|
|
273
|
+
break; // First real argument is not a string — stop
|
|
274
|
+
}
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
|
|
261
278
|
function handleJavaMethodInvocation(node: TreeSitterNode, ctx: ExtractorOutput): void {
|
|
262
279
|
const nameNode = node.childForFieldName('name');
|
|
263
280
|
if (!nameNode) return;
|
|
264
281
|
const obj = node.childForFieldName('object');
|
|
265
|
-
|
|
282
|
+
const methodName = nameNode.text;
|
|
283
|
+
const receiver = obj?.text;
|
|
284
|
+
|
|
285
|
+
// Method.invoke(target, args) — runtime reflection, target not statically knowable.
|
|
286
|
+
// Require a non-null receiver to avoid false positives on user-defined `invoke` methods
|
|
287
|
+
// (e.g. executor services, command/strategy objects, Kotlin lambdas). The Java Reflection
|
|
288
|
+
// API always calls this on a `java.lang.reflect.Method` object, never bare.
|
|
289
|
+
if (methodName === 'invoke' && receiver !== undefined) {
|
|
290
|
+
pushCall(ctx, node, '<dynamic:unresolved>', {
|
|
291
|
+
dynamic: true,
|
|
292
|
+
dynamicKind: 'unresolved-dynamic',
|
|
293
|
+
receiver,
|
|
294
|
+
});
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// clazz.getMethod("name") / getDeclaredMethod("name") — resolvable if literal arg.
|
|
299
|
+
// Require a non-null receiver to avoid false positives on gRPC ServiceDescriptor.getMethod(),
|
|
300
|
+
// Spring AnnotationUtils.getDeclaredMethod(), proto-generated descriptors, and any other API
|
|
301
|
+
// that exposes a method by this name unrelated to java.lang.Class reflection.
|
|
302
|
+
if (
|
|
303
|
+
(methodName === 'getMethod' || methodName === 'getDeclaredMethod') &&
|
|
304
|
+
receiver !== undefined
|
|
305
|
+
) {
|
|
306
|
+
const literal = getFirstStringArgJava(node);
|
|
307
|
+
if (literal) {
|
|
308
|
+
pushCall(ctx, node, literal, {
|
|
309
|
+
dynamic: true,
|
|
310
|
+
dynamicKind: 'reflection',
|
|
311
|
+
keyExpr: literal,
|
|
312
|
+
receiver,
|
|
313
|
+
});
|
|
314
|
+
} else {
|
|
315
|
+
const args = node.childForFieldName('arguments') || findChild(node, 'argument_list');
|
|
316
|
+
const firstArg = args?.child(1); // skip '('
|
|
317
|
+
const keyExpr = firstArg?.text;
|
|
318
|
+
pushCall(ctx, node, '<dynamic:computed-key>', {
|
|
319
|
+
dynamic: true,
|
|
320
|
+
dynamicKind: 'computed-key',
|
|
321
|
+
keyExpr: keyExpr ?? undefined,
|
|
322
|
+
receiver,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Class.forName("pkg.ClassName") — dynamic class loading; flag as unresolved
|
|
329
|
+
// (loading a class is not the same as calling it — don't emit a call edge).
|
|
330
|
+
// Guard on receiver === 'Class' to avoid false positives from user-defined
|
|
331
|
+
// `forName()` factory methods (e.g. Currency.forName("USD"), Enum.forName(...)).
|
|
332
|
+
if (methodName === 'forName' && receiver === 'Class') {
|
|
333
|
+
const literal = getFirstStringArgJava(node);
|
|
334
|
+
pushCall(ctx, node, '<dynamic:unresolved>', {
|
|
335
|
+
dynamic: true,
|
|
336
|
+
dynamicKind: 'unresolved-dynamic',
|
|
337
|
+
keyExpr: literal ?? undefined,
|
|
338
|
+
receiver,
|
|
339
|
+
});
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Normal method invocation
|
|
344
|
+
pushCall(ctx, node, methodName, receiver ? { receiver } : {});
|
|
266
345
|
}
|
|
267
346
|
|
|
268
347
|
function handleJavaLocalVarDecl(node: TreeSitterNode, ctx: ExtractorOutput): void {
|