gitnexus 1.6.8-rc.9 → 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 +11 -0
- package/dist/core/ingestion/languages/c-cpp.js +6 -1
- 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 +3 -0
- 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 +23 -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/parse-worker.d.ts +13 -0
- package/dist/core/ingestion/workers/parse-worker.js +76 -17
- package/dist/core/ingestion/workers/worker-pool.d.ts +9 -40
- package/dist/core/ingestion/workers/worker-pool.js +15 -2
- 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.d.ts +17 -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 +41 -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,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared scope-tree substrate for the C-family / Go / Java / C# def/use
|
|
3
|
+
* harvesters (#2197 U6, plan KTD4 — a byte-equivalent consolidation).
|
|
4
|
+
*
|
|
5
|
+
* The Go ({@link import('./go-harvest.js').GoHarvester}), Java ({@link
|
|
6
|
+
* import('./java-harvest.js').JavaHarvester}), C# ({@link
|
|
7
|
+
* import('./csharp-harvest.js').CsharpHarvester}) and C/C++ ({@link
|
|
8
|
+
* import('./c-cpp-harvest.js').CCppHarvester}) harvesters each carried a
|
|
9
|
+
* BYTE-IDENTICAL copy of the lexical scope tree machinery: the {@link Scope}
|
|
10
|
+
* record, the binding/scope/synthetic state, the two-phase resolution cache, and
|
|
11
|
+
* the `openScope` / `nearestScopeOf` / `resolve` / `def` / `use` / `conditional`
|
|
12
|
+
* / `bindingTable` methods. This base holds that one copy; the four harvesters
|
|
13
|
+
* extend it and supply ONLY their genuine per-language variation — the
|
|
14
|
+
* `prescan` switch (abstract) and, for Go, the blank-identifier (`_`) overrides
|
|
15
|
+
* of `declare` / `def` / `use`.
|
|
16
|
+
*
|
|
17
|
+
* TWO-PHASE, ORDER-INDEPENDENT (load-bearing): the CFG walk is NOT source-order
|
|
18
|
+
* (`visitFor` builds the init block after the body, `visitDoWhile` the condition
|
|
19
|
+
* before the body), so resolving names against a scope stack populated *during*
|
|
20
|
+
* the walk would mis-resolve. Phase 1 (`prescan`, per-language) pre-scans the
|
|
21
|
+
* whole function subtree once into a completed lexical scope tree; phase 2
|
|
22
|
+
* (`resolve`) resolves defs/uses against that finished tree from any walk order.
|
|
23
|
+
*
|
|
24
|
+
* Identifiers with no in-function declaration (globals, fields, imports, …)
|
|
25
|
+
* resolve to a SYNTHETIC module-level binding (`name@module`), created on first
|
|
26
|
+
* reference and applied identically by def and use harvesting.
|
|
27
|
+
*
|
|
28
|
+
* NOTE: nothing serialized via the harvested bindings/facts may carry a field
|
|
29
|
+
* named `nodeId` — the durable parsedfile-store reviver dedups objects keyed on
|
|
30
|
+
* that field name.
|
|
31
|
+
*/
|
|
32
|
+
import type { SyntaxNode } from '../../utils/ast-helpers.js';
|
|
33
|
+
import type { BindingEntry } from '../types.js';
|
|
34
|
+
import { CallSiteFactAccumulator } from './call-site-harvest.js';
|
|
35
|
+
/**
|
|
36
|
+
* The per-statement def/use + call-site collector, aliased to the shared
|
|
37
|
+
* {@link CallSiteFactAccumulator} (one name for the value and the type).
|
|
38
|
+
*/
|
|
39
|
+
export type FactAccumulator = CallSiteFactAccumulator;
|
|
40
|
+
export interface Scope {
|
|
41
|
+
readonly parent: Scope | null;
|
|
42
|
+
/** name → binding index */
|
|
43
|
+
readonly table: Map<string, number>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Abstract base owning the lexical scope tree + the two-phase resolution
|
|
47
|
+
* substrate. Subclasses provide the per-language constructor wiring (param /
|
|
48
|
+
* receiver declaration + the body `prescan` kick-off) and the abstract
|
|
49
|
+
* `prescan`; Go additionally overrides `declare` / `def` / `use` for its `_`
|
|
50
|
+
* blank-identifier semantics.
|
|
51
|
+
*/
|
|
52
|
+
export declare abstract class ScopeTreeHarvester {
|
|
53
|
+
protected readonly fnNode: SyntaxNode;
|
|
54
|
+
protected readonly bindings: BindingEntry[];
|
|
55
|
+
protected readonly scopeByNode: Map<number, Scope>;
|
|
56
|
+
protected readonly root: Scope;
|
|
57
|
+
protected readonly synthetic: Map<string, number>;
|
|
58
|
+
protected readonly fnId: number;
|
|
59
|
+
/** Innermost enclosing scope per visited node id (prescan-filled) — O(scope-chain) phase-2 resolution. */
|
|
60
|
+
protected readonly nearestScopeCache: Map<number, Scope>;
|
|
61
|
+
/** >0 while walking a conditionally-evaluated subexpression — defs become may-defs. */
|
|
62
|
+
protected conditionalDepth: number;
|
|
63
|
+
/**
|
|
64
|
+
* Call/new node id → bindings whose declaration/assignment VALUE is exactly
|
|
65
|
+
* that call (#2195 U6). Registered before the value walk, consumed by the
|
|
66
|
+
* language harvester's `visitCall` (mirrors the TS harvester's
|
|
67
|
+
* `resultDefTargets`).
|
|
68
|
+
*/
|
|
69
|
+
protected readonly resultDefTargets: Map<number, number[]>;
|
|
70
|
+
constructor(fnNode: SyntaxNode);
|
|
71
|
+
/** The completed binding table — pass to `CfgBuilder.finish`. */
|
|
72
|
+
bindingTable(): readonly BindingEntry[];
|
|
73
|
+
protected openScope(node: SyntaxNode): Scope;
|
|
74
|
+
protected nearestScopeOf(node: SyntaxNode): Scope;
|
|
75
|
+
protected declare(nameNode: SyntaxNode, kind: BindingEntry['kind'], scope: Scope): void;
|
|
76
|
+
/**
|
|
77
|
+
* Phase-1 declaration pre-scan — the only genuine per-language variation (each
|
|
78
|
+
* grammar has a distinct declaration-node taxonomy). Walks the function
|
|
79
|
+
* subtree once, filling `nearestScopeCache` and the scope tables.
|
|
80
|
+
*/
|
|
81
|
+
protected abstract prescan(node: SyntaxNode, scope: Scope): void;
|
|
82
|
+
protected resolve(nameNode: SyntaxNode): number;
|
|
83
|
+
protected def(nameNode: SyntaxNode, acc: FactAccumulator): void;
|
|
84
|
+
protected use(nameNode: SyntaxNode, acc: FactAccumulator): void;
|
|
85
|
+
/** Run `fn` with defs demoted to may-defs (conditionally-evaluated context). */
|
|
86
|
+
protected conditional(fn: () => void): void;
|
|
87
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base owning the lexical scope tree + the two-phase resolution
|
|
3
|
+
* substrate. Subclasses provide the per-language constructor wiring (param /
|
|
4
|
+
* receiver declaration + the body `prescan` kick-off) and the abstract
|
|
5
|
+
* `prescan`; Go additionally overrides `declare` / `def` / `use` for its `_`
|
|
6
|
+
* blank-identifier semantics.
|
|
7
|
+
*/
|
|
8
|
+
export class ScopeTreeHarvester {
|
|
9
|
+
fnNode;
|
|
10
|
+
bindings = [];
|
|
11
|
+
scopeByNode = new Map();
|
|
12
|
+
root = { parent: null, table: new Map() };
|
|
13
|
+
synthetic = new Map();
|
|
14
|
+
fnId;
|
|
15
|
+
/** Innermost enclosing scope per visited node id (prescan-filled) — O(scope-chain) phase-2 resolution. */
|
|
16
|
+
nearestScopeCache = new Map();
|
|
17
|
+
/** >0 while walking a conditionally-evaluated subexpression — defs become may-defs. */
|
|
18
|
+
conditionalDepth = 0;
|
|
19
|
+
/**
|
|
20
|
+
* Call/new node id → bindings whose declaration/assignment VALUE is exactly
|
|
21
|
+
* that call (#2195 U6). Registered before the value walk, consumed by the
|
|
22
|
+
* language harvester's `visitCall` (mirrors the TS harvester's
|
|
23
|
+
* `resultDefTargets`).
|
|
24
|
+
*/
|
|
25
|
+
resultDefTargets = new Map();
|
|
26
|
+
constructor(fnNode) {
|
|
27
|
+
this.fnNode = fnNode;
|
|
28
|
+
this.fnId = fnNode.id;
|
|
29
|
+
this.scopeByNode.set(fnNode.id, this.root);
|
|
30
|
+
}
|
|
31
|
+
/** The completed binding table — pass to `CfgBuilder.finish`. */
|
|
32
|
+
bindingTable() {
|
|
33
|
+
return this.bindings;
|
|
34
|
+
}
|
|
35
|
+
// ── phase 1: declaration pre-scan ────────────────────────────────────────
|
|
36
|
+
openScope(node) {
|
|
37
|
+
const existing = this.scopeByNode.get(node.id);
|
|
38
|
+
if (existing)
|
|
39
|
+
return existing;
|
|
40
|
+
const scope = { parent: this.nearestScopeOf(node), table: new Map() };
|
|
41
|
+
this.scopeByNode.set(node.id, scope);
|
|
42
|
+
return scope;
|
|
43
|
+
}
|
|
44
|
+
nearestScopeOf(node) {
|
|
45
|
+
for (let p = node.parent; p; p = p.parent) {
|
|
46
|
+
const s = this.scopeByNode.get(p.id);
|
|
47
|
+
if (s)
|
|
48
|
+
return s;
|
|
49
|
+
if (p.id === this.fnId)
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
return this.root;
|
|
53
|
+
}
|
|
54
|
+
declare(nameNode, kind, scope) {
|
|
55
|
+
const name = nameNode.text;
|
|
56
|
+
if (!name || scope.table.has(name))
|
|
57
|
+
return;
|
|
58
|
+
scope.table.set(name, this.bindings.length);
|
|
59
|
+
this.bindings.push({
|
|
60
|
+
name,
|
|
61
|
+
declLine: nameNode.startPosition.row + 1,
|
|
62
|
+
declColumn: nameNode.startPosition.column,
|
|
63
|
+
kind,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// ── phase 2: per-statement fact extraction ───────────────────────────────
|
|
67
|
+
resolve(nameNode) {
|
|
68
|
+
const name = nameNode.text;
|
|
69
|
+
const cached = this.nearestScopeCache.get(nameNode.id);
|
|
70
|
+
let startScope = cached ?? null;
|
|
71
|
+
if (!startScope) {
|
|
72
|
+
for (let p = nameNode; p; p = p.parent) {
|
|
73
|
+
const scope = this.scopeByNode.get(p.id) ?? this.nearestScopeCache.get(p.id);
|
|
74
|
+
if (scope) {
|
|
75
|
+
startScope = scope;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
if (p.id === this.fnId) {
|
|
79
|
+
startScope = this.root;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
for (let s = startScope; s; s = s.parent) {
|
|
85
|
+
const idx = s.table.get(name);
|
|
86
|
+
if (idx !== undefined)
|
|
87
|
+
return idx;
|
|
88
|
+
}
|
|
89
|
+
let idx = this.synthetic.get(name);
|
|
90
|
+
if (idx === undefined) {
|
|
91
|
+
idx = this.bindings.length;
|
|
92
|
+
this.synthetic.set(name, idx);
|
|
93
|
+
this.bindings.push({ name, declLine: 0, declColumn: 0, kind: 'module', synthetic: true });
|
|
94
|
+
}
|
|
95
|
+
return idx;
|
|
96
|
+
}
|
|
97
|
+
def(nameNode, acc) {
|
|
98
|
+
if (this.conditionalDepth > 0)
|
|
99
|
+
acc.addMayDef(this.resolve(nameNode));
|
|
100
|
+
else
|
|
101
|
+
acc.addDef(this.resolve(nameNode));
|
|
102
|
+
}
|
|
103
|
+
use(nameNode, acc) {
|
|
104
|
+
acc.addUse(this.resolve(nameNode));
|
|
105
|
+
}
|
|
106
|
+
/** Run `fn` with defs demoted to may-defs (conditionally-evaluated context). */
|
|
107
|
+
conditional(fn) {
|
|
108
|
+
this.conditionalDepth++;
|
|
109
|
+
try {
|
|
110
|
+
fn();
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
this.conditionalDepth--;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swift def/use harvester (#2195) — the Swift analogue of
|
|
3
|
+
* {@link import('./typescript-harvest.js').TsHarvester} and the C-family / Go /
|
|
4
|
+
* Rust / Kotlin / Python harvesters. Like the Kotlin / Go / Python / Dart
|
|
5
|
+
* harvesters it harvests the per-function binding table ({@link BindingEntry}[])
|
|
6
|
+
* plus {@link StatementFacts} (defs / uses / mayDefs) AND a taint
|
|
7
|
+
* {@link import('../types.js').SiteRecord} per call (callee path, receiver,
|
|
8
|
+
* per-arg occurrence entries, result defs, and an `at` anchor) via the shared
|
|
9
|
+
* {@link CallSiteFactAccumulator} — the same site substrate the C-family / Go /
|
|
10
|
+
* TS / Kotlin / Python / Dart harvesters emit.
|
|
11
|
+
*
|
|
12
|
+
* SWIFT CALL SHAPE (verified by a real parse — see below; structurally identical
|
|
13
|
+
* to Kotlin). A call is a `call_expression` whose LAST child is a `call_suffix`
|
|
14
|
+
* (holding the `value_arguments` and/or a trailing closure `lambda_literal`); the
|
|
15
|
+
* callee is the preceding expression — a bare `simple_identifier` (`foo(...)`)
|
|
16
|
+
* for a FREE call, or a `navigation_expression` (`obj.method` / `a?.b`, fields
|
|
17
|
+
* `target`/`suffix`→`navigation_suffix`→`suffix`:`simple_identifier`) for a
|
|
18
|
+
* MEMBER call. A chained call `a.b.c()` nests `navigation_expression`s; the
|
|
19
|
+
* receiver is the chain ROOT binding (`self`/literal roots launder no taint —
|
|
20
|
+
* no receiver). Swift has no `new` — an init call `Foo(...)` is an ordinary
|
|
21
|
+
* `call_expression` with a `simple_identifier` callee, so every site is
|
|
22
|
+
* `kind: 'call'` (the CALLS query re-tags an UpperCamelCase callee
|
|
23
|
+
* `@reference.call.constructor`, but the harvester only needs callee + receiver
|
|
24
|
+
* + `at` right — `kind` is not joined). A `value_argument` carries its value in
|
|
25
|
+
* the `value` field; a labeled arg's `value_argument_label` (`name:`) is dropped,
|
|
26
|
+
* so only the value occurrence is recorded (an `&inout` value walks its target
|
|
27
|
+
* for the use). Trailing closures (`xs.map { … }`) are a nested `lambda_literal`
|
|
28
|
+
* — opaque (in {@link NESTED_FUNCTION_TYPES}), NOT an argument occurrence.
|
|
29
|
+
*
|
|
30
|
+
* ANCHOR ALIGNMENT (plan KTD7 — load-bearing): a call site's `at` MUST be the
|
|
31
|
+
* SAME `[line (1-based), col (0-based)]` the Swift CALLS resolution keys its
|
|
32
|
+
* `atRange` on, because a downstream unit joins the two by EXACT position. The
|
|
33
|
+
* Swift scope query (query.ts) anchors `@reference.call.free`,
|
|
34
|
+
* `@reference.call.member`, and `@reference.call.constructor` on the WHOLE
|
|
35
|
+
* `call_expression` node (the `@reference.name` simple_identifier and the
|
|
36
|
+
* `@reference.receiver` are SUB-tags, excluded from the anchor by
|
|
37
|
+
* `KNOWN_SUB_TAGS` + the broadest-span rule in `anchorCaptureFor`; the
|
|
38
|
+
* constructor re-tag at `captures.ts` reuses the same call_expression node, and
|
|
39
|
+
* `atRange: anchor.range` at scope-extractor.ts:1030). So for a free call
|
|
40
|
+
* `foo(x)`, a member call `obj.method(x)`, a chained call `a.b.c(x)`, and an init
|
|
41
|
+
* call `Foo(x)` alike, `at` is the start of the enclosing `call_expression` node
|
|
42
|
+
* — which, for a member/chained call, starts at the RECEIVER (`obj`/`a`), exactly
|
|
43
|
+
* where the CALLS anchor starts too. This is the Kotlin/Go/Python whole-call-node
|
|
44
|
+
* model, NOT the Dart callee-name model. `visitCall` receives exactly the
|
|
45
|
+
* `call_expression` node and records `[node.startPosition.row + 1,
|
|
46
|
+
* node.startPosition.column]`.
|
|
47
|
+
*
|
|
48
|
+
* Runs in the parse worker next to the Swift CFG visitor. Output is the binding
|
|
49
|
+
* table the {@link import('../cfg-builder.js').CfgBuilder} stamps onto the CFG,
|
|
50
|
+
* plus the per-block def/use facts the reaching-defs / CDG solvers consume.
|
|
51
|
+
*
|
|
52
|
+
* Every node type and field literal below was grammar-validated against the
|
|
53
|
+
* VENDORED tree-sitter-swift via the introspection probe before use (mandatory
|
|
54
|
+
* pre-step). Swift shapes pre-empted (verified by a real parse):
|
|
55
|
+
* - functions: `function_declaration` / `init_declaration` / `deinit_declaration`
|
|
56
|
+
* (field `body`=`function_body`, which wraps a `statements` node) and
|
|
57
|
+
* `lambda_literal` (a closure — its `statements` follow an optional
|
|
58
|
+
* `lambda_function_type` + `in`, NO `function_body` wrapper).
|
|
59
|
+
* - parameters: `parameter` (fields `external_name`?/`name`=`simple_identifier`,
|
|
60
|
+
* plus a type child). A closure's parameters live in `lambda_function_type` →
|
|
61
|
+
* `lambda_function_type_parameters` (bare `simple_identifier`s).
|
|
62
|
+
* - `property_declaration` — Swift's `let`/`var` binding: a `value_binding_pattern`
|
|
63
|
+
* (`mutability` = `let`/`var`), then repeated `name`=`pattern` + `value`= pairs
|
|
64
|
+
* (`let p = 1, q = 2`). A `pattern` binds via `bound_identifier`=`simple_identifier`
|
|
65
|
+
* or nests `pattern`s for tuple destructuring (`let (a, b) = pair`).
|
|
66
|
+
* - optional binding (`if let` / `while let` / `guard let`): a `value_binding_pattern`
|
|
67
|
+
* in the construct's `condition` fields, then a `bound_identifier` field and the
|
|
68
|
+
* bound value as further `condition` fields.
|
|
69
|
+
* - `for_statement` fields `item`=`pattern` / `collection` / optional `where_clause`.
|
|
70
|
+
* - `catch_block` field `error`=`pattern` (the bound error).
|
|
71
|
+
* - reads: `simple_identifier`, `navigation_expression` (`a.b` — fields
|
|
72
|
+
* `target`/`suffix`), `call_expression` (`f()` — `call_suffix`),
|
|
73
|
+
* `assignment` (fields `target`/`operator`/`result`).
|
|
74
|
+
*
|
|
75
|
+
* TWO-PHASE, ORDER-INDEPENDENT (load-bearing — mirrors the Rust / Go / C
|
|
76
|
+
* harvesters): the CFG walk is NOT source-order (`repeat … while` builds the
|
|
77
|
+
* condition after the body), so resolving names against a scope stack populated
|
|
78
|
+
* *during* the walk would mis-resolve. Phase 1 pre-scans the whole function
|
|
79
|
+
* subtree once, declaring every bound name into ONE function table; phase 2
|
|
80
|
+
* resolves defs/uses against that finished table from any walk order. Swift DOES
|
|
81
|
+
* have block scope + shadowing, but a single function table is the documented v1
|
|
82
|
+
* simplification used by the Python / Rust harvesters — distinct shadowing
|
|
83
|
+
* redeclarations of the same name collapse onto one binding (an over-approximation
|
|
84
|
+
* that can falsely kill across a shadow, the sound direction for taint).
|
|
85
|
+
*
|
|
86
|
+
* v1 def-semantics scope:
|
|
87
|
+
* - `property_declaration` (`let`/`var PAT = …`) — each `simple_identifier`
|
|
88
|
+
* leaf of every `name` pattern is a def; the values are walked for uses.
|
|
89
|
+
* - `assignment` plain `=` — a plain-identifier target is a def; a
|
|
90
|
+
* `navigation_expression` / subscript target (`self.x = …`, `a[i] = …`) is
|
|
91
|
+
* NOT a scalar def (its root is a use). A compound `+=`/`-=`/… target
|
|
92
|
+
* def-AND-uses the lvalue.
|
|
93
|
+
* - `for x in xs` — the loop pattern's leaves are defs, the collection a use.
|
|
94
|
+
* - optional binding (`if let` / `while let` / `guard let`) binds its pattern.
|
|
95
|
+
* - `catch_block`'s `error` pattern binds.
|
|
96
|
+
* - parameters (incl. closure params) are `param`-kind defs.
|
|
97
|
+
* EXCLUDED, deliberately (TypeScript-CFA precedent): member / subscript writes
|
|
98
|
+
* (`obj.f = …`, `a[i] = …`) are NOT scalar defs — their root identifiers are
|
|
99
|
+
* uses only. Nested-function bodies (`lambda_literal`, a nested
|
|
100
|
+
* `function_declaration`) are opaque in BOTH directions (captured reads/writes
|
|
101
|
+
* invisible).
|
|
102
|
+
*
|
|
103
|
+
* MAY-DEFS: a def inside a conditionally-evaluated subexpression — the right
|
|
104
|
+
* operand of `&&` / `||` short-circuit, and a switch-case `where` guard / case
|
|
105
|
+
* test — is a may-def (gen WITHOUT kill), so the not-taken path's prior def is
|
|
106
|
+
* not falsely killed. A `while let` re-test binding is also a may-def (the bind
|
|
107
|
+
* does not happen on the exit iteration).
|
|
108
|
+
*
|
|
109
|
+
* Identifiers with no in-function declaration (module/global functions, types,
|
|
110
|
+
* enum cases) resolve to a SYNTHETIC module-level binding (`name@module`),
|
|
111
|
+
* applied identically by def and use harvesting.
|
|
112
|
+
*
|
|
113
|
+
* NOTE: nothing serialized here may carry a field named `nodeId` — the durable
|
|
114
|
+
* parsedfile-store reviver dedups objects keyed on that field name.
|
|
115
|
+
*/
|
|
116
|
+
import type { SyntaxNode } from '../../utils/ast-helpers.js';
|
|
117
|
+
import type { BindingEntry, StatementFacts } from '../types.js';
|
|
118
|
+
export declare class SwiftHarvester {
|
|
119
|
+
private readonly fnNode;
|
|
120
|
+
private readonly bindings;
|
|
121
|
+
/** Single function-scope name → binding index (v1: no block scope). */
|
|
122
|
+
private readonly table;
|
|
123
|
+
private readonly synthetic;
|
|
124
|
+
private readonly fnId;
|
|
125
|
+
/** >0 while walking a conditionally-evaluated subexpression — defs become may-defs. */
|
|
126
|
+
private conditionalDepth;
|
|
127
|
+
/**
|
|
128
|
+
* `call_expression` node id → binding indices its single-target result is
|
|
129
|
+
* assigned to (`let x = f()` / `x = g()` ⇒ `[x]`). Populated just before the
|
|
130
|
+
* value walk reaches the call (see {@link registerResultDefs}) and consumed by
|
|
131
|
+
* {@link visitCall}. Mirrors the Kotlin / Go / Python harvesters' map.
|
|
132
|
+
*/
|
|
133
|
+
private readonly resultDefTargets;
|
|
134
|
+
constructor(fnNode: SyntaxNode);
|
|
135
|
+
/** The completed binding table — pass to `CfgBuilder.finish`. */
|
|
136
|
+
bindingTable(): readonly BindingEntry[];
|
|
137
|
+
/**
|
|
138
|
+
* The function/closure body `statements` node. A `function_declaration` /
|
|
139
|
+
* `init_declaration` / `deinit_declaration` wraps it in a `function_body`; a
|
|
140
|
+
* `lambda_literal` carries the `statements` directly.
|
|
141
|
+
*/
|
|
142
|
+
private bodyOf;
|
|
143
|
+
private declare;
|
|
144
|
+
/** Declare every parameter binder of a fn / init / closure. */
|
|
145
|
+
private declareParams;
|
|
146
|
+
private declareClosureParams;
|
|
147
|
+
/**
|
|
148
|
+
* Pre-scan the function body once, declaring every bound name. Recurses into
|
|
149
|
+
* compound expressions but NOT into nested `function_declaration` /
|
|
150
|
+
* `lambda_literal` bodies (opaque).
|
|
151
|
+
*/
|
|
152
|
+
private prescan;
|
|
153
|
+
/** Declare the bindings of each optional binding in a condition. */
|
|
154
|
+
private declareOptionalBindings;
|
|
155
|
+
/**
|
|
156
|
+
* Declare every `simple_identifier` leaf of a binding pattern. Handles the
|
|
157
|
+
* common Swift pattern shapes: a `bound_identifier` simple pattern and tuple
|
|
158
|
+
* destructuring (`(a, b)`), which nests `pattern` children. `_` (the wildcard)
|
|
159
|
+
* binds nothing.
|
|
160
|
+
*/
|
|
161
|
+
private declarePattern;
|
|
162
|
+
/** Def/use facts for one statement (or construct-header expression) node. */
|
|
163
|
+
facts(node: SyntaxNode): StatementFacts;
|
|
164
|
+
/** Facts for an expression whose WHOLE evaluation is conditional (guards/tests). */
|
|
165
|
+
factsConditional(node: SyntaxNode): StatementFacts;
|
|
166
|
+
/**
|
|
167
|
+
* Def-ONLY facts for a value-position binding carrier (`let x = if … / switch …`,
|
|
168
|
+
* #2207): just the declared name pattern's leaves, attached to the continuation
|
|
169
|
+
* block the branch arms rejoin. The condition + arm-value USES are already
|
|
170
|
+
* harvested onto the branch's own blocks (visitIf / visitSwitch), so this must
|
|
171
|
+
* NOT re-walk the value — only the `name`-field pattern leaves are defs here.
|
|
172
|
+
*/
|
|
173
|
+
bindingDefFacts(stmt: SyntaxNode): StatementFacts | undefined;
|
|
174
|
+
/**
|
|
175
|
+
* MAY-def facts for a `switch_pattern`'s value bindings (`case let n` /
|
|
176
|
+
* `case .some(let v)`). The binding only takes effect when the case matches,
|
|
177
|
+
* so it is a may-def on the dispatch block — propagated into the case body
|
|
178
|
+
* where the bound name is read.
|
|
179
|
+
*/
|
|
180
|
+
switchPatternFacts(switchPattern: SyntaxNode): StatementFacts;
|
|
181
|
+
/**
|
|
182
|
+
* Facts for a `for item in COLLECTION` head: the loop pattern's leaves are
|
|
183
|
+
* defs, the iterated collection a use. The `where` guard (if any) is harvested
|
|
184
|
+
* conditionally.
|
|
185
|
+
*/
|
|
186
|
+
forHeadFacts(stmt: SyntaxNode): StatementFacts;
|
|
187
|
+
/**
|
|
188
|
+
* Facts for an `if`/`while`/`guard` condition: optional bindings bind their
|
|
189
|
+
* pattern (a def — a may-def when `conditional`), and the condition expression
|
|
190
|
+
* children are uses. The construct's `condition` / `bound_identifier` fields are
|
|
191
|
+
* interleaved, so we walk all children and classify them.
|
|
192
|
+
*/
|
|
193
|
+
conditionFacts(stmt: SyntaxNode, conditional: boolean): StatementFacts;
|
|
194
|
+
/** ENTRY-block facts for the parameters (defs only). */
|
|
195
|
+
paramFacts(): StatementFacts | undefined;
|
|
196
|
+
/** Def fact for a `catch let e` error pattern — prepend to the handler entry block. */
|
|
197
|
+
catchErrorFacts(catchBlock: SyntaxNode): StatementFacts | undefined;
|
|
198
|
+
private resolve;
|
|
199
|
+
private def;
|
|
200
|
+
private use;
|
|
201
|
+
/** Run `fn` with defs demoted to may-defs (conditionally-evaluated context). */
|
|
202
|
+
private conditional;
|
|
203
|
+
/**
|
|
204
|
+
* Def each `simple_identifier` leaf of a binding pattern (the def-position
|
|
205
|
+
* analogue of {@link declarePattern}). Tuple destructuring recurses; `_` binds
|
|
206
|
+
* nothing.
|
|
207
|
+
*/
|
|
208
|
+
private defPattern;
|
|
209
|
+
/** Value-position walk: collect uses; route def positions to the pattern handler. */
|
|
210
|
+
private walkValue;
|
|
211
|
+
/** Strip a `directly_assignable_expression` wrapper around an lvalue. */
|
|
212
|
+
private unwrapAssignable;
|
|
213
|
+
/**
|
|
214
|
+
* The sole `bound_identifier` binder of a single `name` pattern, or undefined
|
|
215
|
+
* when there are multiple `name` patterns or the pattern is a tuple / wildcard
|
|
216
|
+
* destructuring (`let (a, b) = …`). Used to gate single-target result-defs.
|
|
217
|
+
*/
|
|
218
|
+
private singlePatternBinder;
|
|
219
|
+
/**
|
|
220
|
+
* When `value`'s root (after unwrapping) is a `call_expression`, remember that
|
|
221
|
+
* call site should carry `resultDefs` — the binding indices of `targets`
|
|
222
|
+
* (def-position identifiers). Consumed by {@link visitCall} once the value walk
|
|
223
|
+
* reaches the node. Single-target only; the blank target (`_`) binds nothing.
|
|
224
|
+
*/
|
|
225
|
+
private registerResultDefs;
|
|
226
|
+
/**
|
|
227
|
+
* The callee node of a `call_expression` — the first named child that is NOT
|
|
228
|
+
* the trailing `call_suffix` (a bare `simple_identifier` for a free / init
|
|
229
|
+
* call, or a `navigation_expression` for a member / chained call).
|
|
230
|
+
*/
|
|
231
|
+
private calleeOf;
|
|
232
|
+
/**
|
|
233
|
+
* Open + populate a call site for a Swift `call_expression`. `node` IS the
|
|
234
|
+
* `call_expression` — the SAME node the scope query anchors `@reference.call.*`
|
|
235
|
+
* on (its `atRange`), so the resolved-id join lands by exact position (see file
|
|
236
|
+
* header ANCHOR ALIGNMENT). Swift has no `new`, so every site is `kind: 'call'`.
|
|
237
|
+
*/
|
|
238
|
+
private visitCall;
|
|
239
|
+
/**
|
|
240
|
+
* Walk a `call_suffix`'s `value_arguments`, tagging each positional / labeled
|
|
241
|
+
* argument's occurrence position. A trailing closure (`lambda_literal`) is a
|
|
242
|
+
* nested function body — opaque (excluded by {@link NESTED_FUNCTION_TYPES}), so
|
|
243
|
+
* it is not an argument occurrence here.
|
|
244
|
+
*/
|
|
245
|
+
private walkArguments;
|
|
246
|
+
/**
|
|
247
|
+
* `navigation_expression` chain walk shared by value position and callee
|
|
248
|
+
* position. Records the chain-root identifier as a use plus at most ONE
|
|
249
|
+
* member-read site — the INNERMOST access — when the root is an identifier;
|
|
250
|
+
* `skipFinalRead` suppresses it when that access is the callee (carried by the
|
|
251
|
+
* dotted path instead). Mirrors the Kotlin / Go / Python harvesters' walkChain.
|
|
252
|
+
* A non-identifier root (`self`/literal/call) launders no static path/receiver.
|
|
253
|
+
*/
|
|
254
|
+
private walkChain;
|
|
255
|
+
}
|