gitnexus 1.6.8-rc.8 → 1.6.8
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 +3 -3
- package/dist/_shared/graph/types.d.ts +31 -1
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +11 -1
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +6 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +21 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/symbol-definition.d.ts +6 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +31 -1
- package/dist/cli/ai-context.js +18 -16
- package/dist/cli/analyze-config.js +11 -0
- package/dist/cli/analyze.d.ts +14 -0
- package/dist/cli/analyze.js +98 -0
- package/dist/cli/embedding-dims.d.ts +33 -0
- package/dist/cli/embedding-dims.js +39 -0
- package/dist/cli/eval-server.d.ts +8 -0
- package/dist/cli/eval-server.js +242 -2
- package/dist/cli/help-i18n.js +19 -0
- package/dist/cli/i18n/en.d.ts +15 -1
- package/dist/cli/i18n/en.js +15 -1
- package/dist/cli/i18n/resources.d.ts +29 -1
- package/dist/cli/i18n/zh-CN.d.ts +14 -0
- package/dist/cli/i18n/zh-CN.js +15 -1
- package/dist/cli/index.js +89 -1
- package/dist/cli/mcp.d.ts +6 -1
- package/dist/cli/mcp.js +26 -1
- package/dist/cli/optional-grammars.d.ts +6 -8
- package/dist/cli/optional-grammars.js +8 -11
- package/dist/cli/setup.d.ts +3 -1
- package/dist/cli/setup.js +67 -17
- package/dist/cli/skill-gen.js +2 -1
- package/dist/cli/tool.d.ts +19 -1
- package/dist/cli/tool.js +96 -3
- package/dist/core/embeddings/hf-env.d.ts +0 -66
- package/dist/core/embeddings/http-client.d.ts +7 -0
- package/dist/core/embeddings/http-client.js +5 -3
- package/dist/core/embeddings/server-mapping.d.ts +1 -1
- package/dist/core/embeddings/server-mapping.js +7 -3
- package/dist/core/graph/import-cycles.d.ts +10 -0
- package/dist/core/graph/import-cycles.js +103 -0
- package/dist/core/group/cross-impact.d.ts +2 -1
- package/dist/core/group/cross-impact.js +5 -1
- package/dist/core/group/extractors/grpc-patterns/proto.js +10 -6
- package/dist/core/group/extractors/http-patterns/kotlin.js +7 -7
- package/dist/core/group/extractors/http-route-extractor.d.ts +24 -0
- package/dist/core/group/extractors/http-route-extractor.js +22 -4
- package/dist/core/group/extractors/include-extractor.js +22 -13
- package/dist/core/group/sync.d.ts +27 -1
- package/dist/core/group/sync.js +0 -0
- package/dist/core/incremental/subgraph-extract.js +18 -1
- package/dist/core/ingestion/cfg/cfg-builder.d.ts +114 -0
- package/dist/core/ingestion/cfg/cfg-builder.js +196 -0
- package/dist/core/ingestion/cfg/collect.d.ts +51 -0
- package/dist/core/ingestion/cfg/collect.js +77 -0
- package/dist/core/ingestion/cfg/control-dependence.d.ts +58 -0
- package/dist/core/ingestion/cfg/control-dependence.js +182 -0
- package/dist/core/ingestion/cfg/control-flow-context.d.ts +106 -0
- package/dist/core/ingestion/cfg/control-flow-context.js +124 -0
- package/dist/core/ingestion/cfg/emit.d.ts +293 -0
- package/dist/core/ingestion/cfg/emit.js +646 -0
- package/dist/core/ingestion/cfg/post-dominators.d.ts +79 -0
- package/dist/core/ingestion/cfg/post-dominators.js +176 -0
- package/dist/core/ingestion/cfg/reaching-def-reason-codec.d.ts +106 -0
- package/dist/core/ingestion/cfg/reaching-def-reason-codec.js +133 -0
- package/dist/core/ingestion/cfg/reaching-defs-graph.d.ts +18 -0
- package/dist/core/ingestion/cfg/reaching-defs-graph.js +312 -0
- package/dist/core/ingestion/cfg/reaching-defs.d.ts +162 -0
- package/dist/core/ingestion/cfg/reaching-defs.js +785 -0
- package/dist/core/ingestion/cfg/synthetic-escape.d.ts +124 -0
- package/dist/core/ingestion/cfg/synthetic-escape.js +300 -0
- package/dist/core/ingestion/cfg/traversal-result.d.ts +20 -0
- package/dist/core/ingestion/cfg/traversal-result.js +2 -0
- package/dist/core/ingestion/cfg/types.d.ts +274 -0
- package/dist/core/ingestion/cfg/types.js +13 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.d.ts +111 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.js +541 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp.d.ts +74 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp.js +584 -0
- package/dist/core/ingestion/cfg/visitors/call-site-harvest.d.ts +195 -0
- package/dist/core/ingestion/cfg/visitors/call-site-harvest.js +350 -0
- package/dist/core/ingestion/cfg/visitors/csharp-harvest.d.ts +124 -0
- package/dist/core/ingestion/cfg/visitors/csharp-harvest.js +589 -0
- package/dist/core/ingestion/cfg/visitors/csharp.d.ts +87 -0
- package/dist/core/ingestion/cfg/visitors/csharp.js +867 -0
- package/dist/core/ingestion/cfg/visitors/dart-harvest.d.ts +278 -0
- package/dist/core/ingestion/cfg/visitors/dart-harvest.js +870 -0
- package/dist/core/ingestion/cfg/visitors/dart.d.ts +119 -0
- package/dist/core/ingestion/cfg/visitors/dart.js +836 -0
- package/dist/core/ingestion/cfg/visitors/go-harvest.d.ts +160 -0
- package/dist/core/ingestion/cfg/visitors/go-harvest.js +621 -0
- package/dist/core/ingestion/cfg/visitors/go.d.ts +108 -0
- package/dist/core/ingestion/cfg/visitors/go.js +638 -0
- package/dist/core/ingestion/cfg/visitors/java-harvest.d.ts +108 -0
- package/dist/core/ingestion/cfg/visitors/java-harvest.js +513 -0
- package/dist/core/ingestion/cfg/visitors/java.d.ts +101 -0
- package/dist/core/ingestion/cfg/visitors/java.js +812 -0
- package/dist/core/ingestion/cfg/visitors/kotlin-harvest.d.ts +253 -0
- package/dist/core/ingestion/cfg/visitors/kotlin-harvest.js +719 -0
- package/dist/core/ingestion/cfg/visitors/kotlin.d.ts +121 -0
- package/dist/core/ingestion/cfg/visitors/kotlin.js +809 -0
- package/dist/core/ingestion/cfg/visitors/php-harvest.d.ts +172 -0
- package/dist/core/ingestion/cfg/visitors/php-harvest.js +626 -0
- package/dist/core/ingestion/cfg/visitors/php.d.ts +96 -0
- package/dist/core/ingestion/cfg/visitors/php.js +721 -0
- package/dist/core/ingestion/cfg/visitors/python-harvest.d.ts +212 -0
- package/dist/core/ingestion/cfg/visitors/python-harvest.js +739 -0
- package/dist/core/ingestion/cfg/visitors/python.d.ts +103 -0
- package/dist/core/ingestion/cfg/visitors/python.js +558 -0
- package/dist/core/ingestion/cfg/visitors/ruby-harvest.d.ts +223 -0
- package/dist/core/ingestion/cfg/visitors/ruby-harvest.js +587 -0
- package/dist/core/ingestion/cfg/visitors/ruby.d.ts +112 -0
- package/dist/core/ingestion/cfg/visitors/ruby.js +756 -0
- package/dist/core/ingestion/cfg/visitors/rust-harvest.d.ts +324 -0
- package/dist/core/ingestion/cfg/visitors/rust-harvest.js +873 -0
- package/dist/core/ingestion/cfg/visitors/rust.d.ts +95 -0
- package/dist/core/ingestion/cfg/visitors/rust.js +558 -0
- package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.d.ts +87 -0
- package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.js +116 -0
- package/dist/core/ingestion/cfg/visitors/swift-harvest.d.ts +255 -0
- package/dist/core/ingestion/cfg/visitors/swift-harvest.js +679 -0
- package/dist/core/ingestion/cfg/visitors/swift.d.ts +116 -0
- package/dist/core/ingestion/cfg/visitors/swift.js +787 -0
- package/dist/core/ingestion/cfg/visitors/typescript-harvest.d.ts +149 -0
- package/dist/core/ingestion/cfg/visitors/typescript-harvest.js +1056 -0
- package/dist/core/ingestion/cfg/visitors/typescript.d.ts +66 -0
- package/dist/core/ingestion/cfg/visitors/typescript.js +583 -0
- package/dist/core/ingestion/import-resolvers/utils.js +2 -0
- package/dist/core/ingestion/language-provider.d.ts +23 -2
- package/dist/core/ingestion/languages/c-cpp.js +17 -5
- package/dist/core/ingestion/languages/cobol.js +4 -0
- package/dist/core/ingestion/languages/cpp/arity-metadata.js +41 -2
- package/dist/core/ingestion/languages/cpp/captures.js +50 -1
- package/dist/core/ingestion/languages/cpp/conversion-rank.d.ts +2 -0
- package/dist/core/ingestion/languages/cpp/conversion-rank.js +89 -0
- package/dist/core/ingestion/languages/cpp/header-scan.d.ts +1 -1
- package/dist/core/ingestion/languages/cpp/header-scan.js +2 -2
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +7 -2
- package/dist/core/ingestion/languages/cpp/member-lookup.js +2 -1
- package/dist/core/ingestion/languages/cpp/query.js +23 -0
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +2 -1
- package/dist/core/ingestion/languages/csharp.js +2 -0
- package/dist/core/ingestion/languages/dart.js +2 -0
- package/dist/core/ingestion/languages/go.js +2 -0
- package/dist/core/ingestion/languages/java.js +3 -0
- package/dist/core/ingestion/languages/kotlin/query.js +3 -2
- package/dist/core/ingestion/languages/kotlin.js +8 -1
- package/dist/core/ingestion/languages/php.js +2 -0
- package/dist/core/ingestion/languages/python.js +2 -0
- package/dist/core/ingestion/languages/ruby.js +2 -0
- package/dist/core/ingestion/languages/rust.js +2 -0
- package/dist/core/ingestion/languages/swift.js +2 -0
- package/dist/core/ingestion/languages/typescript.js +5 -0
- package/dist/core/ingestion/languages/vue.js +6 -0
- package/dist/core/ingestion/method-extractors/configs/c-cpp.js +6 -13
- package/dist/core/ingestion/method-extractors/generic.js +1 -0
- package/dist/core/ingestion/method-types.d.ts +2 -0
- package/dist/core/ingestion/model/symbol-table.d.ts +1 -0
- package/dist/core/ingestion/model/symbol-table.js +1 -0
- package/dist/core/ingestion/mro-processor.js +109 -0
- package/dist/core/ingestion/parsing-processor.js +44 -0
- package/dist/core/ingestion/pipeline-phases/call-summaries.d.ts +26 -0
- package/dist/core/ingestion/pipeline-phases/call-summaries.js +46 -0
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +0 -21
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +18 -1
- package/dist/core/ingestion/pipeline-phases/routes.d.ts +10 -0
- package/dist/core/ingestion/pipeline-phases/routes.js +30 -1
- package/dist/core/ingestion/pipeline-phases/taint-summaries.d.ts +30 -0
- package/dist/core/ingestion/pipeline-phases/taint-summaries.js +81 -0
- package/dist/core/ingestion/pipeline.d.ts +92 -10
- package/dist/core/ingestion/pipeline.js +11 -2
- package/dist/core/ingestion/scope-extractor.js +12 -2
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +9 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +75 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +67 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +14 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +6 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +13 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +9 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +28 -2
- package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.d.ts +4 -0
- package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.js +9 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +6 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +174 -40
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +24 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +276 -190
- package/dist/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +43 -3
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +75 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +349 -1
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/taint/call-summary-codec.d.ts +75 -0
- package/dist/core/ingestion/taint/call-summary-codec.js +128 -0
- package/dist/core/ingestion/taint/call-summary-emit.d.ts +43 -0
- package/dist/core/ingestion/taint/call-summary-emit.js +70 -0
- package/dist/core/ingestion/taint/call-summary-harvest.d.ts +77 -0
- package/dist/core/ingestion/taint/call-summary-harvest.js +179 -0
- package/dist/core/ingestion/taint/call-summary-model.d.ts +47 -0
- package/dist/core/ingestion/taint/call-summary-model.js +25 -0
- package/dist/core/ingestion/taint/emit.d.ts +125 -0
- package/dist/core/ingestion/taint/emit.js +208 -0
- package/dist/core/ingestion/taint/interproc-emit.d.ts +50 -0
- package/dist/core/ingestion/taint/interproc-emit.js +88 -0
- package/dist/core/ingestion/taint/interproc-solver.d.ts +110 -0
- package/dist/core/ingestion/taint/interproc-solver.js +312 -0
- package/dist/core/ingestion/taint/match.d.ts +153 -0
- package/dist/core/ingestion/taint/match.js +278 -0
- package/dist/core/ingestion/taint/path-codec.d.ts +134 -0
- package/dist/core/ingestion/taint/path-codec.js +190 -0
- package/dist/core/ingestion/taint/propagate.d.ts +216 -0
- package/dist/core/ingestion/taint/propagate.js +659 -0
- package/dist/core/ingestion/taint/site-safety.d.ts +29 -0
- package/dist/core/ingestion/taint/site-safety.js +98 -0
- package/dist/core/ingestion/taint/source-sink-config.d.ts +107 -23
- package/dist/core/ingestion/taint/source-sink-config.js +35 -12
- package/dist/core/ingestion/taint/source-sink-registry.d.ts +6 -4
- package/dist/core/ingestion/taint/source-sink-registry.js +6 -4
- package/dist/core/ingestion/taint/summary-harvest-driver.d.ts +80 -0
- package/dist/core/ingestion/taint/summary-harvest-driver.js +179 -0
- package/dist/core/ingestion/taint/summary-harvest.d.ts +89 -0
- package/dist/core/ingestion/taint/summary-harvest.js +537 -0
- package/dist/core/ingestion/taint/summary-model.d.ts +200 -0
- package/dist/core/ingestion/taint/summary-model.js +86 -0
- package/dist/core/ingestion/taint/typescript-model.d.ts +38 -0
- package/dist/core/ingestion/taint/typescript-model.js +102 -0
- package/dist/core/ingestion/type-extractors/c-cpp.js +21 -0
- package/dist/core/ingestion/utils/env.d.ts +7 -0
- package/dist/core/ingestion/utils/env.js +12 -0
- package/dist/core/ingestion/utils/method-props.js +1 -0
- package/dist/core/ingestion/workers/clone-safety.d.ts +109 -0
- package/dist/core/ingestion/workers/clone-safety.js +465 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +23 -0
- package/dist/core/ingestion/workers/parse-worker.js +81 -53
- package/dist/core/ingestion/workers/post-result.d.ts +22 -0
- package/dist/core/ingestion/workers/post-result.js +87 -0
- package/dist/core/ingestion/workers/result-merge.d.ts +20 -0
- package/dist/core/ingestion/workers/result-merge.js +43 -0
- package/dist/core/ingestion/workers/worker-pool.d.ts +15 -40
- package/dist/core/ingestion/workers/worker-pool.js +43 -16
- package/dist/core/lbug/csv-generator.d.ts +51 -3
- package/dist/core/lbug/csv-generator.js +369 -255
- package/dist/core/lbug/lbug-adapter.d.ts +58 -18
- package/dist/core/lbug/lbug-adapter.js +346 -84
- package/dist/core/lbug/lbug-config.d.ts +19 -0
- package/dist/core/lbug/lbug-config.js +29 -0
- package/dist/core/lbug/pdg-emit-sink.d.ts +127 -0
- package/dist/core/lbug/pdg-emit-sink.js +358 -0
- package/dist/core/lbug/pool-adapter.d.ts +35 -0
- package/dist/core/lbug/pool-adapter.js +90 -1
- package/dist/core/lbug/rel-pair-routing.d.ts +54 -0
- package/dist/core/lbug/rel-pair-routing.js +140 -0
- package/dist/core/lbug/schema.d.ts +2 -2
- package/dist/core/lbug/schema.js +3 -0
- package/dist/core/logger.d.ts +0 -5
- package/dist/core/run-analyze.d.ts +96 -0
- package/dist/core/run-analyze.js +207 -3
- package/dist/core/tree-sitter/parser-loader.js +5 -4
- package/dist/core/tree-sitter/safe-parse.d.ts +0 -5
- package/dist/core/tree-sitter/vendored-grammars.d.ts +39 -0
- package/dist/core/tree-sitter/vendored-grammars.js +57 -0
- package/dist/core/wiki/generator.js +3 -1
- package/dist/core/wiki/graph-queries.d.ts +6 -0
- package/dist/core/wiki/graph-queries.js +9 -1
- package/dist/mcp/http-transport.d.ts +134 -0
- package/dist/mcp/http-transport.js +503 -0
- package/dist/mcp/local/local-backend.d.ts +110 -24
- package/dist/mcp/local/local-backend.js +1225 -19
- package/dist/mcp/local/pdg-impact.d.ts +384 -0
- package/dist/mcp/local/pdg-impact.js +1972 -0
- package/dist/mcp/resources.js +13 -1
- package/dist/mcp/tools.d.ts +12 -0
- package/dist/mcp/tools.js +214 -7
- package/dist/server/analyze-launch.d.ts +29 -0
- package/dist/server/analyze-launch.js +137 -0
- package/dist/server/analyze-upload.d.ts +33 -0
- package/dist/server/analyze-upload.js +123 -0
- package/dist/server/analyze-worker-ipc.d.ts +58 -0
- package/dist/server/analyze-worker-ipc.js +16 -0
- package/dist/server/analyze-worker.d.ts +17 -1
- package/dist/server/analyze-worker.js +7 -1
- package/dist/server/api.d.ts +17 -0
- package/dist/server/api.js +132 -168
- package/dist/server/git-clone.d.ts +43 -2
- package/dist/server/git-clone.js +211 -16
- package/dist/server/mcp-http.d.ts +5 -6
- package/dist/server/mcp-http.js +9 -82
- package/dist/server/middleware.d.ts +40 -0
- package/dist/server/middleware.js +92 -0
- package/dist/server/private-ip.d.ts +1 -0
- package/dist/server/private-ip.js +15 -0
- package/dist/server/upload-ingest.d.ts +56 -0
- package/dist/server/upload-ingest.js +276 -0
- package/dist/server/upload-paths.d.ts +37 -0
- package/dist/server/upload-paths.js +57 -0
- package/dist/server/upload-sweep.d.ts +20 -0
- package/dist/server/upload-sweep.js +57 -0
- package/dist/storage/git.js +5 -8
- package/dist/storage/parse-cache.d.ts +22 -1
- package/dist/storage/parse-cache.js +44 -10
- package/dist/storage/repo-manager.d.ts +121 -10
- package/dist/storage/repo-manager.js +43 -5
- package/dist/types/pipeline.d.ts +9 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +110 -10
- package/hooks/claude/gitnexus-hook.cjs +110 -13
- package/hooks/claude/hook-db-lock-probe.cjs +513 -26
- package/package.json +8 -2
- package/scripts/assert-publish-grammar-coverage.cjs +31 -0
- package/scripts/build-tree-sitter-grammars.cjs +16 -10
- package/scripts/cross-platform-tests.ts +1 -0
- package/skills/gitnexus-debugging.md +16 -4
- package/skills/gitnexus-exploring.md +3 -3
- package/skills/gitnexus-guide.md +33 -0
- package/skills/gitnexus-pdg-query.md +89 -0
- package/skills/gitnexus-refactoring.md +1 -1
- package/skills/gitnexus-taint-analysis.md +178 -0
- package/vendor/tree-sitter-c/package.json +1 -1
- package/vendor/tree-sitter-dart/package.json +1 -1
- package/vendor/tree-sitter-kotlin/package.json +1 -1
- package/vendor/tree-sitter-proto/package.json +1 -1
- package/vendor/tree-sitter-swift/package.json +1 -1
- package/web/assets/{agent-CKPMqImC.js → agent-D3Xd7zZE.js} +123 -123
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +1 -0
- package/web/assets/architectureDiagram-UL44E2DR-ChH9xW-N.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-B4niSLvR.js → blockDiagram-7IZFK4PR-BkWhpzWB.js} +1 -1
- package/web/assets/{c4Diagram-Y2BXMSZH-DIzEXalR.js → c4Diagram-Y2BXMSZH-DtBvpzWD.js} +1 -1
- package/web/assets/{chunk-3SSMPTDK-BzGeeheI.js → chunk-3SSMPTDK-B4_etUhr.js} +2 -2
- package/web/assets/{chunk-5IMINLNL-CnTLsXIV.js → chunk-5IMINLNL-DOdTeQri.js} +1 -1
- package/web/assets/{chunk-5VCL7Z4A-w1BCx98Z.js → chunk-5VCL7Z4A-CQ-2dYWj.js} +1 -1
- package/web/assets/chunk-6764PJDD-DpIS7hxD.js +1 -0
- package/web/assets/{chunk-67TQ5CYL-CChC2cAv.js → chunk-67TQ5CYL-4sNPJU1q.js} +3 -3
- package/web/assets/{chunk-7W6UQGC5-CgFyfZ6k.js → chunk-7W6UQGC5-KyEG0HQg.js} +1 -1
- package/web/assets/{chunk-AZZRMDJM-5E9ARdDQ.js → chunk-AZZRMDJM-y-xJBuMz.js} +1 -1
- package/web/assets/{chunk-INKRHTLW-ELpfuk9h.js → chunk-INKRHTLW-Nu4ri9P-.js} +1 -1
- package/web/assets/{chunk-JQRUD6KW-Dcq_Qnyy.js → chunk-JQRUD6KW-Dbva2Z17.js} +1 -1
- package/web/assets/{chunk-KGFNY3KK-W-VR57xb.js → chunk-KGFNY3KK-JGMJvKCK.js} +1 -1
- package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +161 -0
- package/web/assets/{chunk-KNLZD3CH-BuZBOcso.js → chunk-KNLZD3CH-BGlP6X9R.js} +1 -1
- package/web/assets/{chunk-KRXBNO2N-DH2NPM7I.js → chunk-KRXBNO2N-BW5o0KUN.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-Dfmux4m1.js → chunk-LCXTWHL2-zoomRtWX.js} +1 -1
- package/web/assets/{chunk-LII3EMHJ-3X33tCpU.js → chunk-LII3EMHJ-D-jm-dLa.js} +1 -1
- package/web/assets/{chunk-QA3QBVWF-D5Ha3GgB.js → chunk-QA3QBVWF-BgRW3SXd.js} +1 -1
- package/web/assets/{chunk-RG4AUYOV-CAkzcoRj.js → chunk-RG4AUYOV-DD0B2N2B.js} +1 -1
- package/web/assets/{chunk-T2UQINTJ-kGYG7ppP.js → chunk-T2UQINTJ-DSBqkzH7.js} +1 -1
- package/web/assets/chunk-T5OCTHI4-DdZvN-9i.js +1 -0
- package/web/assets/{chunk-UY5QBCOK-Du-c56gs.js → chunk-UY5QBCOK-DyF0vyGd.js} +1 -1
- package/web/assets/{chunk-W44A43WB-lrCpuupA.js → chunk-W44A43WB-JqMLIpR0.js} +1 -1
- package/web/assets/{chunk-ZXARS5L4-CSZRiyOf.js → chunk-ZXARS5L4-CxN8oiwI.js} +1 -1
- package/web/assets/classDiagram-KGZ6W3CR-DJm9BgF-.js +1 -0
- package/web/assets/classDiagram-v2-72OJOZXJ-DJm9BgF-.js +1 -0
- package/web/assets/{context-builder-_HS0v2ma.js → context-builder-BHiFUA8O.js} +10 -2
- package/web/assets/{cose-bilkent-UX7MHV2Q-BHv2bbtl.js → cose-bilkent-UX7MHV2Q-D71wNYRJ.js} +1 -1
- package/web/assets/dagre-ND4H6XIP-BIkxmhcu.js +4 -0
- package/web/assets/diagram-3NCE3AQN-BTa6iH0T.js +43 -0
- package/web/assets/diagram-GF46GFSD-DZDV0vBj.js +24 -0
- package/web/assets/{diagram-HNR7UZ2L-fUWreZzx.js → diagram-HNR7UZ2L-DFCfd5LI.js} +2 -2
- package/web/assets/diagram-QXG6HAR7-BzM--Jj0.js +24 -0
- package/web/assets/diagram-WEQXMOUZ-DFFwz0k4.js +10 -0
- package/web/assets/{erDiagram-L5TCEMPS-QN2eEP1e.js → erDiagram-L5TCEMPS-CfHMJJqo.js} +1 -1
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +1 -0
- package/web/assets/{flowDiagram-H6V6AXG4-CXbXImlN.js → flowDiagram-H6V6AXG4-Be805QiJ.js} +3 -3
- package/web/assets/{ganttDiagram-JCBTUEKG-BHQssTz6.js → ganttDiagram-JCBTUEKG-D3iL2Aet.js} +1 -1
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +1 -0
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +106 -0
- package/web/assets/index-BvYev1UJ.js +635 -0
- package/web/assets/index-_lgn7hs5.css +2 -0
- package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +1 -0
- package/web/assets/infoDiagram-3YFTVSEB-Y7BKSoke.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-6LKOvBfp.js → ishikawaDiagram-BNXS4ZKH-CT4SHFuI.js} +1 -1
- package/web/assets/{journeyDiagram-M6C3CM3L-DNPYCpvq.js → journeyDiagram-M6C3CM3L-CvArszLo.js} +1 -1
- package/web/assets/{kanban-definition-75IXJCU3-DgDi9oJT.js → kanban-definition-75IXJCU3-C6yDxr7N.js} +3 -3
- package/web/assets/{katex-K3KEBU37-CrVLz8l7.js → katex-K3KEBU37-CTc5BslQ.js} +1 -1
- package/web/assets/{mindmap-definition-2TDM6QVE-CwR5sBB-.js → mindmap-definition-2TDM6QVE-BOc2WEne.js} +1 -1
- package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +1 -0
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +1 -0
- package/web/assets/{pieDiagram-CU6KROY3-By8g6f6B.js → pieDiagram-CU6KROY3-Cvc0f_Pd.js} +1 -1
- package/web/assets/{quadrantDiagram-VICAPDV7-bAm6Hi_5.js → quadrantDiagram-VICAPDV7-yXSZ2lLz.js} +1 -1
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +1 -0
- package/web/assets/{requirementDiagram-JXO7QTGE-7oDcJ1_J.js → requirementDiagram-JXO7QTGE-BRcZvHs4.js} +1 -1
- package/web/assets/{sankeyDiagram-URQDO5SZ-LFJz53u5.js → sankeyDiagram-URQDO5SZ-1qEjlFIB.js} +1 -1
- package/web/assets/{sequenceDiagram-VS2MUI6T-FySeKCUy.js → sequenceDiagram-VS2MUI6T-PcSCuvrB.js} +3 -3
- package/web/assets/stateDiagram-7D4R322I-D6qYSV1E.js +1 -0
- package/web/assets/stateDiagram-v2-36443NZ5-Bg-ImOSX.js +1 -0
- package/web/assets/{timeline-definition-O6YCAMPW-Ds2CnVZK.js → timeline-definition-O6YCAMPW-QWkh01xw.js} +1 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +1 -0
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +1 -0
- package/web/assets/{vennDiagram-MWXL3ELB-DUIEwXWp.js → vennDiagram-MWXL3ELB-ak4DfwuM.js} +3 -3
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +1 -0
- package/web/assets/{wardleyDiagram-CUQ6CDDI-DEiFPQih.js → wardleyDiagram-CUQ6CDDI-CTzR4Loq.js} +1 -1
- package/web/assets/{xychartDiagram-N2JHSOCM-BUbayhST.js → xychartDiagram-N2JHSOCM-DA1BEaQz.js} +1 -1
- package/web/index.html +13 -15
- package/scripts/materialize-vendor-grammars.cjs +0 -97
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BETj2x4g.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-D1EXI0zA.js +0 -36
- package/web/assets/chunk-2T2R6R2M-n6s9JZqv.js +0 -4
- package/web/assets/chunk-2UTLFMKG-CMBB1TMN.js +0 -1
- package/web/assets/chunk-4R4BOZG6-mKhL59ul.js +0 -159
- package/web/assets/chunk-6764PJDD-ChwMM2z4.js +0 -1
- package/web/assets/chunk-7J6CGLKN-DT-b53FT.js +0 -10
- package/web/assets/chunk-C62D2QBJ-CDAWj26E.js +0 -1
- package/web/assets/chunk-CEXFNPSA-D68Tk6ls.js +0 -1
- package/web/assets/chunk-CilyBKbf.js +0 -1
- package/web/assets/chunk-J5EP6P6S-DxWW0yvu.js +0 -1
- package/web/assets/chunk-KGYTTC2M-C6PHeuay.js +0 -1
- package/web/assets/chunk-RERM46MO-DQNbXtfw.js +0 -1
- package/web/assets/chunk-RKZBBQEN-BmTPLSyv.js +0 -1
- package/web/assets/chunk-RLI5ZMPA-DExu2DOK.js +0 -1
- package/web/assets/chunk-T5OCTHI4--9wWpVws.js +0 -1
- package/web/assets/chunk-UP6H54XL-DsKdC6jC.js +0 -1
- package/web/assets/chunk-UXSXWOXI-DR81EqLr.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-Bv93af_b.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-CLfEqHUa.js +0 -1
- package/web/assets/dagre-ND4H6XIP-DsIr9MOv.js +0 -4
- package/web/assets/diagram-3NCE3AQN-BqAtKUpW.js +0 -43
- package/web/assets/diagram-GF46GFSD-CaBG6n6o.js +0 -24
- package/web/assets/diagram-QXG6HAR7-CZ-O3rcV.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-P4lSL4GH.js +0 -10
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-B3myHUst.js +0 -1
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DF3rtf4A.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CCwVLT__.js +0 -106
- package/web/assets/index-BKWA-m7o.css +0 -2
- package/web/assets/index-CG6q8eTs.js +0 -626
- package/web/assets/info-J43DQDTF-KCYPFFUO-R4XV_akJ.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-DmLICZx1.js +0 -2
- package/web/assets/packet-YPE3B663-LP52Z2RK-CgQPdNZa.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BzWOwc_c.js +0 -1
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-B7KG0FN7.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-CB2nABwH.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-COBGd2RL.js +0 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CRSxEwLO.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-a0PfKoVn.js +0 -1
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-BKQ6e5mC.js +0 -1
- /package/web/assets/{chunk-AQ6EADP3-CCFje6lL.js → chunk-AQ6EADP3-CZhslHi-.js} +0 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rust def/use harvester (#2195 U7) — the Rust analogue of
|
|
3
|
+
* {@link import('./typescript-harvest.js').TsHarvester} and the C-family /
|
|
4
|
+
* Go / Python / Swift / Kotlin / Dart harvesters. Like the Swift / Kotlin / Go /
|
|
5
|
+
* Python / Dart harvesters it harvests the per-function binding table
|
|
6
|
+
* ({@link BindingEntry}[]) plus {@link StatementFacts} (defs / uses / mayDefs)
|
|
7
|
+
* AND a taint {@link import('../types.js').SiteRecord} per call (callee path,
|
|
8
|
+
* receiver, per-arg occurrence entries, result defs, and an `at` anchor) via the
|
|
9
|
+
* shared {@link CallSiteFactAccumulator} — the same site substrate the
|
|
10
|
+
* C-family / Go / TS / Kotlin / Python / Dart / Swift harvesters emit, so Rust
|
|
11
|
+
* BasicBlocks get `callees` + `calleeIds`.
|
|
12
|
+
*
|
|
13
|
+
* RUST CALL SHAPE (verified by a real parse — see the probe table below). Rust
|
|
14
|
+
* has ONE call node, `call_expression { function, arguments }`, whose `function`
|
|
15
|
+
* field takes three shapes:
|
|
16
|
+
* 1. a bare `identifier` (`foo(x)`) — a FREE call; callee path = the name.
|
|
17
|
+
* 2. a `field_expression { value, field }` (`a.method(x)`) — a METHOD call
|
|
18
|
+
* (the `.` access). The dotted path is `a.method` (leaf `method`); the
|
|
19
|
+
* receiver is the chain ROOT binding (`a`). Chained `a.b.c()` nests
|
|
20
|
+
* `field_expression`s (path `a.b.c`, root `a`, mid-chain read `a.b`).
|
|
21
|
+
* 3. a `scoped_identifier { path, name }` (`Foo::bar(x)` / `a::b::c(x)`) — an
|
|
22
|
+
* associated-fn / path call. The path is joined with `.` (NOT `::`) so the
|
|
23
|
+
* LEAF after the last separator is the tail (`Foo::bar` ⇒ `Foo.bar` ⇒ leaf
|
|
24
|
+
* `bar`), exactly matching the Rust CALLS query, which tags this
|
|
25
|
+
* `@reference.call.free` with `@reference.name` = the tail `name:
|
|
26
|
+
* (identifier)` (`bar`), and matching how {@link
|
|
27
|
+
* import('../emit.js').calleesOfBlock} extracts the leaf via
|
|
28
|
+
* `callee.slice(callee.lastIndexOf('.') + 1)`. The receiver is set only when
|
|
29
|
+
* the path ROOT is a bound local (`a::b::c` with `a` a local ⇒ receiver `a`);
|
|
30
|
+
* a type/module root (`Foo`, `crate`) is not a value binding, so no receiver.
|
|
31
|
+
* 4. a `generic_function { function, type_arguments }` (`foo::<T>(x)`) — the
|
|
32
|
+
* turbofish form; `visitCall` unwraps the `function` field and recurses, so
|
|
33
|
+
* `foo::<T>(x)` records the same site as `foo(x)`.
|
|
34
|
+
* A `try_expression` (`foo()?`) wraps a `call_expression` — the inner call walks
|
|
35
|
+
* normally.
|
|
36
|
+
*
|
|
37
|
+
* STRUCT LITERALS ARE HARVESTED AS `kind: 'new'` (U4). A struct-literal
|
|
38
|
+
* expression `Point { x: 1 }` is a `struct_expression { name, body }`, NOT a
|
|
39
|
+
* `call_expression`. The Rust CALLS query tags it `@reference.call.constructor`
|
|
40
|
+
* (resolving to a constructor id), so `visitStruct` opens a `kind: 'new'` site
|
|
41
|
+
* whose callee path is the struct TYPE name (`mymod::Point` ⇒ dotted `mymod.Point`
|
|
42
|
+
* ⇒ leaf `Point`, the SAME tail the `@reference.name` capture resolves) and whose
|
|
43
|
+
* `at` is the `struct_expression` start (== the broadest-span
|
|
44
|
+
* `@reference.call.constructor` anchor — verified byte-equal for plain / scoped /
|
|
45
|
+
* turbofish / scoped+turbofish forms). The `name` field shapes are
|
|
46
|
+
* `type_identifier` (`Point`), `scoped_type_identifier` (`mymod::Point`), and
|
|
47
|
+
* `generic_type_with_turbofish` (`Foo::<T>` / `mymod::Bar::<T>`); all start at the
|
|
48
|
+
* same column as the `struct_expression`, so the anchor aligns. The struct's
|
|
49
|
+
* type/module head is no value binding ⇒ no receiver. Field-init VALUES
|
|
50
|
+
* (`field_initializer` `value`, shorthand `y`, base `..rest`) walk for
|
|
51
|
+
* uses/occurrences; field NAMES are not uses.
|
|
52
|
+
*
|
|
53
|
+
* MACROS ARE NOT HARVESTED. `println!(...)` / `vec!(...)` are `macro_invocation`
|
|
54
|
+
* nodes (a `macro` ident + a `token_tree`), NOT `call_expression`s. The Rust
|
|
55
|
+
* CALLS query tags them `@reference.macro` (a DISJOINT namespace resolved via the
|
|
56
|
+
* MacroRegistry to Macro defs, never a fn of the same name) — NOT
|
|
57
|
+
* `@reference.call.*`. So no resolved callee-id is keyed at a macro's position,
|
|
58
|
+
* and opening a call site there would put a leaf (`println`) into `callees` that
|
|
59
|
+
* the resolution side never produces — a spurious, unjoinable callee. We
|
|
60
|
+
* therefore record NO site for a macro (its argument identifiers still walk for
|
|
61
|
+
* uses via the default token-tree descent), keeping `callees` aligned with the
|
|
62
|
+
* CALLS resolution.
|
|
63
|
+
*
|
|
64
|
+
* ANCHOR ALIGNMENT (plan KTD7 — load-bearing): a call site's `at` MUST be the
|
|
65
|
+
* SAME `[line (1-based), col (0-based)]` the Rust CALLS resolution keys its
|
|
66
|
+
* `atRange` on, because a downstream unit joins the two by EXACT position. The
|
|
67
|
+
* Rust scope query (captures.ts) anchors `@reference.call.free` (free + scoped),
|
|
68
|
+
* `@reference.call.member`, and `@reference.call.constructor` on the WHOLE
|
|
69
|
+
* `call_expression` node (the `@reference.name` identifier / `field_identifier`
|
|
70
|
+
* and the `@reference.receiver` are SUB-tags in `KNOWN_SUB_TAGS`, excluded by the
|
|
71
|
+
* broadest-span rule in `anchorCaptureFor`; `atRange: anchor.range` at
|
|
72
|
+
* scope-extractor.ts:1030). So for a free call `foo(x)`, a method call
|
|
73
|
+
* `a.method(x)`, a path call `Foo::bar(x)`, and a chained call `a.b.c(x)` alike,
|
|
74
|
+
* `at` is the start of the enclosing `call_expression` node — which, for a
|
|
75
|
+
* method/chained call, starts at the RECEIVER (`a`), and for a path call at the
|
|
76
|
+
* head segment (`Foo`), exactly where the CALLS anchor starts too. This is the
|
|
77
|
+
* Swift / Go / Python / Kotlin whole-call-node model, NOT the Dart callee-name
|
|
78
|
+
* model. `visitCall` receives exactly the `call_expression` node and records
|
|
79
|
+
* `[node.startPosition.row + 1, node.startPosition.column]`.
|
|
80
|
+
*
|
|
81
|
+
* Runs in the parse worker next to the Rust CFG visitor. Output is the binding
|
|
82
|
+
* table the {@link import('../cfg-builder.js').CfgBuilder} stamps onto the CFG,
|
|
83
|
+
* plus the per-block def/use facts the reaching-defs / CDG solvers consume.
|
|
84
|
+
*
|
|
85
|
+
* Every node type and field literal below was grammar-validated against
|
|
86
|
+
* tree-sitter-rust via the introspection probe before use (mandatory pre-step).
|
|
87
|
+
* Rust shapes pre-empted (verified by a real parse):
|
|
88
|
+
* - functions: `function_item` (fields `name`/`parameters`/`return_type`/`body`;
|
|
89
|
+
* methods are `function_item` inside an `impl_item`'s `declaration_list`) and
|
|
90
|
+
* `closure_expression` (field `parameters`=`closure_parameters`, `body` is a
|
|
91
|
+
* `block` OR a bare expression).
|
|
92
|
+
* - parameters: `parameter` (field `pattern`, optional `mutable_specifier`),
|
|
93
|
+
* `self_parameter`. A `closure_parameters` lists bare `identifier`s and/or
|
|
94
|
+
* `parameter` nodes.
|
|
95
|
+
* - declarations: `let_declaration` (field `pattern`, optional `value`, optional
|
|
96
|
+
* `alternative` block for `let … else`; optional `mutable_specifier`). The
|
|
97
|
+
* `mut` keyword is irrelevant to def-ness.
|
|
98
|
+
* - patterns (each bound `identifier` leaf is a def): `identifier`,
|
|
99
|
+
* `tuple_pattern`, `slice_pattern`, `struct_pattern` (`field_pattern`s whose
|
|
100
|
+
* `name` is a `shorthand_field_identifier`, or `name: pat`), `tuple_struct_pattern`
|
|
101
|
+
* (field `type` is the variant path — NOT a binding; the inner patterns bind),
|
|
102
|
+
* `ref_pattern` / `mut_pattern` (the inner identifier binds), `captured_pattern`
|
|
103
|
+
* (`v @ subpat` — `v` binds, and the subpattern's leaves bind), `or_pattern`,
|
|
104
|
+
* `range_pattern` (binds nothing). The wildcard `_` binds nothing.
|
|
105
|
+
* - assignments: `assignment_expression` (fields `left`/`right`),
|
|
106
|
+
* `compound_assignment_expr` (fields `left`/`operator`/`right` — read+write).
|
|
107
|
+
* - loop / match binders: `for_expression` `pattern`; `match_arm` `pattern`
|
|
108
|
+
* (a `match_pattern` whose leaves bind, plus an optional `if` guard with field
|
|
109
|
+
* `condition`); `let_condition` `pattern` (`if let` / `while let`).
|
|
110
|
+
* - reads: `field_expression` (fields `value`/`field`), `call_expression`
|
|
111
|
+
* (fields `function`/`arguments`), `binary_expression` (fields
|
|
112
|
+
* `left`/`operator`/`right`), `try_expression` (`expr?`).
|
|
113
|
+
*
|
|
114
|
+
* TWO-PHASE, ORDER-INDEPENDENT (load-bearing — mirrors the TS / Go / C
|
|
115
|
+
* harvesters): the CFG walk is NOT source-order, so resolving names against a
|
|
116
|
+
* scope stack populated *during* the walk would mis-resolve. Phase 1 pre-scans
|
|
117
|
+
* the whole function subtree once, declaring every bound name into ONE function
|
|
118
|
+
* table; phase 2 resolves defs/uses against that finished table from any walk
|
|
119
|
+
* order. Rust DOES have block scope + shadowing, but a single function table is
|
|
120
|
+
* the documented v1 simplification used by the Python harvester — distinct
|
|
121
|
+
* shadowing redeclarations of the same name collapse onto one binding (an
|
|
122
|
+
* over-approximation that can falsely kill across a shadow, the sound direction
|
|
123
|
+
* for taint: never a missed flow).
|
|
124
|
+
*
|
|
125
|
+
* v1 def-semantics scope:
|
|
126
|
+
* - `let PAT = …` (and `let PAT = … else { … }`) — each identifier leaf of PAT
|
|
127
|
+
* is a def; the value (and the `else` block) are walked for uses.
|
|
128
|
+
* - `assignment_expression` plain `=` — a plain-identifier lvalue is a def; a
|
|
129
|
+
* `field_expression` / index lvalue is NOT a scalar def (its root is a use).
|
|
130
|
+
* - `compound_assignment_expr` (`x += 1`) — def AND use the lvalue.
|
|
131
|
+
* - `for PAT in ITER` — the loop pattern's leaves are defs, ITER a use.
|
|
132
|
+
* - `match` arm patterns bind their leaves; `if let` / `while let` patterns bind.
|
|
133
|
+
* - parameters (incl. `mut`, typed, closure params) are `param`-kind defs.
|
|
134
|
+
* EXCLUDED, deliberately (TypeScript-CFA precedent): field / index writes
|
|
135
|
+
* (`obj.f = …`, `arr[i] = …`) are NOT scalar defs — their root identifiers are
|
|
136
|
+
* uses only. Nested-function bodies (`closure_expression`, an inner
|
|
137
|
+
* `function_item`) are opaque in BOTH directions (captured reads/writes invisible).
|
|
138
|
+
*
|
|
139
|
+
* MAY-DEFS: a def inside a conditionally-evaluated subexpression — the right
|
|
140
|
+
* operand of `&&` / `||` short-circuit, and a match-arm guard / `if let` pattern
|
|
141
|
+
* test — is a may-def (gen WITHOUT kill), so the not-taken path's prior def is
|
|
142
|
+
* not falsely killed. (Rust assignment is an expression but yields `()`, so an
|
|
143
|
+
* in-`&&` assignment is rare; the machinery is kept for guard / case-test parity.)
|
|
144
|
+
*
|
|
145
|
+
* Identifiers with no in-function declaration (module items, imported names,
|
|
146
|
+
* constants, enum variants) resolve to a SYNTHETIC module-level binding
|
|
147
|
+
* (`name@module`), applied identically by def and use harvesting.
|
|
148
|
+
*
|
|
149
|
+
* NOTE: nothing serialized here may carry a field named `nodeId` — the durable
|
|
150
|
+
* parsedfile-store reviver dedups objects keyed on that field name.
|
|
151
|
+
*/
|
|
152
|
+
import type { SyntaxNode } from '../../utils/ast-helpers.js';
|
|
153
|
+
import type { BindingEntry, StatementFacts } from '../types.js';
|
|
154
|
+
export declare class RustHarvester {
|
|
155
|
+
private readonly fnNode;
|
|
156
|
+
private readonly bindings;
|
|
157
|
+
/** Single function-scope name → binding index (v1: no block scope). */
|
|
158
|
+
private readonly table;
|
|
159
|
+
private readonly synthetic;
|
|
160
|
+
private readonly fnId;
|
|
161
|
+
/** >0 while walking a conditionally-evaluated subexpression — defs become may-defs. */
|
|
162
|
+
private conditionalDepth;
|
|
163
|
+
/**
|
|
164
|
+
* `call_expression` node id → binding indices its single-target result is
|
|
165
|
+
* assigned to (`let x = f()` / `x = g()` ⇒ `[x]`). Populated just before the
|
|
166
|
+
* value walk reaches the call (see {@link registerResultDefs}) and consumed by
|
|
167
|
+
* {@link visitCall}. Mirrors the Swift / Kotlin / Go / Python harvesters' map.
|
|
168
|
+
*/
|
|
169
|
+
private readonly resultDefTargets;
|
|
170
|
+
constructor(fnNode: SyntaxNode);
|
|
171
|
+
/** The completed binding table — pass to `CfgBuilder.finish`. */
|
|
172
|
+
bindingTable(): readonly BindingEntry[];
|
|
173
|
+
/** The function/closure body node (a `block` for a fn, block-or-expr for a closure). */
|
|
174
|
+
private bodyOf;
|
|
175
|
+
private declare;
|
|
176
|
+
/** Declare every parameter binder of a fn / closure (incl. `mut`, typed). */
|
|
177
|
+
private declareParams;
|
|
178
|
+
/**
|
|
179
|
+
* Pre-scan the function body once, declaring every bound name. Recurses into
|
|
180
|
+
* compound expressions but NOT into nested `function_item` / `closure_expression`
|
|
181
|
+
* bodies (opaque).
|
|
182
|
+
*/
|
|
183
|
+
private prescan;
|
|
184
|
+
/**
|
|
185
|
+
* Declare every identifier leaf of a binding pattern. Handles the full Rust
|
|
186
|
+
* pattern taxonomy: tuple / slice / struct / tuple-struct / ref / mut /
|
|
187
|
+
* captured (`@`) / or patterns. A `tuple_struct_pattern`'s `type` field is the
|
|
188
|
+
* variant PATH (`Some`, `Ok`) — not a binding; only its inner patterns bind.
|
|
189
|
+
* `_`, literals and range patterns bind nothing.
|
|
190
|
+
*/
|
|
191
|
+
private declarePattern;
|
|
192
|
+
/** `field_pattern` — shorthand `x` binds `x`; `x: pat` binds `pat`'s leaves. */
|
|
193
|
+
private declareFieldPattern;
|
|
194
|
+
/** Def/use facts for one statement (or construct-header expression) node. */
|
|
195
|
+
facts(node: SyntaxNode): StatementFacts;
|
|
196
|
+
/** Facts for an expression whose WHOLE evaluation is conditional (guards/tests). */
|
|
197
|
+
factsConditional(node: SyntaxNode): StatementFacts;
|
|
198
|
+
/**
|
|
199
|
+
* Facts for a `for PAT in ITER` head: the loop pattern's leaves are defs, the
|
|
200
|
+
* iterated expression a use.
|
|
201
|
+
*/
|
|
202
|
+
forHeadFacts(stmt: SyntaxNode): StatementFacts;
|
|
203
|
+
/**
|
|
204
|
+
* Facts for ONLY a `let_declaration`'s PATTERN bindings (no value walk) — used
|
|
205
|
+
* when the value is a control-flow expression already harvested by the visitor,
|
|
206
|
+
* so the binding defs land on a separate continuation block without
|
|
207
|
+
* double-counting the value's uses.
|
|
208
|
+
*/
|
|
209
|
+
letPatternFacts(stmt: SyntaxNode): StatementFacts;
|
|
210
|
+
/**
|
|
211
|
+
* Facts for a `let PAT = VALUE` condition (`if let` / `while let`): the value
|
|
212
|
+
* is a use, the pattern's leaves are defs. When `conditional` is true the defs
|
|
213
|
+
* become may-defs (a `while let` re-test may not bind on the exit iteration).
|
|
214
|
+
*/
|
|
215
|
+
letConditionFacts(cond: SyntaxNode, conditional: boolean): StatementFacts;
|
|
216
|
+
/**
|
|
217
|
+
* Facts for a `match` arm's PATTERN bindings (#2206): `Some(n) => …` binds `n`
|
|
218
|
+
* from the matched subject. The bindings are MAY-defs (only the arm that
|
|
219
|
+
* actually matches binds; a later arm tests only when earlier ones didn't) and
|
|
220
|
+
* are attached to the dispatch block, co-located with the subject's use, so a
|
|
221
|
+
* tainted subject can propagate to the arm binding. The guard is skipped by
|
|
222
|
+
* {@link defPattern}'s `match_pattern` handling. `undefined` when the pattern
|
|
223
|
+
* binds nothing (`_`, a literal, a unit variant).
|
|
224
|
+
*/
|
|
225
|
+
matchArmPatternFacts(arm: SyntaxNode): StatementFacts | undefined;
|
|
226
|
+
/** ENTRY-block facts for the parameters (defs only — incl. default-position uses). */
|
|
227
|
+
paramFacts(): StatementFacts | undefined;
|
|
228
|
+
private resolve;
|
|
229
|
+
private def;
|
|
230
|
+
private use;
|
|
231
|
+
/** Run `fn` with defs demoted to may-defs (conditionally-evaluated context). */
|
|
232
|
+
private conditional;
|
|
233
|
+
/**
|
|
234
|
+
* Def each identifier leaf of a binding pattern (the def-position analogue of
|
|
235
|
+
* {@link declarePattern}). A `tuple_struct_pattern`'s `type` field path is a
|
|
236
|
+
* variant name, not a def; its inner patterns bind. A struct field shorthand
|
|
237
|
+
* binds; `_` binds nothing.
|
|
238
|
+
*/
|
|
239
|
+
private defPattern;
|
|
240
|
+
private defFieldPattern;
|
|
241
|
+
/** Value-position walk: collect uses; route def positions to the pattern handler. */
|
|
242
|
+
private walkValue;
|
|
243
|
+
/**
|
|
244
|
+
* When `value`'s root (after unwrapping a `try_expression`) is a
|
|
245
|
+
* `call_expression`, remember that call site should carry `resultDefs` — the
|
|
246
|
+
* binding indices of `targets` (def-position identifiers). Consumed by
|
|
247
|
+
* {@link visitCall} once the value walk reaches the node. Single-target only;
|
|
248
|
+
* the blank target (`_`) binds nothing.
|
|
249
|
+
*/
|
|
250
|
+
private registerResultDefs;
|
|
251
|
+
/** Strip a `try_expression` (`expr?`) / `await_expression` wrapper around a value. */
|
|
252
|
+
private unwrapValue;
|
|
253
|
+
/**
|
|
254
|
+
* Open + populate a call site for a Rust `call_expression`. `node` IS the
|
|
255
|
+
* `call_expression` — the SAME node the scope query anchors `@reference.call.*`
|
|
256
|
+
* on (its `atRange`), so the resolved-id join lands by exact position (see file
|
|
257
|
+
* header ANCHOR ALIGNMENT). A `call_expression` is always `kind: 'call'`; struct
|
|
258
|
+
* literals (`kind: 'new'`) are harvested separately by {@link visitStruct}.
|
|
259
|
+
*/
|
|
260
|
+
private visitCall;
|
|
261
|
+
/**
|
|
262
|
+
* Open + populate a `kind: 'new'` site for a Rust `struct_expression`
|
|
263
|
+
* (`Point { x: 1 }`, `mymod::Point { .. }`, `Foo::<T> { .. }`). `node` IS the
|
|
264
|
+
* `struct_expression` — the SAME node the Rust scope query anchors
|
|
265
|
+
* `@reference.call.constructor` on (its `atRange`), so the resolved
|
|
266
|
+
* constructor-id join lands by exact position. The `name` field of a
|
|
267
|
+
* `struct_expression` is a `type_identifier` (`Point`), a
|
|
268
|
+
* `scoped_type_identifier` (`mymod::Point`), or a `generic_type_with_turbofish`
|
|
269
|
+
* (`Foo::<T>` / `mymod::Bar::<T>`); all three start at the SAME column as the
|
|
270
|
+
* enclosing `struct_expression` (verified by a real parse), so the broadest-span
|
|
271
|
+
* `@reference.call.constructor` anchor == the `struct_expression` start.
|
|
272
|
+
*
|
|
273
|
+
* The callee path joins the `::`-segments of the type with `.` (NOT `::`) so the
|
|
274
|
+
* LEAF after the last separator is the tail (`mymod::Point` ⇒ `mymod.Point` ⇒
|
|
275
|
+
* leaf `Point`), exactly the tail the CALLS query's `@reference.name` capture
|
|
276
|
+
* resolves and the tail {@link import('../emit.js').calleesOfBlock} extracts via
|
|
277
|
+
* `lastIndexOf('.')`. A type/module path head is never a value binding, so no
|
|
278
|
+
* receiver (mirrors {@link harvestScopedCallee}). The field-init VALUES
|
|
279
|
+
* (`field_initializer` `value`, shorthand `y`, base `..rest`) walk for
|
|
280
|
+
* uses/occurrences; field NAMES are not uses.
|
|
281
|
+
*/
|
|
282
|
+
private visitStruct;
|
|
283
|
+
/**
|
|
284
|
+
* Build the dotted type path of a `struct_expression`'s `name` field. The name
|
|
285
|
+
* is a `type_identifier` (`Point`), a `scoped_type_identifier`
|
|
286
|
+
* (`mymod::Point` — `path` + tail `name` type_identifier), or a
|
|
287
|
+
* `generic_type_with_turbofish` (`Foo::<T>` / `mymod::Bar::<T>` — its `type`
|
|
288
|
+
* field is a `type_identifier` or a `scoped_identifier`; the turbofish
|
|
289
|
+
* `type_arguments` are dropped). Segments join with `.` so the leaf is the type
|
|
290
|
+
* tail (matching the CALLS `@reference.name` tail capture). Returns `undefined`
|
|
291
|
+
* when no segments could be read (defensive — keeps a mis-anchored site from
|
|
292
|
+
* carrying a bogus callee).
|
|
293
|
+
*/
|
|
294
|
+
private structTypePath;
|
|
295
|
+
/**
|
|
296
|
+
* Record the callee path + receiver for a `call_expression`'s `function` node.
|
|
297
|
+
* Free `identifier` (`foo`), method `field_expression` (`a.method`, receiver
|
|
298
|
+
* root `a`), path `scoped_identifier` (`Foo::bar` ⇒ dotted `Foo.bar`, leaf
|
|
299
|
+
* `bar`), and the turbofish `generic_function` (`foo::<T>` — unwrap the
|
|
300
|
+
* `function` field and recurse). Anything else (a call-rooted chain `f()()`,
|
|
301
|
+
* a parenthesized callable) walks for uses with no static callee path.
|
|
302
|
+
*/
|
|
303
|
+
private harvestCallee;
|
|
304
|
+
/**
|
|
305
|
+
* Walk a `scoped_identifier` (`Foo::bar`, `a::b::c`) callee. The `::`-segments
|
|
306
|
+
* are joined with `.` (NOT `::`) so the LEAF after the last separator is the
|
|
307
|
+
* tail (`Foo::bar` ⇒ `Foo.bar` ⇒ leaf `bar`), matching the Rust CALLS query's
|
|
308
|
+
* `@reference.name` tail capture and {@link
|
|
309
|
+
* import('../emit.js').calleesOfBlock}'s `lastIndexOf('.')` leaf rule. The
|
|
310
|
+
* receiver is set only when the head segment is a bound LOCAL (`a::b::c` with
|
|
311
|
+
* `a` a local); a type / module head (`Foo`, `crate`) is no value binding.
|
|
312
|
+
*/
|
|
313
|
+
private harvestScopedCallee;
|
|
314
|
+
/**
|
|
315
|
+
* `field_expression` chain walk shared by value position and callee position.
|
|
316
|
+
* Records the chain-root identifier as a use plus at most ONE member-read site
|
|
317
|
+
* — the INNERMOST access — when the root is an identifier; `skipFinalRead`
|
|
318
|
+
* suppresses it when that access is the callee (carried by the dotted path
|
|
319
|
+
* instead). Mirrors the Swift / Kotlin / Go / Python harvesters' walkChain. A
|
|
320
|
+
* non-identifier root (`self`/literal/call) launders no static path/receiver
|
|
321
|
+
* but its uses + nested sites are still walked.
|
|
322
|
+
*/
|
|
323
|
+
private walkChain;
|
|
324
|
+
}
|