gitnexus 1.6.11-rc.8 → 1.6.11
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 +95 -26
- package/dist/_shared/graph/types.d.ts +81 -2
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +2 -0
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/languages.d.ts +2 -1
- package/dist/_shared/languages.d.ts.map +1 -1
- package/dist/_shared/languages.js +1 -0
- package/dist/_shared/languages.js.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +2 -2
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +4 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.d.ts +3 -0
- package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.js +4 -0
- package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +10 -0
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +15 -0
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +4 -0
- package/dist/cli/ai-context.js +90 -14
- package/dist/cli/analyze-config.js +14 -0
- package/dist/cli/analyze-options.d.ts +14 -0
- package/dist/cli/analyze-watch.d.ts +20 -0
- package/dist/cli/analyze-watch.js +434 -0
- package/dist/cli/analyze.js +27 -9
- package/dist/cli/auto-sync.d.ts +1 -0
- package/dist/cli/auto-sync.js +107 -0
- package/dist/cli/command-banner.d.ts +15 -0
- package/dist/cli/command-banner.js +42 -0
- package/dist/cli/detect-changes-format.js +21 -0
- package/dist/cli/doctor.d.ts +7 -0
- package/dist/cli/doctor.js +14 -0
- package/dist/cli/group.js +7 -1
- package/dist/cli/help-i18n.js +4 -0
- package/dist/cli/i18n/en.d.ts +18 -3
- package/dist/cli/i18n/en.js +18 -3
- package/dist/cli/i18n/resources.d.ts +33 -3
- package/dist/cli/i18n/zh-CN.d.ts +15 -0
- package/dist/cli/i18n/zh-CN.js +18 -3
- package/dist/cli/index.js +34 -7
- package/dist/cli/mcp.d.ts +15 -0
- package/dist/cli/mcp.js +44 -0
- package/dist/cli/optional-grammars.d.ts +3 -2
- package/dist/cli/optional-grammars.js +19 -3
- package/dist/cli/setup.js +41 -15
- package/dist/cli/update-notice.d.ts +34 -0
- package/dist/cli/update-notice.js +91 -0
- package/dist/cli/update.d.ts +21 -0
- package/dist/cli/update.js +93 -0
- package/dist/cli/watch.d.ts +1 -20
- package/dist/cli/watch.js +5 -371
- package/dist/core/analysis-feature-registry.d.ts +2 -0
- package/dist/core/analysis-feature-registry.js +15 -0
- package/dist/core/analyzer-identity.js +21 -3
- package/dist/core/auto-sync/analysis-worker-launch.d.ts +30 -0
- package/dist/core/auto-sync/analysis-worker-launch.js +166 -0
- package/dist/core/auto-sync/config.d.ts +33 -0
- package/dist/core/auto-sync/config.js +320 -0
- package/dist/core/auto-sync/index.d.ts +6 -0
- package/dist/core/auto-sync/index.js +6 -0
- package/dist/core/auto-sync/path-security.d.ts +9 -0
- package/dist/core/auto-sync/path-security.js +251 -0
- package/dist/core/auto-sync/repo.d.ts +1 -0
- package/dist/core/auto-sync/repo.js +6 -0
- package/dist/core/auto-sync/runner.d.ts +44 -0
- package/dist/core/auto-sync/runner.js +428 -0
- package/dist/core/auto-sync/starter.d.ts +50 -0
- package/dist/core/auto-sync/starter.js +497 -0
- package/dist/core/auto-sync/state.d.ts +37 -0
- package/dist/core/auto-sync/state.js +119 -0
- package/dist/core/group/config-parser.js +8 -1
- package/dist/core/group/cross-impact.d.ts +3 -0
- package/dist/core/group/cross-impact.js +36 -4
- package/dist/core/group/extractors/http-patterns/java.js +22 -8
- package/dist/core/group/extractors/http-patterns/kotlin.js +86 -31
- package/dist/core/group/extractors/http-patterns/node.js +145 -8
- package/dist/core/group/extractors/http-patterns/python.js +11 -7
- package/dist/core/group/extractors/http-route-extractor.js +63 -17
- package/dist/core/group/extractors/java-workspace-extractor.js +244 -31
- package/dist/core/group/group-lock.js +5 -6
- package/dist/core/group/normalization.d.ts +38 -1
- package/dist/core/group/normalization.js +59 -3
- package/dist/core/group/service.d.ts +11 -0
- package/dist/core/group/service.js +13 -1
- package/dist/core/group/storage.js +2 -2
- package/dist/core/group/sync.d.ts +24 -1
- package/dist/core/group/sync.js +46 -8
- package/dist/core/group/types.d.ts +13 -0
- package/dist/core/incremental/derived-writeback.d.ts +36 -0
- package/dist/core/incremental/derived-writeback.js +68 -0
- package/dist/core/incremental/spring-config-drift.d.ts +12 -0
- package/dist/core/incremental/spring-config-drift.js +46 -0
- package/dist/core/incremental/subgraph-extract.d.ts +7 -4
- package/dist/core/incremental/subgraph-extract.js +30 -5
- package/dist/core/ingestion/asyncapi/document.d.ts +226 -0
- package/dist/core/ingestion/asyncapi/document.js +758 -0
- package/dist/core/ingestion/asyncapi/protocol.d.ts +79 -0
- package/dist/core/ingestion/asyncapi/protocol.js +203 -0
- package/dist/core/ingestion/call-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/call-extractors/configs/zig.js +4 -0
- package/dist/core/ingestion/call-extractors/zig-static-gating.d.ts +100 -0
- package/dist/core/ingestion/call-extractors/zig-static-gating.js +319 -0
- package/dist/core/ingestion/call-processor.js +3 -1
- package/dist/core/ingestion/class-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/class-extractors/configs/zig.js +32 -0
- package/dist/core/ingestion/class-extractors/generic.js +4 -1
- package/dist/core/ingestion/class-types.d.ts +6 -2
- package/dist/core/ingestion/destination-key.d.ts +59 -0
- package/dist/core/ingestion/destination-key.js +61 -0
- package/dist/core/ingestion/entry-point-scoring.d.ts +6 -2
- package/dist/core/ingestion/entry-point-scoring.js +8 -44
- package/dist/core/ingestion/export-detection.d.ts +37 -0
- package/dist/core/ingestion/export-detection.js +60 -0
- package/dist/core/ingestion/field-extractors/configs/zig.d.ts +8 -0
- package/dist/core/ingestion/field-extractors/configs/zig.js +49 -0
- package/dist/core/ingestion/field-extractors/generic.d.ts +1 -1
- package/dist/core/ingestion/field-extractors/generic.js +12 -1
- package/dist/core/ingestion/frameworks/spring/actuator-runtime.d.ts +26 -0
- package/dist/core/ingestion/frameworks/spring/actuator-runtime.js +843 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +5 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +9 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +8 -1
- package/dist/core/ingestion/frameworks/spring/argument-facts.d.ts +80 -0
- package/dist/core/ingestion/frameworks/spring/argument-facts.js +85 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +1 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +2 -1
- package/dist/core/ingestion/frameworks/spring/destinations.d.ts +539 -0
- package/dist/core/ingestion/frameworks/spring/destinations.js +840 -0
- package/dist/core/ingestion/frameworks/spring/dynamic-lookups.d.ts +22 -0
- package/dist/core/ingestion/frameworks/spring/dynamic-lookups.js +124 -0
- package/dist/core/ingestion/frameworks/spring/message-producers.d.ts +78 -0
- package/dist/core/ingestion/frameworks/spring/message-producers.js +90 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +29 -0
- package/dist/core/ingestion/frameworks/spring/vendor-prefixes.d.ts +7 -0
- package/dist/core/ingestion/frameworks/spring/vendor-prefixes.js +22 -0
- package/dist/core/ingestion/import-resolvers/configs/zig.d.ts +13 -0
- package/dist/core/ingestion/import-resolvers/configs/zig.js +26 -0
- package/dist/core/ingestion/import-resolvers/zig.d.ts +34 -0
- package/dist/core/ingestion/import-resolvers/zig.js +193 -0
- package/dist/core/ingestion/language-config.d.ts +177 -0
- package/dist/core/ingestion/language-config.js +719 -0
- package/dist/core/ingestion/language-provider.d.ts +178 -1
- package/dist/core/ingestion/language-provider.js +22 -0
- package/dist/core/ingestion/languages/csharp/razor-view-components.d.ts +62 -0
- package/dist/core/ingestion/languages/csharp/razor-view-components.js +954 -0
- package/dist/core/ingestion/languages/csharp/resolution-config.d.ts +3 -0
- package/dist/core/ingestion/languages/csharp/resolution-config.js +6 -1
- package/dist/core/ingestion/languages/csharp/scope-resolver.js +8 -0
- package/dist/core/ingestion/languages/index.d.ts +1 -0
- package/dist/core/ingestion/languages/index.js +2 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +1 -1
- package/dist/core/ingestion/languages/java/analysis-features.js +14 -6
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +8 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +34 -0
- package/dist/core/ingestion/languages/java/captures.js +22 -1
- package/dist/core/ingestion/languages/java/lombok-synthesizer.d.ts +42 -0
- package/dist/core/ingestion/languages/java/lombok-synthesizer.js +439 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/java/spring-actuator.d.ts +2 -0
- package/dist/core/ingestion/languages/java/spring-actuator.js +62 -0
- package/dist/core/ingestion/languages/java/spring-di.d.ts +17 -1
- package/dist/core/ingestion/languages/java/spring-di.js +44 -2
- package/dist/core/ingestion/languages/java/spring-dynamic-lookup.d.ts +8 -0
- package/dist/core/ingestion/languages/java/spring-dynamic-lookup.js +62 -0
- package/dist/core/ingestion/languages/java/spring-message-producers.d.ts +20 -0
- package/dist/core/ingestion/languages/java/spring-message-producers.js +83 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +11 -1
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +13 -3
- package/dist/core/ingestion/languages/java.js +18 -8
- package/dist/core/ingestion/languages/jvm/accessor-synthesis.d.ts +99 -0
- package/dist/core/ingestion/languages/jvm/accessor-synthesis.js +173 -0
- package/dist/core/ingestion/languages/jvm/beanspec.d.ts +17 -0
- package/dist/core/ingestion/languages/jvm/beanspec.js +42 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +50 -0
- package/dist/core/ingestion/languages/kotlin/captures.js +24 -1
- package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.d.ts +26 -0
- package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.js +417 -0
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +4 -0
- package/dist/core/ingestion/languages/kotlin/spring-actuator.d.ts +4 -0
- package/dist/core/ingestion/languages/kotlin/spring-actuator.js +172 -0
- package/dist/core/ingestion/languages/kotlin/spring-config-bindings.d.ts +18 -0
- package/dist/core/ingestion/languages/kotlin/spring-config-bindings.js +411 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +51 -1
- package/dist/core/ingestion/languages/kotlin/spring-di.js +86 -6
- package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.d.ts +8 -0
- package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.js +77 -0
- package/dist/core/ingestion/languages/kotlin/spring-message-producers.d.ts +17 -0
- package/dist/core/ingestion/languages/kotlin/spring-message-producers.js +119 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +16 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +77 -2
- package/dist/core/ingestion/languages/kotlin.js +24 -0
- package/dist/core/ingestion/languages/python.js +2 -0
- package/dist/core/ingestion/languages/rust/query.js +8 -8
- package/dist/core/ingestion/languages/zig/captures.d.ts +260 -0
- package/dist/core/ingestion/languages/zig/captures.js +2070 -0
- package/dist/core/ingestion/languages/zig/index.d.ts +4 -0
- package/dist/core/ingestion/languages/zig/index.js +4 -0
- package/dist/core/ingestion/languages/zig/interpret.d.ts +36 -0
- package/dist/core/ingestion/languages/zig/interpret.js +176 -0
- package/dist/core/ingestion/languages/zig/query.d.ts +3 -0
- package/dist/core/ingestion/languages/zig/query.js +426 -0
- package/dist/core/ingestion/languages/zig/range-binding.d.ts +37 -0
- package/dist/core/ingestion/languages/zig/range-binding.js +373 -0
- package/dist/core/ingestion/languages/zig/scope-resolver.d.ts +12 -0
- package/dist/core/ingestion/languages/zig/scope-resolver.js +58 -0
- package/dist/core/ingestion/languages/zig/simple-hooks.d.ts +25 -0
- package/dist/core/ingestion/languages/zig/simple-hooks.js +143 -0
- package/dist/core/ingestion/languages/zig.d.ts +32 -0
- package/dist/core/ingestion/languages/zig.js +130 -0
- package/dist/core/ingestion/method-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/method-extractors/configs/zig.js +120 -0
- package/dist/core/ingestion/method-extractors/generic.js +16 -4
- package/dist/core/ingestion/method-types.d.ts +10 -4
- package/dist/core/ingestion/model/field-registry.d.ts +3 -3
- package/dist/core/ingestion/model/field-registry.js +11 -7
- package/dist/core/ingestion/model/method-registry.d.ts +3 -3
- package/dist/core/ingestion/model/method-registry.js +13 -8
- package/dist/core/ingestion/model/registration-table.js +3 -0
- package/dist/core/ingestion/model/type-registry.js +8 -4
- package/dist/core/ingestion/pipeline-phases/di.js +47 -14
- package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
- package/dist/core/ingestion/pipeline-phases/index.js +1 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +7 -1
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +79 -91
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +17 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +2 -1
- package/dist/core/ingestion/pipeline-phases/processes.js +39 -4
- package/dist/core/ingestion/pipeline-phases/routes.js +27 -18
- package/dist/core/ingestion/pipeline-phases/runner.d.ts +4 -1
- package/dist/core/ingestion/pipeline-phases/runner.js +34 -14
- package/dist/core/ingestion/pipeline-phases/scan.js +82 -1
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +8 -0
- package/dist/core/ingestion/pipeline-phases/spring-destinations.d.ts +123 -0
- package/dist/core/ingestion/pipeline-phases/spring-destinations.js +688 -0
- package/dist/core/ingestion/pipeline.d.ts +30 -1
- package/dist/core/ingestion/pipeline.js +52 -14
- package/dist/core/ingestion/resolve-references.js +5 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +16 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.js +10 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +27 -1
- package/dist/core/ingestion/route-extractors/java-const-resolver.js +161 -13
- package/dist/core/ingestion/route-extractors/kotlin-const-resolver.d.ts +12 -18
- package/dist/core/ingestion/route-extractors/kotlin-const-resolver.js +214 -33
- package/dist/core/ingestion/route-extractors/kotlin-spring.d.ts +13 -0
- package/dist/core/ingestion/route-extractors/kotlin-spring.js +259 -0
- package/dist/core/ingestion/route-extractors/python-decorator-handler.d.ts +6 -0
- package/dist/core/ingestion/route-extractors/python-decorator-handler.js +16 -0
- package/dist/core/ingestion/route-extractors/spring-shared.d.ts +30 -1
- package/dist/core/ingestion/route-extractors/spring-shared.js +77 -9
- package/dist/core/ingestion/route-extractors/spring.js +9 -5
- package/dist/core/ingestion/scope-extractor.js +8 -0
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +62 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +4 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +2 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +28 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +11 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +23 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +24 -3
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +11 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +26 -6
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +11 -0
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +29 -3
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +8 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +35 -9
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +1 -4
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +277 -9
- package/dist/core/ingestion/scope-resolution/pipeline/registry.js +2 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +7 -3
- package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +43 -9
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +71 -10
- package/dist/core/ingestion/tree-sitter-queries.d.ts +1 -0
- package/dist/core/ingestion/tree-sitter-queries.js +161 -0
- package/dist/core/ingestion/type-extractors/zig.d.ts +2 -0
- package/dist/core/ingestion/type-extractors/zig.js +17 -0
- package/dist/core/ingestion/utils/ast-helpers.d.ts +40 -1
- package/dist/core/ingestion/utils/ast-helpers.js +124 -6
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +9 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +75 -14
- package/dist/core/ingestion/utils/test-file-path.d.ts +28 -0
- package/dist/core/ingestion/utils/test-file-path.js +87 -0
- package/dist/core/ingestion/variable-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/variable-extractors/configs/zig.js +71 -0
- package/dist/core/ingestion/workers/parse-worker.js +85 -14
- package/dist/core/install-context.d.ts +4 -0
- package/dist/core/install-context.js +152 -0
- package/dist/core/lbug/csv-generator.d.ts +10 -1
- package/dist/core/lbug/csv-generator.js +92 -22
- package/dist/core/lbug/graph-emit-sink.d.ts +3 -2
- package/dist/core/lbug/graph-emit-sink.js +4 -2
- package/dist/core/lbug/lbug-adapter.d.ts +100 -5
- package/dist/core/lbug/lbug-adapter.js +236 -24
- package/dist/core/lbug/schema.d.ts +6 -5
- package/dist/core/lbug/schema.js +84 -22
- package/dist/core/net/url-guard.d.ts +6 -0
- package/dist/core/net/url-guard.js +147 -0
- package/dist/core/package-version.d.ts +5 -0
- package/dist/core/package-version.js +10 -0
- package/dist/core/run-analyze.d.ts +21 -4
- package/dist/core/run-analyze.js +426 -117
- package/dist/core/search/fts-indexes.d.ts +19 -1
- package/dist/core/search/fts-indexes.js +28 -1
- package/dist/core/tree-sitter/parser-loader.js +16 -0
- package/dist/core/update-cache.d.ts +39 -0
- package/dist/core/update-cache.js +141 -0
- package/dist/core/update-check.d.ts +31 -0
- package/dist/core/update-check.js +274 -0
- package/dist/mcp/local/local-backend.d.ts +27 -13
- package/dist/mcp/local/local-backend.js +148 -60
- package/dist/mcp/repository-policy.d.ts +5 -1
- package/dist/mcp/repository-policy.js +48 -4
- package/dist/mcp/resources.js +10 -1
- package/dist/mcp/server.js +8 -9
- package/dist/mcp/tools.js +32 -22
- package/dist/server/analyze-launch.d.ts +2 -0
- package/dist/server/analyze-launch.js +2 -0
- package/dist/server/analyze-worker-protocol.d.ts +6 -1
- package/dist/server/analyze-worker.d.ts +1 -0
- package/dist/server/analyze-worker.js +38 -20
- package/dist/server/api.d.ts +5 -1
- package/dist/server/api.js +105 -88
- package/dist/server/git-clone.d.ts +40 -16
- package/dist/server/git-clone.js +253 -199
- package/dist/server/grep-params.d.ts +18 -0
- package/dist/server/grep-params.js +83 -0
- package/dist/server/grep-scan.d.ts +23 -0
- package/dist/server/grep-scan.js +107 -0
- package/dist/server/grep-worker.d.ts +1 -0
- package/dist/server/grep-worker.js +12 -0
- package/dist/server/mcp-http.d.ts +8 -0
- package/dist/server/mcp-http.js +16 -1
- package/dist/server/update-controller.d.ts +29 -0
- package/dist/server/update-controller.js +82 -0
- package/dist/storage/file-lock.d.ts +15 -0
- package/dist/storage/file-lock.js +155 -0
- package/dist/storage/fs-atomic.d.ts +24 -0
- package/dist/storage/fs-atomic.js +86 -2
- package/dist/storage/global-dir.d.ts +2 -0
- package/dist/storage/global-dir.js +6 -0
- package/dist/storage/parse-cache.d.ts +45 -7
- package/dist/storage/parse-cache.js +189 -42
- package/dist/storage/parsedfile-store.d.ts +41 -60
- package/dist/storage/parsedfile-store.js +247 -171
- package/dist/storage/repo-manager.d.ts +10 -4
- package/dist/storage/repo-manager.js +35 -25
- package/dist/storage/repo-meta.d.ts +34 -0
- package/dist/storage/v8-sidecar.d.ts +48 -0
- package/dist/storage/v8-sidecar.js +347 -0
- package/dist/types/pipeline.d.ts +14 -0
- package/dist/utils/process-identity.d.ts +2 -0
- package/dist/utils/process-identity.js +35 -0
- package/package.json +10 -4
- package/scripts/assert-web-assets.mjs +35 -0
- package/scripts/build-web.js +72 -0
- package/scripts/build.js +31 -28
- package/scripts/cross-platform-tests.ts +5 -0
- package/skills/gitnexus-cli.md +5 -1
- package/web/assets/ProcessFlowModal-DAeX2BHW.js +24 -0
- package/web/assets/{abnfDiagram-QNN2D4NM-Cq2djWWe.js → abnfDiagram-PAR5IXJI-J3OdeHLl.js} +1 -1
- package/web/assets/{agent-BWAXPjC5.js → agent-BMRqXorA.js} +6 -4
- package/web/assets/architecture-7GRP2DOG-M7G3SWCO-G3sWyX6M.js +1 -0
- package/web/assets/architectureDiagram-2PNWDENW-ysKcRlGT.js +36 -0
- package/web/assets/blockDiagram-PUWGUBOA-oLXTa1lY.js +129 -0
- package/web/assets/c4Diagram-3NLNHZP5-D3iu4eC0.js +38 -0
- package/web/assets/{chunk-2SREHG4O-Dip42xOq.js → chunk-2NMSUPJH-B24w-wng.js} +1 -1
- package/web/assets/{chunk-VJFVEZTB-CX66F2ep.js → chunk-32MCUW2P-ByUyt0Sa.js} +3 -3
- package/web/assets/{chunk-4RFN2BYJ-DHHWuC-n.js → chunk-3NPNU5GP-DocZ07Sg.js} +1 -1
- package/web/assets/{chunk-XNMVGMAZ-Cg_LnPtj.js → chunk-3SMGFRGC-CAu4JRLv.js} +1 -1
- package/web/assets/{chunk-W44A43WB-BN8EQc_u.js → chunk-4CAJECRU-DRYMwG9z.js} +1 -1
- package/web/assets/chunk-4OADUZ5Q-CxrSvOwZ.js +10 -0
- package/web/assets/{chunk-DMV4VAQV-Bn6WXDSX.js → chunk-5IQCK5RY-CCMhl4so.js} +2 -2
- package/web/assets/{chunk-RRFMTAIC-CMN0wcYA.js → chunk-5MVFYWFU-Db9KvrYO.js} +1 -1
- package/web/assets/chunk-CLS4B6BI-Uvx5QNsu.js +168 -0
- package/web/assets/chunk-DZP67EKU-B3Mt380j.js +70 -0
- package/web/assets/{chunk-6L755F7B-CMhLBxi2.js → chunk-EICP7K5X-CqwE9hui.js} +1 -1
- package/web/assets/{chunk-BI6VK774-D0oaWk8V.js → chunk-GDY2UAB4-CtQQR0a8.js} +1 -1
- package/web/assets/chunk-H7VHZCWX-CE1nAmt6.js +1 -0
- package/web/assets/chunk-IJBDOHL6-BUKtY6oF.js +1 -0
- package/web/assets/{chunk-OIYT25JQ-CQ6KOZGX.js → chunk-JFFVMJIA-0fJenqia.js} +1 -1
- package/web/assets/{chunk-HNC4WDU7-DoU3KnA7.js → chunk-JZGDI5JK-BeTMSSkJ.js} +1 -1
- package/web/assets/{chunk-EQFTRU2I-1ix7TzW9.js → chunk-KD6SPIPN-Qp1Pflah.js} +1 -1
- package/web/assets/chunk-NF366YI6-CpSpya3n.js +231 -0
- package/web/assets/chunk-NUDPKBEF-CU1-BQIW.js +34 -0
- package/web/assets/{chunk-SATU7PGQ-B1zhgOvc.js → chunk-OJINMHTS-zOCQe4eI.js} +1 -1
- package/web/assets/{chunk-E5QJAATJ-dh-5CtIV.js → chunk-Q6NGPIAH-yyBomb63.js} +1 -1
- package/web/assets/chunk-QJSWEUOL-D_rf9gPD.js +128 -0
- package/web/assets/chunk-R7JDMUKV-CRoqKpD6.js +1 -0
- package/web/assets/{chunk-VE5CLXGZ-C1vB7wpY.js → chunk-RCXAM2GK-CUqrWQDV.js} +1 -1
- package/web/assets/{chunk-66DQ2XMT-CM0xjFAN.js → chunk-RT4MAWR3-zXy9-Lvt.js} +1 -1
- package/web/assets/{chunk-TZUXEDM2-B7p9AcTw.js → chunk-SFMINX4W-J2UrvMpD.js} +1 -1
- package/web/assets/{chunk-LORZLZWG-B57uGw2N.js → chunk-SLDQ463B-CHY6e_bQ.js} +2 -2
- package/web/assets/{chunk-FWYVLQTC-BgDItRzJ.js → chunk-TCEHX7R3-CXPDEVbm.js} +1 -1
- package/web/assets/{chunk-224SPVON-B8gxtXpy.js → chunk-VQC2EELJ-Dc8fIy4R.js} +1 -1
- package/web/assets/chunk-VRZKL3EH-DB3KixTQ.js +1 -0
- package/web/assets/{chunk-A7VWPJGB-B4O3oQdQ.js → chunk-VTHDQ7BV-b7FsPQZO.js} +1 -1
- package/web/assets/chunk-VY2OSTJR-Dkgc3Brg.js +2 -0
- package/web/assets/chunk-WUBWJARI-7FwILJ3k.js +2 -0
- package/web/assets/{chunk-D6VWDJW2-BxcBdZ9c.js → chunk-YBMQ5JGJ-BSnyWZmd.js} +1 -1
- package/web/assets/chunk-YDMLL4PJ-IHhMngTz.js +2 -0
- package/web/assets/chunk-Z6V44ARX-BjCEsF0Q.js +62 -0
- package/web/assets/chunk-ZJJ7VQJP-Dz089b-K.js +321 -0
- package/web/assets/chunk-ZNLK7HRR-B0iFpmW4.js +1 -0
- package/web/assets/chunk-ZQN7UHIL-Cy7KAjQt.js +1 -0
- package/web/assets/{chunk-L5GCOVLC-CE2w8Nm_.js → chunk-ZS6VBONO-DBjJO0w9.js} +2 -2
- package/web/assets/{chunk-NV3KIAZN-5yvcpMiu.js → chunk-ZUNWM646-DNRJyNPe.js} +1 -1
- package/web/assets/classDiagram-FGAMPOII-C5Ibyode.js +1 -0
- package/web/assets/classDiagram-v2-AI5RJEK4-C5Ibyode.js +1 -0
- package/web/assets/{cose-bilkent-RZA4XIPR-BHpK4Crp.js → cose-bilkent-Q72C2OJ3-DMeFXnK8.js} +1 -1
- package/web/assets/cynefin-OW5HDTMX-6OCTWOGG-vlqakYcO.js +1 -0
- package/web/assets/{cynefinDiagram-TR7LZUCG-C3Iar9lZ.js → cynefinDiagram-2OOWUY4M-BY6DZkTt.js} +1 -1
- package/web/assets/dagre-MPVFI544-DWO70fy_.js +4 -0
- package/web/assets/diagram-AE4NWXFW-f7JRVRUL.js +24 -0
- package/web/assets/{diagram-L7DVE3PN-GIRyVUtt.js → diagram-BUJID5UG-BXZv1rCS.js} +2 -2
- package/web/assets/{diagram-JCD7PQ7C-DC5-9FRr.js → diagram-C44CZ5NI-CRNfvjCq.js} +1 -1
- package/web/assets/diagram-EYOLEXXS-DZOjKQVE.js +30 -0
- package/web/assets/diagram-P7B6PWOJ-D3SQmw3_.js +3 -0
- package/web/assets/{ebnfDiagram-DRHRQJWO-D8_CI4ZF.js → ebnfDiagram-FTPZ3PV6-jKWpIDN2.js} +1 -1
- package/web/assets/erDiagram-H3ERR26V-BqJntEuJ.js +99 -0
- package/web/assets/eventmodeling-NTZA5JFV-WKSWQHFS-Bq4FqtBL.js +1 -0
- package/web/assets/flowDiagram-YHGXBVSY-Dnlk2bEu.js +1 -0
- package/web/assets/ganttDiagram-RWFTB7ED-Bl6Y1K5T.js +292 -0
- package/web/assets/gitGraph-4MIJSDKK-JH2HKYUO-B3yc4GkH.js +1 -0
- package/web/assets/gitGraphDiagram-MAR6GKOP-CkNvsrdw.js +106 -0
- package/web/assets/{index-CJDpyH-n.css → index-C2_aej58.css} +1 -1
- package/web/assets/{index-DDRie6_8.js → index-Dj3vQOHK.js} +51 -51
- package/web/assets/info-A6RAGUB7-3TX3OFWW-BM3N5_Dv.js +1 -0
- package/web/assets/infoDiagram-LV547AFH-COkFutAf.js +2 -0
- package/web/assets/{ishikawaDiagram-4JDSWWDM-DmqWtjkl.js → ishikawaDiagram-PUJQGNDS-Bb8FylSR.js} +2 -2
- package/web/assets/{journeyDiagram-QUS3FAKT-XAzVzrQW.js → journeyDiagram-EW5QJT4W-BzoHUBhM.js} +4 -4
- package/web/assets/{kanban-definition-D4L7SQKK-YurRnmYn.js → kanban-definition-JSQERAZB-Uy2Pi0yQ.js} +4 -4
- package/web/assets/katex-CZ4GXH2S-C0Fcou7U.js +257 -0
- package/web/assets/{mindmap-definition-66QP5TD6-ChrWWnil.js → mindmap-definition-VBJCLQLM-B-CnOnt_.js} +3 -3
- package/web/assets/packet-AYTQ26CC-MKII6P3Y-Bd52ZE3V.js +1 -0
- package/web/assets/{pegDiagram-YKIO5C6U-QGeQLEq2.js → pegDiagram-7WILOQTJ-D9sneKXg.js} +1 -1
- package/web/assets/pie-WAS4IAKB-6B4OPMJ5-DW5Xy69Z.js +1 -0
- package/web/assets/pieDiagram-EFA7CBSB-Dx2NQofL.js +39 -0
- package/web/assets/{quadrantDiagram-VO5QLCXA-B7098wSc.js → quadrantDiagram-WARVYA7P-DPKL9_0A.js} +3 -3
- package/web/assets/radar-RG4KPBEZ-UPTR3XUL-CkzibT2h.js +1 -0
- package/web/assets/railroad-74A4TZTK-MEFUPFMS-D9zF-mDN.js +1 -0
- package/web/assets/railroad-abnf-HS5TGJTU-R5YG2S5D-ruacjUbX.js +1 -0
- package/web/assets/railroad-ebnf-LZEXJU2U-G5QEX2L6-S1zc5OiO.js +1 -0
- package/web/assets/railroad-peg-WCYAUIDC-H5I2ZRY2-Cbcr0XzY.js +1 -0
- package/web/assets/{railroadDiagram-M77LTMSB-AXu4vxk_.js → railroadDiagram-5NIQVNLQ-DsweTo14.js} +1 -1
- package/web/assets/{requirementDiagram-RASO5HTO-B-l8InpK.js → requirementDiagram-SXREGOKZ-CXwdNSVR.js} +4 -4
- package/web/assets/{sankeyDiagram-F32LOJ6L-Kd7zjJgX.js → sankeyDiagram-VV74M2VP-CA6jtP9P.js} +3 -3
- package/web/assets/{sequenceDiagram-URATNSBD-BlcdY9DS.js → sequenceDiagram-52ZFIFDL-k_5rEbzm.js} +15 -15
- package/web/assets/src-Df5C1Nz4.js +1 -0
- package/web/assets/stateDiagram-3QAKPIVI-BejHTf31.js +1 -0
- package/web/assets/stateDiagram-v2-HN2P4RDZ-BrfoRuOc.js +1 -0
- package/web/assets/swimlanes-QLVP42QD-CQSVO5D6.js +1 -0
- package/web/assets/swimlanesDiagram-JKPDBFCN-DrWB9kcD.js +8 -0
- package/web/assets/{timeline-definition-WJXWRH4I-DUfp1R3E.js → timeline-definition-GS45XAXW-C0Ks8rPP.js} +4 -4
- package/web/assets/treeView-Q6P3EWNA-ZRJGANNQ-DmKOCo6L.js +1 -0
- package/web/assets/treemap-WGGIJYW6-K64VN5AS-DO3xY92U.js +1 -0
- package/web/assets/{vennDiagram-K3VCMQLI-Bj-FN-XS.js → vennDiagram-QIQU2ZRJ-rgPiS837.js} +3 -3
- package/web/assets/wardley-WFR3VGLG-D67OWCCH-DiDPBNft.js +1 -0
- package/web/assets/wardleyDiagram-U6YNM66N-DRVr7SPi.js +78 -0
- package/web/assets/{xychartDiagram-5VRUVLCW-CK_rbSWE.js → xychartDiagram-XJAZEDNM-COtlZzYb.js} +3 -3
- package/web/index.html +19 -17
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +0 -24
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +0 -1
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +0 -36
- package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +0 -132
- package/web/assets/c4Diagram-X2LASM7V-CnhoT4aV.js +0 -10
- package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +0 -127
- package/web/assets/chunk-5VCL7Z4A-CQ-2dYWj.js +0 -1
- package/web/assets/chunk-6BELYETK-ChsYtfHW.js +0 -1
- package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +0 -2
- package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +0 -32
- package/web/assets/chunk-KRXBNO2N-C-UNuKKf.js +0 -1
- package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +0 -321
- package/web/assets/chunk-LIEV3EAG-pyKGssV3.js +0 -1
- package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +0 -62
- package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +0 -10
- package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +0 -156
- package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +0 -70
- package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +0 -231
- package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +0 -2
- package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +0 -1
- package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +0 -1
- package/web/assets/chunk-WJBAP47W-BckNkuEN.js +0 -1
- package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +0 -1
- package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +0 -1
- package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +0 -1
- package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +0 -4
- package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +0 -30
- package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +0 -3
- package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +0 -24
- package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +0 -85
- package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +0 -1
- package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +0 -1
- package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +0 -292
- package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +0 -1
- package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +0 -106
- package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +0 -1
- package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +0 -2
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +0 -257
- package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +0 -1
- package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +0 -1
- package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +0 -39
- package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +0 -1
- package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +0 -1
- package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +0 -1
- package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +0 -1
- package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +0 -1
- package/web/assets/src-C5sx_gMp.js +0 -1
- package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +0 -1
- package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +0 -1
- package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +0 -2
- package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +0 -8
- package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +0 -1
- package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +0 -1
- package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +0 -1
- package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +0 -78
- /package/web/assets/{sizeCapture-5GORAGP4-BEqQzsxs.js → sizeCapture-FGA5AGYP-BEqQzsxs.js} +0 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zig payload captures (F6): `for (items) |it|`, `if (opt) |v|`,
|
|
3
|
+
* `while (it.next()) |x|`. The captured name has no annotation anywhere — its
|
|
4
|
+
* type is the SUBJECT's type minus one layer (slice/array element, optional
|
|
5
|
+
* payload) — so the tree-sitter query cannot bind it; this post-finalize hook
|
|
6
|
+
* reads the subject's binding from the finished scope model and injects the
|
|
7
|
+
* payload's. Rust/Go do the same (`rust/range-binding.ts`,
|
|
8
|
+
* `go/range-binding.ts`).
|
|
9
|
+
*
|
|
10
|
+
* Deliberately narrow and honest: a payload binds only when the subject's
|
|
11
|
+
* WRITTEN type visibly has the layer the construct removes — `[]T` / `[N]T` /
|
|
12
|
+
* `[*]T` / `*[N]T` for `for`, `?T` (after any `E!`) for `if` / `while`. A
|
|
13
|
+
* subject typed `std.ArrayList(T)`, `anytype`, or anything unresolved binds
|
|
14
|
+
* nothing rather than guessing. `catch |err|` (an error, never a container
|
|
15
|
+
* receiver) and `switch` prongs are skipped. The same one-layer projection
|
|
16
|
+
* types `const t = items[i];` / `opt.?` / `ptr.*` (`bindProjectedLocal`).
|
|
17
|
+
*
|
|
18
|
+
* Runs after `propagateImportedReturnTypes`, so return bindings hoisted from
|
|
19
|
+
* other files are visible when a subject is a call.
|
|
20
|
+
*/
|
|
21
|
+
import type { ParsedFile } from '../../../../_shared/index.js';
|
|
22
|
+
import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
|
|
23
|
+
export declare function populateZigRangeBindings(parsedFiles: readonly ParsedFile[], indexes: ScopeResolutionIndexes, ctx: {
|
|
24
|
+
readonly fileContents: ReadonlyMap<string, string>;
|
|
25
|
+
readonly treeCache?: {
|
|
26
|
+
get(filePath: string): unknown;
|
|
27
|
+
};
|
|
28
|
+
}): void;
|
|
29
|
+
/** `*T` / `*const T` / `E!*T` → `T`; undefined when not visibly a pointer. */
|
|
30
|
+
export declare function zigPointeeSpelling(spelling: string): string | undefined;
|
|
31
|
+
/** `[]T` / `[]const T` / `[N]T` / `[*]T` / `[*:0]T` / `*[N]T` / `*const []T`
|
|
32
|
+
* → `T` (with `T`'s own sigils kept: `[]*Thing` → `*Thing`). Undefined when
|
|
33
|
+
* the written type has no slice/array layer to remove. */
|
|
34
|
+
export declare function zigElementSpelling(spelling: string): string | undefined;
|
|
35
|
+
/** `?T` / `?*T` / `E!?T` → `T` (sigils of `T` kept). Undefined when the
|
|
36
|
+
* written type is not visibly optional. */
|
|
37
|
+
export declare function zigOptionalPayloadSpelling(spelling: string): string | undefined;
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zig payload captures (F6): `for (items) |it|`, `if (opt) |v|`,
|
|
3
|
+
* `while (it.next()) |x|`. The captured name has no annotation anywhere — its
|
|
4
|
+
* type is the SUBJECT's type minus one layer (slice/array element, optional
|
|
5
|
+
* payload) — so the tree-sitter query cannot bind it; this post-finalize hook
|
|
6
|
+
* reads the subject's binding from the finished scope model and injects the
|
|
7
|
+
* payload's. Rust/Go do the same (`rust/range-binding.ts`,
|
|
8
|
+
* `go/range-binding.ts`).
|
|
9
|
+
*
|
|
10
|
+
* Deliberately narrow and honest: a payload binds only when the subject's
|
|
11
|
+
* WRITTEN type visibly has the layer the construct removes — `[]T` / `[N]T` /
|
|
12
|
+
* `[*]T` / `*[N]T` for `for`, `?T` (after any `E!`) for `if` / `while`. A
|
|
13
|
+
* subject typed `std.ArrayList(T)`, `anytype`, or anything unresolved binds
|
|
14
|
+
* nothing rather than guessing. `catch |err|` (an error, never a container
|
|
15
|
+
* receiver) and `switch` prongs are skipped. The same one-layer projection
|
|
16
|
+
* types `const t = items[i];` / `opt.?` / `ptr.*` (`bindProjectedLocal`).
|
|
17
|
+
*
|
|
18
|
+
* Runs after `propagateImportedReturnTypes`, so return bindings hoisted from
|
|
19
|
+
* other files are visible when a subject is a call.
|
|
20
|
+
*/
|
|
21
|
+
import { getZigParser } from './query.js';
|
|
22
|
+
import { getTreeSitterBufferSize } from '../../constants.js';
|
|
23
|
+
import { parseSourceSafe, ParseTimeoutError } from '../../../tree-sitter/safe-parse.js';
|
|
24
|
+
import { logger } from '../../../logger.js';
|
|
25
|
+
import { findClassBindingInScope, findReceiverTypeBinding, isClassLike, } from '../../scope-resolution/scope/walkers.js';
|
|
26
|
+
import { isZigKeywordDeclaration, zigUnwrapValue } from './captures.js';
|
|
27
|
+
import { normalizeZigTypeName } from './interpret.js';
|
|
28
|
+
const PAYLOAD_HOSTS = new Set([
|
|
29
|
+
'for_statement',
|
|
30
|
+
'for_expression',
|
|
31
|
+
'if_statement',
|
|
32
|
+
'if_expression',
|
|
33
|
+
'while_statement',
|
|
34
|
+
'while_expression',
|
|
35
|
+
]);
|
|
36
|
+
export function populateZigRangeBindings(parsedFiles, indexes, ctx) {
|
|
37
|
+
const parser = getZigParser();
|
|
38
|
+
// Class def nodeId → its Class scope (whose typeBindings hold the members'
|
|
39
|
+
// field types and the methods' return types). Same derivation as
|
|
40
|
+
// `buildWorkspaceResolutionIndex`, which this hook does not receive.
|
|
41
|
+
const classScopeByDefId = new Map();
|
|
42
|
+
for (const parsed of parsedFiles) {
|
|
43
|
+
for (const scope of parsed.scopes) {
|
|
44
|
+
if (scope.kind !== 'Class')
|
|
45
|
+
continue;
|
|
46
|
+
const cd = scope.ownedDefs.find((d) => isClassLike(d.type));
|
|
47
|
+
if (cd !== undefined)
|
|
48
|
+
classScopeByDefId.set(cd.nodeId, scope);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
for (const parsed of parsedFiles) {
|
|
52
|
+
const sourceText = ctx.fileContents.get(parsed.filePath);
|
|
53
|
+
if (sourceText === undefined)
|
|
54
|
+
continue;
|
|
55
|
+
let tree = ctx.treeCache?.get(parsed.filePath);
|
|
56
|
+
if (tree === undefined) {
|
|
57
|
+
try {
|
|
58
|
+
tree = parseSourceSafe(parser, sourceText, undefined, {
|
|
59
|
+
bufferSize: getTreeSitterBufferSize(sourceText),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
if (err instanceof ParseTimeoutError) {
|
|
64
|
+
logger.warn({ file: parsed.filePath }, 'zig range-binding: parse timed out, skipping file');
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const scopes = parsed.scopes;
|
|
71
|
+
if (scopes.length === 0)
|
|
72
|
+
continue;
|
|
73
|
+
const resolver = new ZigSubjectTypeResolver(scopes, indexes, classScopeByDefId);
|
|
74
|
+
// Pre-order: an outer payload is bound before an inner construct reads it
|
|
75
|
+
// (`for (pages) |p| { if (p.frame) |f| … }`).
|
|
76
|
+
const visit = (node) => {
|
|
77
|
+
if (PAYLOAD_HOSTS.has(node.type))
|
|
78
|
+
bindPayloads(node, resolver);
|
|
79
|
+
else if (node.type === 'variable_declaration')
|
|
80
|
+
bindProjectedLocal(node, resolver);
|
|
81
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
82
|
+
const c = node.namedChild(i);
|
|
83
|
+
if (c !== null)
|
|
84
|
+
visit(c);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
visit(tree.rootNode);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Bind the payload identifiers of one `for` / `if` / `while` node. */
|
|
91
|
+
function bindPayloads(node, resolver) {
|
|
92
|
+
const named = node.namedChildren.filter((c) => c !== null && c.type !== 'comment');
|
|
93
|
+
// The payload right after the subject(s); a trailing `else |err|` payload
|
|
94
|
+
// belongs to the else_clause and is not a child here.
|
|
95
|
+
const payload = named.find((c) => c.type === 'payload');
|
|
96
|
+
if (payload === undefined)
|
|
97
|
+
return;
|
|
98
|
+
const isFor = node.type === 'for_statement' || node.type === 'for_expression';
|
|
99
|
+
// A `for` lists its subjects BEFORE the payload; the body follows it.
|
|
100
|
+
const subjects = isFor
|
|
101
|
+
? named.slice(0, named.indexOf(payload)).filter((c) => c.type !== 'block_label')
|
|
102
|
+
: [node.childForFieldName('condition')].filter((c) => c !== null);
|
|
103
|
+
if (subjects.length === 0)
|
|
104
|
+
return;
|
|
105
|
+
// For a `for` the payload names pair positionally with the subjects
|
|
106
|
+
// (`for (items, 0..) |it, i|`); `if` / `while` capture one value.
|
|
107
|
+
const captured = payload.namedChildren.filter((c) => c !== null && c.type === 'identifier');
|
|
108
|
+
const host = payloadHostScope(node, resolver);
|
|
109
|
+
if (host === undefined)
|
|
110
|
+
return;
|
|
111
|
+
for (let i = 0; i < captured.length && i < subjects.length; i++) {
|
|
112
|
+
const name = captured[i].text;
|
|
113
|
+
if (name === '_')
|
|
114
|
+
continue;
|
|
115
|
+
const subject = subjects[i];
|
|
116
|
+
if (subject.type === 'range_expression')
|
|
117
|
+
continue; // `0..` — an index
|
|
118
|
+
const spelling = resolver.spellingOf(subject);
|
|
119
|
+
if (spelling === undefined)
|
|
120
|
+
continue;
|
|
121
|
+
const projected = isFor ? zigElementSpelling(spelling) : zigOptionalPayloadSpelling(spelling);
|
|
122
|
+
if (projected === undefined)
|
|
123
|
+
continue;
|
|
124
|
+
// `|*p|` captures a POINTER to the element/payload (the `*` is an
|
|
125
|
+
// anonymous payload child right before the identifier). Keep the written
|
|
126
|
+
// `*` so a later deref projection (`const q = p.*;`) still sees the
|
|
127
|
+
// layer; `rawName` strips it again, so method dispatch is unchanged.
|
|
128
|
+
const element = captured[i].previousSibling?.type === '*' ? `*${projected}` : projected;
|
|
129
|
+
const rawName = normalizeZigTypeName(element);
|
|
130
|
+
if (rawName.length === 0 || rawName.startsWith('@'))
|
|
131
|
+
continue;
|
|
132
|
+
const existing = host.typeBindings.get(name);
|
|
133
|
+
// Zig forbids shadowing, so an existing binding of this name in the host
|
|
134
|
+
// can only be a sibling construct's payload (bare-expression bodies share
|
|
135
|
+
// the enclosing scope). Two different types for one name: decline both
|
|
136
|
+
// rather than let the last one type the first one's body.
|
|
137
|
+
if (existing !== undefined) {
|
|
138
|
+
if (existing.rawName !== rawName) {
|
|
139
|
+
host.typeBindings.delete(name);
|
|
140
|
+
}
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const ref = element === rawName
|
|
144
|
+
? { rawName, declaredAtScope: host.id, source: 'annotation' }
|
|
145
|
+
: { rawName, declaredSpelling: element, declaredAtScope: host.id, source: 'annotation' };
|
|
146
|
+
host.typeBindings.set(name, ref);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** `const t = items[i];` / `const t = opt.?;` / `const t = ptr.*;` — a local
|
|
150
|
+
* bound to ONE LAYER under a typed subject: the element of a slice/array
|
|
151
|
+
* (not a `[a..b]` re-slice), the payload of an optional, the pointee of a
|
|
152
|
+
* pointer. Same honesty rule as the payloads: the subject's WRITTEN type
|
|
153
|
+
* must show the layer. Skipped when the name is already typed (an
|
|
154
|
+
* annotation, or a capture-time inference). */
|
|
155
|
+
function bindProjectedLocal(decl, resolver) {
|
|
156
|
+
if (!isZigKeywordDeclaration(decl))
|
|
157
|
+
return;
|
|
158
|
+
const named = decl.namedChildren.filter((c) => c !== null && c.type !== 'comment');
|
|
159
|
+
if (named.length < 2 || named[0].type !== 'identifier')
|
|
160
|
+
return;
|
|
161
|
+
const value = named[named.length - 1];
|
|
162
|
+
if (value.id === decl.childForFieldName('type')?.id)
|
|
163
|
+
return; // `const x: T;`
|
|
164
|
+
const inner = zigUnwrapValue(value);
|
|
165
|
+
let subject;
|
|
166
|
+
let project;
|
|
167
|
+
switch (inner.type) {
|
|
168
|
+
case 'index_expression':
|
|
169
|
+
if (inner.childForFieldName('index')?.type === 'range_expression')
|
|
170
|
+
return; // `a[0..n]`
|
|
171
|
+
subject = inner.childForFieldName('object');
|
|
172
|
+
project = zigElementSpelling;
|
|
173
|
+
break;
|
|
174
|
+
case 'null_coercion_expression':
|
|
175
|
+
subject = inner.namedChild(0);
|
|
176
|
+
project = zigOptionalPayloadSpelling;
|
|
177
|
+
break;
|
|
178
|
+
case 'dereference_expression':
|
|
179
|
+
subject = inner.namedChild(0);
|
|
180
|
+
project = zigPointeeSpelling;
|
|
181
|
+
break;
|
|
182
|
+
default:
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (subject === null)
|
|
186
|
+
return;
|
|
187
|
+
const name = named[0].text;
|
|
188
|
+
const host = resolver.scopeAt(decl.startPosition.row + 1, decl.startPosition.column, false);
|
|
189
|
+
if (host === undefined || host.typeBindings.has(name))
|
|
190
|
+
return;
|
|
191
|
+
const spelling = resolver.spellingOf(subject);
|
|
192
|
+
if (spelling === undefined)
|
|
193
|
+
return;
|
|
194
|
+
const projected = project(spelling);
|
|
195
|
+
if (projected === undefined)
|
|
196
|
+
return;
|
|
197
|
+
const rawName = normalizeZigTypeName(projected);
|
|
198
|
+
if (rawName.length === 0 || rawName.startsWith('@'))
|
|
199
|
+
return;
|
|
200
|
+
const ref = projected === rawName
|
|
201
|
+
? { rawName, declaredAtScope: host.id, source: 'assignment-inferred' }
|
|
202
|
+
: {
|
|
203
|
+
rawName,
|
|
204
|
+
declaredSpelling: projected,
|
|
205
|
+
declaredAtScope: host.id,
|
|
206
|
+
source: 'assignment-inferred',
|
|
207
|
+
};
|
|
208
|
+
host.typeBindings.set(name, ref);
|
|
209
|
+
}
|
|
210
|
+
/** `*T` / `*const T` / `E!*T` → `T`; undefined when not visibly a pointer. */
|
|
211
|
+
export function zigPointeeSpelling(spelling) {
|
|
212
|
+
let t = spelling.trim();
|
|
213
|
+
const bang = t.lastIndexOf('!');
|
|
214
|
+
if (bang !== -1)
|
|
215
|
+
t = t.slice(bang + 1).trim();
|
|
216
|
+
const m = /^\*(const\s+)?/.exec(t);
|
|
217
|
+
if (m === null)
|
|
218
|
+
return undefined;
|
|
219
|
+
const rest = t.slice(m[0].length).trim();
|
|
220
|
+
return rest.length > 0 ? rest : undefined;
|
|
221
|
+
}
|
|
222
|
+
function body(node) {
|
|
223
|
+
return node.childForFieldName('body');
|
|
224
|
+
}
|
|
225
|
+
/** The scope the payload name lives in: the body block's own scope when the
|
|
226
|
+
* body is a block (`|t| { … }`), otherwise the innermost scope enclosing the
|
|
227
|
+
* construct (a bare-expression body: `for (items) |t| t.run();`). */
|
|
228
|
+
function payloadHostScope(node, resolver) {
|
|
229
|
+
// for/if/while_statement carry `body:`; in the *_expression forms the
|
|
230
|
+
// body is the named child right after the payload.
|
|
231
|
+
let bodyNode = body(node);
|
|
232
|
+
if (bodyNode === null) {
|
|
233
|
+
const named = node.namedChildren.filter((c) => c !== null);
|
|
234
|
+
const at = named.findIndex((c) => c.type === 'payload');
|
|
235
|
+
bodyNode = at === -1 ? null : (named[at + 1] ?? null);
|
|
236
|
+
}
|
|
237
|
+
let block = bodyNode;
|
|
238
|
+
if (block?.type === 'block_expression')
|
|
239
|
+
block = block.namedChildren.find((c) => c?.type === 'block') ?? null;
|
|
240
|
+
if (block?.type === 'labeled_statement')
|
|
241
|
+
block = block.namedChildren.find((c) => c?.type === 'block') ?? null;
|
|
242
|
+
if (block?.type === 'block') {
|
|
243
|
+
const exact = resolver.scopeAt(block.startPosition.row + 1, block.startPosition.column, true);
|
|
244
|
+
if (exact !== undefined)
|
|
245
|
+
return exact;
|
|
246
|
+
}
|
|
247
|
+
return resolver.scopeAt(node.startPosition.row + 1, node.startPosition.column, false);
|
|
248
|
+
}
|
|
249
|
+
/** `[]T` / `[]const T` / `[N]T` / `[*]T` / `[*:0]T` / `*[N]T` / `*const []T`
|
|
250
|
+
* → `T` (with `T`'s own sigils kept: `[]*Thing` → `*Thing`). Undefined when
|
|
251
|
+
* the written type has no slice/array layer to remove. */
|
|
252
|
+
export function zigElementSpelling(spelling) {
|
|
253
|
+
let t = spelling.trim();
|
|
254
|
+
const bang = t.lastIndexOf('!');
|
|
255
|
+
if (bang !== -1)
|
|
256
|
+
t = t.slice(bang + 1).trim();
|
|
257
|
+
// A pointer TO an array/slice iterates the pointee.
|
|
258
|
+
t = t.replace(/^\*(const\s+)?(?=\[)/, '');
|
|
259
|
+
const m = /^\[[^\]]*\]\s*(const\s+)?/.exec(t);
|
|
260
|
+
if (m === null)
|
|
261
|
+
return undefined;
|
|
262
|
+
const rest = t.slice(m[0].length).trim();
|
|
263
|
+
return rest.length > 0 ? rest : undefined;
|
|
264
|
+
}
|
|
265
|
+
/** `?T` / `?*T` / `E!?T` → `T` (sigils of `T` kept). Undefined when the
|
|
266
|
+
* written type is not visibly optional. */
|
|
267
|
+
export function zigOptionalPayloadSpelling(spelling) {
|
|
268
|
+
let t = spelling.trim();
|
|
269
|
+
const bang = t.lastIndexOf('!');
|
|
270
|
+
if (bang !== -1)
|
|
271
|
+
t = t.slice(bang + 1).trim();
|
|
272
|
+
if (!t.startsWith('?'))
|
|
273
|
+
return undefined;
|
|
274
|
+
const rest = t.slice(1).trim();
|
|
275
|
+
return rest.length > 0 ? rest : undefined;
|
|
276
|
+
}
|
|
277
|
+
/** Resolves a subject expression to the WRITTEN type spelling of its binding
|
|
278
|
+
* (`declaredSpelling` when the capture layer reduced it, else `rawName`),
|
|
279
|
+
* through the finished scope model of one file. */
|
|
280
|
+
class ZigSubjectTypeResolver {
|
|
281
|
+
scopes;
|
|
282
|
+
indexes;
|
|
283
|
+
classScopeByDefId;
|
|
284
|
+
constructor(scopes, indexes, classScopeByDefId) {
|
|
285
|
+
this.scopes = scopes;
|
|
286
|
+
this.indexes = indexes;
|
|
287
|
+
this.classScopeByDefId = classScopeByDefId;
|
|
288
|
+
}
|
|
289
|
+
/** Innermost scope containing (line, col); with `exact`, only a scope
|
|
290
|
+
* STARTING there (a block's own scope). */
|
|
291
|
+
scopeAt(line, col, exact) {
|
|
292
|
+
let best;
|
|
293
|
+
for (const s of this.scopes) {
|
|
294
|
+
const r = s.range;
|
|
295
|
+
if (exact) {
|
|
296
|
+
if (r.startLine === line && r.startCol === col && s.kind === 'Block')
|
|
297
|
+
return s;
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
const startsBefore = r.startLine < line || (r.startLine === line && r.startCol <= col);
|
|
301
|
+
const endsAfter = r.endLine > line || (r.endLine === line && r.endCol >= col);
|
|
302
|
+
if (!startsBefore || !endsAfter)
|
|
303
|
+
continue;
|
|
304
|
+
if (best === undefined || contains(best.range, r))
|
|
305
|
+
best = s;
|
|
306
|
+
}
|
|
307
|
+
return best;
|
|
308
|
+
}
|
|
309
|
+
spellingOf(subject) {
|
|
310
|
+
const ref = this.typeRefOf(subject);
|
|
311
|
+
return ref === undefined ? undefined : (ref.declaredSpelling ?? ref.rawName);
|
|
312
|
+
}
|
|
313
|
+
typeRefOf(subjectRaw) {
|
|
314
|
+
const subject = zigUnwrapValue(subjectRaw);
|
|
315
|
+
const scope = this.scopeAt(subject.startPosition.row + 1, subject.startPosition.column, false);
|
|
316
|
+
if (scope === undefined)
|
|
317
|
+
return undefined;
|
|
318
|
+
switch (subject.type) {
|
|
319
|
+
case 'identifier':
|
|
320
|
+
return findReceiverTypeBinding(scope.id, subject.text, this.indexes);
|
|
321
|
+
case 'field_expression': {
|
|
322
|
+
// `self.items` / `page.session` — the member's binding on the
|
|
323
|
+
// object's class scope (field type, or a method's return type).
|
|
324
|
+
const object = subject.childForFieldName('object');
|
|
325
|
+
const member = subject.childForFieldName('member');
|
|
326
|
+
if (object === null || member === null)
|
|
327
|
+
return undefined;
|
|
328
|
+
return this.memberRefOf(object, member.text, scope.id);
|
|
329
|
+
}
|
|
330
|
+
case 'call_expression': {
|
|
331
|
+
const callee = subject.childForFieldName('function');
|
|
332
|
+
if (callee === null)
|
|
333
|
+
return undefined;
|
|
334
|
+
if (callee.type === 'identifier') {
|
|
335
|
+
// A free call: the fn's return binding, in the scope chain.
|
|
336
|
+
return findReceiverTypeBinding(scope.id, callee.text, this.indexes);
|
|
337
|
+
}
|
|
338
|
+
if (callee.type !== 'field_expression')
|
|
339
|
+
return undefined;
|
|
340
|
+
const object = callee.childForFieldName('object');
|
|
341
|
+
const member = callee.childForFieldName('member');
|
|
342
|
+
if (object === null || member === null)
|
|
343
|
+
return undefined;
|
|
344
|
+
return this.memberRefOf(object, member.text, scope.id);
|
|
345
|
+
}
|
|
346
|
+
default:
|
|
347
|
+
return undefined;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/** The binding of `member` on the class the `object` expression is typed
|
|
351
|
+
* by — recursively through field chains (`self.a.b`). */
|
|
352
|
+
memberRefOf(object, member, scopeId) {
|
|
353
|
+
const objectRef = this.typeRefOf(object);
|
|
354
|
+
if (objectRef === undefined)
|
|
355
|
+
return undefined;
|
|
356
|
+
// A compound rawName (`node.asElement()`, F6's member-call shape) needs
|
|
357
|
+
// the shared compound resolver; not walked here.
|
|
358
|
+
if (objectRef.rawName.includes('('))
|
|
359
|
+
return undefined;
|
|
360
|
+
const classDef = findClassBindingInScope(scopeId, objectRef.rawName, this.indexes);
|
|
361
|
+
if (classDef === undefined)
|
|
362
|
+
return undefined;
|
|
363
|
+
const classScope = this.classScopeByDefId.get(classDef.nodeId);
|
|
364
|
+
return classScope?.typeBindings.get(member);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
function contains(outer, inner) {
|
|
368
|
+
const startsBefore = outer.startLine < inner.startLine ||
|
|
369
|
+
(outer.startLine === inner.startLine && outer.startCol <= inner.startCol);
|
|
370
|
+
const endsAfter = outer.endLine > inner.endLine ||
|
|
371
|
+
(outer.endLine === inner.endLine && outer.endCol >= inner.endCol);
|
|
372
|
+
return startsBefore && endsAfter;
|
|
373
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zig `ScopeResolver` registered in `SCOPE_RESOLVERS` and consumed by the
|
|
3
|
+
* generic `runScopeResolution` orchestrator.
|
|
4
|
+
*
|
|
5
|
+
* Thin wiring: Zig has no inheritance (default MRO linearization over an
|
|
6
|
+
* empty heritage set), no `super`, and is statically typed (field-fallback
|
|
7
|
+
* heuristic off per the contract guidance). Import resolution reuses the
|
|
8
|
+
* same `resolveZigImportInternal` the legacy import-resolver config wraps,
|
|
9
|
+
* with `build.zig.zon` `.path` deps threaded through `loadResolutionConfig`.
|
|
10
|
+
*/
|
|
11
|
+
import type { ScopeResolver } from '../../scope-resolution/contract/scope-resolver.js';
|
|
12
|
+
export declare const zigScopeResolver: ScopeResolver;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zig `ScopeResolver` registered in `SCOPE_RESOLVERS` and consumed by the
|
|
3
|
+
* generic `runScopeResolution` orchestrator.
|
|
4
|
+
*
|
|
5
|
+
* Thin wiring: Zig has no inheritance (default MRO linearization over an
|
|
6
|
+
* empty heritage set), no `super`, and is statically typed (field-fallback
|
|
7
|
+
* heuristic off per the contract guidance). Import resolution reuses the
|
|
8
|
+
* same `resolveZigImportInternal` the legacy import-resolver config wraps,
|
|
9
|
+
* with `build.zig.zon` `.path` deps threaded through `loadResolutionConfig`.
|
|
10
|
+
*/
|
|
11
|
+
import { SupportedLanguages } from '../../../../_shared/index.js';
|
|
12
|
+
import { buildMro, defaultLinearize } from '../../scope-resolution/passes/mro.js';
|
|
13
|
+
import { populateClassOwnedMembers } from '../../scope-resolution/scope/walkers.js';
|
|
14
|
+
import { loadZigBuildConfig } from '../../language-config.js';
|
|
15
|
+
import { resolveZigImportInternal } from '../../import-resolvers/zig.js';
|
|
16
|
+
import { zigProvider } from '../zig.js';
|
|
17
|
+
import { expandZigWildcardNames, zigArityCompatibility, zigMergeBindings } from './index.js';
|
|
18
|
+
import { populateZigRangeBindings } from './range-binding.js';
|
|
19
|
+
export const zigScopeResolver = {
|
|
20
|
+
language: SupportedLanguages.Zig,
|
|
21
|
+
languageProvider: zigProvider,
|
|
22
|
+
importEdgeReason: 'zig-scope: import',
|
|
23
|
+
// A struct literal `T{ .f = x }` is a CALLS edge to the Struct node (the
|
|
24
|
+
// Rust `T { .. }` / Go `T{}` shape). Zig has no Constructor nodes, so
|
|
25
|
+
// nothing but this marker tells that edge from an invocation on the edge
|
|
26
|
+
// itself — `main → SpawnRequest` looked like a call to a function
|
|
27
|
+
// (PR #1432 review). Emits `local-call (constructor)` and friends.
|
|
28
|
+
markConstructionSites: true,
|
|
29
|
+
// Hub modules are how Zig projects publish their types: `pub const Terminal
|
|
30
|
+
// = @import("Terminal.zig");` / `pub const PRNG = @import("prng.zig");` in a
|
|
31
|
+
// file that declares nothing itself. Consumers then write
|
|
32
|
+
// `terminal.Terminal.init()`, `stdx.PRNG.from_seed()`, `t: stdx.Thing`.
|
|
33
|
+
// Measured on real projects before → after this flag: CALLS into ghostty's
|
|
34
|
+
// `src/terminal/` from outside it 46 → 253; into tigerbeetle's `stdx` hub
|
|
35
|
+
// from outside it 837 → 1500 (136 `stdx.Type.fn(` sites, 289 annotations).
|
|
36
|
+
namespaceExportsIncludeImportedNames: true,
|
|
37
|
+
// A qualified receiver is a chain of `const` handles — hub modules
|
|
38
|
+
// republishing modules (`hub.sub.Thing{}`), types nested in types
|
|
39
|
+
// (`mod.Outer.Inner{}`), enum variants through the module
|
|
40
|
+
// (`opmod.Op.lookup.event_max()`) — walked hop by hop from the verified
|
|
41
|
+
// import; a one-hop split at the last dot resolved none of them.
|
|
42
|
+
resolveNamespaceChains: true,
|
|
43
|
+
loadResolutionConfig: (repoPath) => loadZigBuildConfig(repoPath),
|
|
44
|
+
resolveImportTarget: (targetRaw, fromFile, allFilePaths, resolutionConfig) => resolveZigImportInternal(fromFile, targetRaw, allFilePaths, resolutionConfig ?? null),
|
|
45
|
+
// `pub usingnamespace @import("x.zig");` — target decls become local decls.
|
|
46
|
+
expandsWildcardTo: (targetModuleScope, parsedFiles) => expandZigWildcardNames(targetModuleScope, parsedFiles),
|
|
47
|
+
mergeBindings: zigMergeBindings,
|
|
48
|
+
arityCompatibility: zigArityCompatibility,
|
|
49
|
+
buildMro: (graph, parsedFiles, nodeLookup) => buildMro(graph, parsedFiles, nodeLookup, defaultLinearize),
|
|
50
|
+
populateOwners: (parsed) => populateClassOwnedMembers(parsed),
|
|
51
|
+
// Payload captures — `for (items) |it|`, `if (opt) |v|`, `while (it.next())
|
|
52
|
+
// |x|` — typed from the subject's binding after finalize (F6).
|
|
53
|
+
populateRangeBindings: populateZigRangeBindings,
|
|
54
|
+
// Zig has no `super`.
|
|
55
|
+
isSuperReceiver: () => false,
|
|
56
|
+
// Statically typed — the field-fallback heuristic over-connects.
|
|
57
|
+
fieldFallbackOnMethodLookup: false,
|
|
58
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { BindingRef, Callsite, CaptureMatch, ParsedFile, Scope, ScopeId, ScopeTree, SymbolDefinition, TypeRef } from '../../../../_shared/index.js';
|
|
2
|
+
/** Keep parameter (incl. `self`) typeBindings in the function scope —
|
|
3
|
+
* hoisting them to Module would pollute other functions' receiver
|
|
4
|
+
* resolution (same rationale as `goBindingScopeFor`). */
|
|
5
|
+
export declare function zigBindingScopeFor(decl: CaptureMatch, innermost: Scope, tree: ScopeTree): ScopeId | null;
|
|
6
|
+
/** `pub usingnamespace @import("x.zig");` — every declaration of the target
|
|
7
|
+
* module becomes a declaration of the importer. Enumerates the target's
|
|
8
|
+
* module-level names for the finalize wildcard expansion (Dart pattern).
|
|
9
|
+
* Zig visibility (`pub`) is not recorded on scope-side defs, so this
|
|
10
|
+
* over-approximates to every top-level name; the structure phase's
|
|
11
|
+
* `isExported` is the authoritative visibility. */
|
|
12
|
+
export declare function expandZigWildcardNames(targetModuleScope: ScopeId, parsedFiles: readonly ParsedFile[]): readonly string[];
|
|
13
|
+
/** Zig's receiver convention is a FIRST parameter named `self`; the
|
|
14
|
+
* `self`-sourced typeBinding on the function scope carries its type.
|
|
15
|
+
* Position is enforced upstream, not here: `interpretZigTypeBinding` only
|
|
16
|
+
* sources a binding as `self` when `emitZigScopeCaptures` tagged it
|
|
17
|
+
* `@type-binding.first-parameter`, so a later parameter named `self`
|
|
18
|
+
* arrives as `parameter-annotation` and is never returned by this hook. */
|
|
19
|
+
export declare function zigReceiverBinding(functionScope: Scope): TypeRef | null;
|
|
20
|
+
/** Local declarations shadow imports; deterministic order within a tier. */
|
|
21
|
+
export declare function zigMergeBindings(existing: readonly BindingRef[], incoming: readonly BindingRef[], _scopeId: string): BindingRef[];
|
|
22
|
+
/** Zig has no overloading; without synthesized arity metadata on
|
|
23
|
+
* declarations the comparison is always 'unknown' — kept as a real
|
|
24
|
+
* bounds check so it turns on if arity captures are added later. */
|
|
25
|
+
export declare function zigArityCompatibility(callsite: Callsite, def: SymbolDefinition): 'compatible' | 'unknown' | 'incompatible';
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/** Keep parameter (incl. `self`) typeBindings in the function scope —
|
|
2
|
+
* hoisting them to Module would pollute other functions' receiver
|
|
3
|
+
* resolution (same rationale as `goBindingScopeFor`). */
|
|
4
|
+
export function zigBindingScopeFor(decl, innermost, tree) {
|
|
5
|
+
if (decl['@type-binding.parameter'] !== undefined) {
|
|
6
|
+
return innermost.id;
|
|
7
|
+
}
|
|
8
|
+
// A container returned by a generic type constructor (`fn List(comptime T:
|
|
9
|
+
// type) type { return struct {…}; }`) is anchored on the container node,
|
|
10
|
+
// whose innermost enclosing scope is the FUNCTION BODY. Its name is only
|
|
11
|
+
// useful to callers (`List(u8){}`, `List(u8).init()`), so bind it in the
|
|
12
|
+
// module scope beside the Function def of the same name — `List` really is
|
|
13
|
+
// both a callable and a type. `zigTypeConstructorOf` in the walker decides
|
|
14
|
+
// WHICH containers get this rule; the marker capture carries the verdict.
|
|
15
|
+
if (decl['@declaration.type-constructor'] !== undefined) {
|
|
16
|
+
let scope = innermost;
|
|
17
|
+
while (scope !== undefined && scope.kind !== 'Module')
|
|
18
|
+
scope = tree.getParent(scope.id);
|
|
19
|
+
return scope?.id ?? null;
|
|
20
|
+
}
|
|
21
|
+
// File-struct members: the file's Class scope spans the whole file (same
|
|
22
|
+
// range as the Module scope, nested under it). Their DEFS stay owned by the
|
|
23
|
+
// Class scope (that is what makes them methods/fields of the file's Struct),
|
|
24
|
+
// but their NAMES must stay visible at module level — `Page.init()` from
|
|
25
|
+
// another file is a namespace-member lookup over the module scope's
|
|
26
|
+
// bindings, and `usingnamespace` expansion reads the same. Hoist every
|
|
27
|
+
// declaration binding hosted by an equal-range Class scope to its Module
|
|
28
|
+
// parent. Type bindings (`@type-binding.*`, incl. field types) are NOT
|
|
29
|
+
// hoisted: the compound resolver reads member types from the class scope.
|
|
30
|
+
const anchor = ZIG_DECLARATION_ANCHORS.map((k) => decl[k]).find((c) => c !== undefined);
|
|
31
|
+
if (anchor !== undefined) {
|
|
32
|
+
// Reproduce the extractor's auto-hoist (a scope-creating declaration is
|
|
33
|
+
// bound in the scope OUTSIDE its own body), then step past the file's
|
|
34
|
+
// Class scope when that is where the name would land.
|
|
35
|
+
let host = innermost;
|
|
36
|
+
if (host.parent !== null && sameRange(anchor.range, host.range)) {
|
|
37
|
+
host = tree.getParent(host.id);
|
|
38
|
+
}
|
|
39
|
+
if (host !== undefined && host.kind === 'Class' && host.parent !== null) {
|
|
40
|
+
const parent = tree.getParent(host.id);
|
|
41
|
+
if (parent !== undefined && parent.kind === 'Module' && sameRange(parent.range, host.range)) {
|
|
42
|
+
return parent.id;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null; // default auto-hoist for other bindings
|
|
47
|
+
}
|
|
48
|
+
const ZIG_DECLARATION_ANCHORS = [
|
|
49
|
+
'@declaration.function',
|
|
50
|
+
'@declaration.method',
|
|
51
|
+
'@declaration.struct',
|
|
52
|
+
'@declaration.enum',
|
|
53
|
+
'@declaration.union',
|
|
54
|
+
'@declaration.field',
|
|
55
|
+
'@declaration.variable',
|
|
56
|
+
];
|
|
57
|
+
function sameRange(a, b) {
|
|
58
|
+
return (a.startLine === b.startLine &&
|
|
59
|
+
a.startCol === b.startCol &&
|
|
60
|
+
a.endLine === b.endLine &&
|
|
61
|
+
a.endCol === b.endCol);
|
|
62
|
+
}
|
|
63
|
+
/** `pub usingnamespace @import("x.zig");` — every declaration of the target
|
|
64
|
+
* module becomes a declaration of the importer. Enumerates the target's
|
|
65
|
+
* module-level names for the finalize wildcard expansion (Dart pattern).
|
|
66
|
+
* Zig visibility (`pub`) is not recorded on scope-side defs, so this
|
|
67
|
+
* over-approximates to every top-level name; the structure phase's
|
|
68
|
+
* `isExported` is the authoritative visibility. */
|
|
69
|
+
export function expandZigWildcardNames(targetModuleScope, parsedFiles) {
|
|
70
|
+
const target = parsedFiles.find((p) => p.moduleScope === targetModuleScope);
|
|
71
|
+
if (target === undefined)
|
|
72
|
+
return [];
|
|
73
|
+
const seen = new Set();
|
|
74
|
+
const names = [];
|
|
75
|
+
for (const def of target.localDefs) {
|
|
76
|
+
const qn = def.qualifiedName;
|
|
77
|
+
if (qn === undefined || qn.length === 0 || qn.includes('.'))
|
|
78
|
+
continue; // top-level only
|
|
79
|
+
if (seen.has(qn))
|
|
80
|
+
continue;
|
|
81
|
+
seen.add(qn);
|
|
82
|
+
names.push(qn);
|
|
83
|
+
}
|
|
84
|
+
return names;
|
|
85
|
+
}
|
|
86
|
+
/** Zig's receiver convention is a FIRST parameter named `self`; the
|
|
87
|
+
* `self`-sourced typeBinding on the function scope carries its type.
|
|
88
|
+
* Position is enforced upstream, not here: `interpretZigTypeBinding` only
|
|
89
|
+
* sources a binding as `self` when `emitZigScopeCaptures` tagged it
|
|
90
|
+
* `@type-binding.first-parameter`, so a later parameter named `self`
|
|
91
|
+
* arrives as `parameter-annotation` and is never returned by this hook. */
|
|
92
|
+
export function zigReceiverBinding(functionScope) {
|
|
93
|
+
if (functionScope.kind !== 'Function')
|
|
94
|
+
return null;
|
|
95
|
+
for (const binding of functionScope.typeBindings.values()) {
|
|
96
|
+
if (binding.source === 'self')
|
|
97
|
+
return binding;
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
const TIER = {
|
|
102
|
+
local: 0,
|
|
103
|
+
namespace: 1,
|
|
104
|
+
import: 2,
|
|
105
|
+
reexport: 3,
|
|
106
|
+
wildcard: 4,
|
|
107
|
+
};
|
|
108
|
+
/** Local declarations shadow imports; deterministic order within a tier. */
|
|
109
|
+
export function zigMergeBindings(existing, incoming, _scopeId) {
|
|
110
|
+
const all = [...existing, ...incoming];
|
|
111
|
+
if (all.length === 0)
|
|
112
|
+
return [];
|
|
113
|
+
let bestTier = 99;
|
|
114
|
+
for (const b of all) {
|
|
115
|
+
const t = TIER[b.origin] ?? 99;
|
|
116
|
+
if (t < bestTier)
|
|
117
|
+
bestTier = t;
|
|
118
|
+
}
|
|
119
|
+
const byNode = new Map();
|
|
120
|
+
for (const b of all) {
|
|
121
|
+
if ((TIER[b.origin] ?? 99) !== bestTier)
|
|
122
|
+
continue;
|
|
123
|
+
if (!byNode.has(b.def.nodeId))
|
|
124
|
+
byNode.set(b.def.nodeId, b);
|
|
125
|
+
}
|
|
126
|
+
return [...byNode.values()].sort((a, b) => a.def.nodeId.localeCompare(b.def.nodeId));
|
|
127
|
+
}
|
|
128
|
+
/** Zig has no overloading; without synthesized arity metadata on
|
|
129
|
+
* declarations the comparison is always 'unknown' — kept as a real
|
|
130
|
+
* bounds check so it turns on if arity captures are added later. */
|
|
131
|
+
export function zigArityCompatibility(callsite, def) {
|
|
132
|
+
const max = def.parameterCount;
|
|
133
|
+
const min = def.requiredParameterCount;
|
|
134
|
+
if (max === undefined && min === undefined)
|
|
135
|
+
return 'unknown';
|
|
136
|
+
if (!Number.isFinite(callsite.arity) || callsite.arity < 0)
|
|
137
|
+
return 'unknown';
|
|
138
|
+
if (min !== undefined && callsite.arity < min)
|
|
139
|
+
return 'incompatible';
|
|
140
|
+
if (max !== undefined && callsite.arity > max)
|
|
141
|
+
return 'incompatible';
|
|
142
|
+
return 'compatible';
|
|
143
|
+
}
|