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,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zig Language Provider.
|
|
3
|
+
*
|
|
4
|
+
* Key Zig traits:
|
|
5
|
+
* - mroStrategy: default 'first-wins' is irrelevant — Zig has no inheritance,
|
|
6
|
+
* and no heritage hooks are provided (Zig queries never produce
|
|
7
|
+
* `@heritage.*` captures).
|
|
8
|
+
* - exportChecker: walks to the enclosing variable_declaration /
|
|
9
|
+
* function_declaration and looks for a `pub` or `export` keyword child.
|
|
10
|
+
* - importResolver: resolves local `@import("./foo.zig")` paths and
|
|
11
|
+
* build.zig.zon `.path` deps (root the dep's build.zig declares, then
|
|
12
|
+
* src/root.zig, src/<name>.zig, src/main.zig); `@import("std")` and
|
|
13
|
+
* `.url` packages are deliberately external.
|
|
14
|
+
* - namedBindingExtractor: omitted — the scope side handles
|
|
15
|
+
* `const Foo = @import("x").Foo` and `const Foo = ns.Foo` (ns an
|
|
16
|
+
* @import binding) as NAMED imports instead (`zig/captures.ts`).
|
|
17
|
+
* - scope-resolution hooks (Ring 3): `emitScopeCaptures` walks the file via
|
|
18
|
+
* `zig/query.ts` (containers as Class scopes — including the container a
|
|
19
|
+
* generic type constructor `fn List(comptime T: type) type` returns,
|
|
20
|
+
* named after the fn; container-nested fns relabeled @declaration.method;
|
|
21
|
+
* plain-variable groups filtered for container/import bindings and for
|
|
22
|
+
* the keyword-less `variable_declaration`s tree-sitter-zig uses for
|
|
23
|
+
* statement assignments); `interpretImport` maps `const x = @import("…")`
|
|
24
|
+
* to a namespace import, member forms to named/alias imports and
|
|
25
|
+
* `usingnamespace` to a wildcard; receiver types come from `self`
|
|
26
|
+
* parameters, `T{…}` / `mod.T{…}` / `List(u8){…}` literals, `T.init()`
|
|
27
|
+
* call returns, `x: T` annotations (incl. decl literals), container
|
|
28
|
+
* FIELD types on the container's class scope (`self.session.name()`)
|
|
29
|
+
* and one-level field aliases (`const s = self.session; s.name()`). The
|
|
30
|
+
* emit-side wiring lives in `zig/scope-resolver.ts` (SCOPE_RESOLVERS).
|
|
31
|
+
*/
|
|
32
|
+
export declare const zigProvider: import("../language-provider.js").LanguageProvider;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zig Language Provider.
|
|
3
|
+
*
|
|
4
|
+
* Key Zig traits:
|
|
5
|
+
* - mroStrategy: default 'first-wins' is irrelevant — Zig has no inheritance,
|
|
6
|
+
* and no heritage hooks are provided (Zig queries never produce
|
|
7
|
+
* `@heritage.*` captures).
|
|
8
|
+
* - exportChecker: walks to the enclosing variable_declaration /
|
|
9
|
+
* function_declaration and looks for a `pub` or `export` keyword child.
|
|
10
|
+
* - importResolver: resolves local `@import("./foo.zig")` paths and
|
|
11
|
+
* build.zig.zon `.path` deps (root the dep's build.zig declares, then
|
|
12
|
+
* src/root.zig, src/<name>.zig, src/main.zig); `@import("std")` and
|
|
13
|
+
* `.url` packages are deliberately external.
|
|
14
|
+
* - namedBindingExtractor: omitted — the scope side handles
|
|
15
|
+
* `const Foo = @import("x").Foo` and `const Foo = ns.Foo` (ns an
|
|
16
|
+
* @import binding) as NAMED imports instead (`zig/captures.ts`).
|
|
17
|
+
* - scope-resolution hooks (Ring 3): `emitScopeCaptures` walks the file via
|
|
18
|
+
* `zig/query.ts` (containers as Class scopes — including the container a
|
|
19
|
+
* generic type constructor `fn List(comptime T: type) type` returns,
|
|
20
|
+
* named after the fn; container-nested fns relabeled @declaration.method;
|
|
21
|
+
* plain-variable groups filtered for container/import bindings and for
|
|
22
|
+
* the keyword-less `variable_declaration`s tree-sitter-zig uses for
|
|
23
|
+
* statement assignments); `interpretImport` maps `const x = @import("…")`
|
|
24
|
+
* to a namespace import, member forms to named/alias imports and
|
|
25
|
+
* `usingnamespace` to a wildcard; receiver types come from `self`
|
|
26
|
+
* parameters, `T{…}` / `mod.T{…}` / `List(u8){…}` literals, `T.init()`
|
|
27
|
+
* call returns, `x: T` annotations (incl. decl literals), container
|
|
28
|
+
* FIELD types on the container's class scope (`self.session.name()`)
|
|
29
|
+
* and one-level field aliases (`const s = self.session; s.name()`). The
|
|
30
|
+
* emit-side wiring lives in `zig/scope-resolver.ts` (SCOPE_RESOLVERS).
|
|
31
|
+
*/
|
|
32
|
+
import { SupportedLanguages } from '../../../_shared/index.js';
|
|
33
|
+
import { defineLanguage } from '../language-provider.js';
|
|
34
|
+
import { ZIG_QUERIES } from '../tree-sitter-queries.js';
|
|
35
|
+
import { zigExportChecker } from '../export-detection.js';
|
|
36
|
+
import { createImportResolver } from '../import-resolvers/resolver-factory.js';
|
|
37
|
+
import { zigImportConfig } from '../import-resolvers/configs/zig.js';
|
|
38
|
+
import { createCallExtractor } from '../call-extractors/generic.js';
|
|
39
|
+
import { zigCallConfig } from '../call-extractors/configs/zig.js';
|
|
40
|
+
import { createClassExtractor } from '../class-extractors/generic.js';
|
|
41
|
+
import { zigClassConfig } from '../class-extractors/configs/zig.js';
|
|
42
|
+
import { createFieldExtractor } from '../field-extractors/generic.js';
|
|
43
|
+
import { zigFieldConfig } from '../field-extractors/configs/zig.js';
|
|
44
|
+
import { createMethodExtractor } from '../method-extractors/generic.js';
|
|
45
|
+
import { zigMethodConfig } from '../method-extractors/configs/zig.js';
|
|
46
|
+
import { createVariableExtractor } from '../variable-extractors/generic.js';
|
|
47
|
+
import { zigVariableConfig } from '../variable-extractors/configs/zig.js';
|
|
48
|
+
import { zigTypeConfig } from '../type-extractors/zig.js';
|
|
49
|
+
import { emitZigScopeCaptures, interpretZigImport, interpretZigTypeBinding, isZigContainerMethod, isZigFileStruct, isZigRedundantContainerCapture, isZigTypeShadowingBinding, zigArityCompatibility, zigContainerLabel, zigContainerName, zigFileStructName, zigBindingScopeFor, zigReceiverBinding, ZIG_CONTAINER_TYPES, } from './zig/index.js';
|
|
50
|
+
export const zigProvider = defineLanguage({
|
|
51
|
+
id: SupportedLanguages.Zig,
|
|
52
|
+
extensions: ['.zig'],
|
|
53
|
+
entryPointPatterns: [
|
|
54
|
+
/^main$/, // standard executable entry point
|
|
55
|
+
/^build$/, // build.zig entry point
|
|
56
|
+
],
|
|
57
|
+
astFrameworkPatterns: [],
|
|
58
|
+
treeSitterQueries: ZIG_QUERIES,
|
|
59
|
+
typeConfig: zigTypeConfig,
|
|
60
|
+
exportChecker: zigExportChecker,
|
|
61
|
+
importResolver: createImportResolver(zigImportConfig),
|
|
62
|
+
callExtractor: createCallExtractor(zigCallConfig),
|
|
63
|
+
classExtractor: createClassExtractor(zigClassConfig),
|
|
64
|
+
fieldExtractor: createFieldExtractor(zigFieldConfig),
|
|
65
|
+
methodExtractor: createMethodExtractor(zigMethodConfig),
|
|
66
|
+
variableExtractor: createVariableExtractor(zigVariableConfig),
|
|
67
|
+
// A `const`/`var` whose value is a container or an `@import` is the
|
|
68
|
+
// Struct/Enum/Union node or the import binding, not a Const beside it.
|
|
69
|
+
// Up to three ZIG_QUERIES rules match one container (wrapper, type
|
|
70
|
+
// constructor, bare container — F8); `zigContainerAnchor` names the one
|
|
71
|
+
// that mints it and the others are dropped here.
|
|
72
|
+
shouldSkipDefinitionCapture: (captureMap, defaultLabel) => {
|
|
73
|
+
if (defaultLabel === 'Const' || defaultLabel === 'Variable') {
|
|
74
|
+
const decl = captureMap['definition.const'] ?? captureMap['definition.variable'];
|
|
75
|
+
return decl !== undefined && isZigTypeShadowingBinding(decl);
|
|
76
|
+
}
|
|
77
|
+
if (defaultLabel === 'Struct' || defaultLabel === 'Enum' || defaultLabel === 'Union') {
|
|
78
|
+
const decl = captureMap['definition.struct'] ??
|
|
79
|
+
captureMap['definition.enum'] ??
|
|
80
|
+
captureMap['definition.union'];
|
|
81
|
+
if (decl === undefined)
|
|
82
|
+
return false;
|
|
83
|
+
// The file-struct rules over-match (a `@This` first parameter, a
|
|
84
|
+
// top-level `@This()` alias — see ZIG_QUERIES); the one predicate decides.
|
|
85
|
+
if (decl.type === 'source_file')
|
|
86
|
+
return !isZigFileStruct(decl);
|
|
87
|
+
return isZigRedundantContainerCapture(decl, captureMap['name']);
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
},
|
|
91
|
+
// A file whose top level declares fields IS a struct named after the file
|
|
92
|
+
// (`Page.zig` → `Page`): its top-level fns/fields are members of that
|
|
93
|
+
// Struct. Files without fields are namespaces and own nothing.
|
|
94
|
+
resolveFileTypeOwner: (root, filePath) => isZigFileStruct(root) ? { name: zigFileStructName(filePath), label: 'Struct' } : null,
|
|
95
|
+
// Every container's identity comes from `zigContainerName` — the binding
|
|
96
|
+
// name for `const T = struct {…}` at file/container level, the fn name for
|
|
97
|
+
// a generic type constructor, and (F8) `string$R` / `build$1` for
|
|
98
|
+
// function-local and anonymous containers, which no name child spells. The
|
|
99
|
+
// class extractor names the node from the same function, so a member's
|
|
100
|
+
// owner id (`Method:<file>:string$R.get`) and the node id agree.
|
|
101
|
+
resolveContainerTypeOwner: (container, filePath) => {
|
|
102
|
+
if (!ZIG_CONTAINER_TYPES.has(container.type))
|
|
103
|
+
return null;
|
|
104
|
+
const name = zigContainerName(container, filePath);
|
|
105
|
+
const label = zigContainerLabel(container);
|
|
106
|
+
return name !== undefined && label !== undefined ? { name, label } : null;
|
|
107
|
+
},
|
|
108
|
+
labelOverride: (functionNode, defaultLabel) => {
|
|
109
|
+
if (defaultLabel !== 'Function')
|
|
110
|
+
return defaultLabel;
|
|
111
|
+
if (isZigContainerMethod(functionNode))
|
|
112
|
+
return 'Method';
|
|
113
|
+
return defaultLabel;
|
|
114
|
+
},
|
|
115
|
+
// ── RFC #909 Ring 3: scope-based resolution hooks ──
|
|
116
|
+
emitScopeCaptures: emitZigScopeCaptures,
|
|
117
|
+
interpretImport: interpretZigImport,
|
|
118
|
+
// `@import` is compile-time name lookup, not an executed statement: one
|
|
119
|
+
// written inside a function body is resolved exactly as one at file scope
|
|
120
|
+
// (same answer as C `#include` and Rust `use`). Without this, a
|
|
121
|
+
// function-scoped `@import` would be marked `runsOnlyWhenCalled` and a
|
|
122
|
+
// real import cycle through it would be hidden from `check --cycles`.
|
|
123
|
+
importsExecuteWhereWritten: false,
|
|
124
|
+
interpretTypeBinding: interpretZigTypeBinding,
|
|
125
|
+
bindingScopeFor: zigBindingScopeFor,
|
|
126
|
+
receiverBinding: zigReceiverBinding,
|
|
127
|
+
// Provider contract is (def, callsite); the ScopeResolver contract is
|
|
128
|
+
// (callsite, def) — same function, adapted argument order.
|
|
129
|
+
arityCompatibility: (def, callsite) => zigArityCompatibility(callsite, def),
|
|
130
|
+
});
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { SupportedLanguages } from '../../../../_shared/index.js';
|
|
2
|
+
import { hasZigPubKeyword } from '../../export-detection.js';
|
|
3
|
+
import { ZIG_CONTAINER_TYPES, zigContainerName, zigReceiverParameter, } from '../../languages/zig/captures.js';
|
|
4
|
+
/**
|
|
5
|
+
* Zig method extraction.
|
|
6
|
+
*
|
|
7
|
+
* tree-sitter-zig containers (struct/enum/union/opaque) are anonymous; the
|
|
8
|
+
* binding name lives on the parent variable_declaration, or on the enclosing
|
|
9
|
+
* generic type constructor (`fn List(comptime T: type) type { return struct
|
|
10
|
+
* {…}; }`) — `zigContainerName` decides. Methods inside a container appear as
|
|
11
|
+
* plain `function_declaration` children of the container node.
|
|
12
|
+
*
|
|
13
|
+
* The first parameter is the receiver when it is named `self` OR typed as the
|
|
14
|
+
* enclosing container (`replica: *Replica`, `pool: *@This()`) — see
|
|
15
|
+
* `zigReceiverParameter`; unlike Rust, Zig has no dedicated `self_parameter`
|
|
16
|
+
* node type and `self` is a convention, not a rule.
|
|
17
|
+
*/
|
|
18
|
+
const extractZigOwnerName = (node, filePath) => zigContainerName(node, filePath);
|
|
19
|
+
const extractZigName = (node) => {
|
|
20
|
+
const nameNode = node.childForFieldName('name');
|
|
21
|
+
return nameNode?.text;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* The `parameters` node of a function_declaration. tree-sitter-zig 1.1.2
|
|
25
|
+
* attaches it as a plain named child — NOT under a `parameters:` field (only
|
|
26
|
+
* `name`, `type` and `body` are fields), so a field lookup is always null
|
|
27
|
+
* (and the grammar-literal gate flags it as a dead field). Reading it that
|
|
28
|
+
* way silently produced empty parameter lists, no receiver, and
|
|
29
|
+
* `isStatic: true` for every method.
|
|
30
|
+
*/
|
|
31
|
+
const zigParameterList = (node) => node.namedChildren.find((child) => child?.type === 'parameters') ?? null;
|
|
32
|
+
const extractZigReturnType = (node) => {
|
|
33
|
+
// tree-sitter-zig labels the return type as the `type` field on
|
|
34
|
+
// function_declaration (the same field name used for parameter types).
|
|
35
|
+
const typeNode = node.childForFieldName('type');
|
|
36
|
+
return typeNode?.text?.trim();
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Regular parameters only. The receiver parameter (`zigReceiverParameter`) is
|
|
40
|
+
* reported through `extractReceiverType`, not the parameter list (same split
|
|
41
|
+
* as Rust's `self_parameter` skip in `configs/rust.ts`). `filePath` is what
|
|
42
|
+
* names a file-struct (`fn add(ledger: *Ledger)` in `Ledger.zig`): without it
|
|
43
|
+
* the receiver rule cannot see the file stem and such a fn reads as static
|
|
44
|
+
* with the receiver in its arity — an id the scope side, which always has
|
|
45
|
+
* the path, never produces, so its CALLS edges went nowhere.
|
|
46
|
+
*/
|
|
47
|
+
const extractZigParameters = (node, filePath) => {
|
|
48
|
+
const paramList = zigParameterList(node);
|
|
49
|
+
if (!paramList)
|
|
50
|
+
return [];
|
|
51
|
+
const params = [];
|
|
52
|
+
const receiver = zigReceiverParameter(node, filePath);
|
|
53
|
+
for (let i = 0; i < paramList.namedChildCount; i++) {
|
|
54
|
+
const param = paramList.namedChild(i);
|
|
55
|
+
if (!param || param.type !== 'parameter')
|
|
56
|
+
continue;
|
|
57
|
+
if (receiver !== null && param.id === receiver.id)
|
|
58
|
+
continue;
|
|
59
|
+
const nameNode = param.childForFieldName('name');
|
|
60
|
+
const typeNode = param.childForFieldName('type');
|
|
61
|
+
params.push({
|
|
62
|
+
name: nameNode?.text ?? '?',
|
|
63
|
+
type: typeNode?.text?.trim() ?? null,
|
|
64
|
+
rawType: typeNode?.text?.trim() ?? null,
|
|
65
|
+
isOptional: false,
|
|
66
|
+
isVariadic: false,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return params;
|
|
70
|
+
};
|
|
71
|
+
const extractZigReceiverType = (node, filePath) => zigReceiverParameter(node, filePath)?.childForFieldName('type')?.text?.trim();
|
|
72
|
+
/**
|
|
73
|
+
* Names a `test_declaration` during the enclosing-function walk (parse-worker
|
|
74
|
+
* `findEnclosingFunctionId`) with the SAME spelling ZIG_QUERIES captures as
|
|
75
|
+
* `@name` — the string node with its quotes — so calls inside `test "x" {}`
|
|
76
|
+
* attribute to the test's own Function node.
|
|
77
|
+
*
|
|
78
|
+
* Anonymous `test {}` and decl-tests `test add {}` are not graph nodes. They
|
|
79
|
+
* return `''`, not `null`: `null` falls through to `genericFuncName`, whose
|
|
80
|
+
* first-identifier scan would name `test add {}` "add" — the REAL `fn add`'s
|
|
81
|
+
* id — and hang the test body's calls on it. The empty name is falsy, so
|
|
82
|
+
* `findEnclosingFunctionId` skips this node WITHOUT attributing to it and
|
|
83
|
+
* keeps walking up; a test block can only sit at container level, so the walk
|
|
84
|
+
* reaches the file and the calls attribute to the File.
|
|
85
|
+
*/
|
|
86
|
+
const extractZigFunctionName = (node) => {
|
|
87
|
+
if (node.type !== 'test_declaration')
|
|
88
|
+
return null;
|
|
89
|
+
const nameString = node.namedChildren.find((child) => child?.type === 'string');
|
|
90
|
+
return { funcName: nameString?.text ?? '', label: 'Function' };
|
|
91
|
+
};
|
|
92
|
+
export const zigMethodConfig = {
|
|
93
|
+
language: SupportedLanguages.Zig,
|
|
94
|
+
// `source_file`: a file-struct's top-level fns are methods of the file's Struct.
|
|
95
|
+
typeDeclarationNodes: [...ZIG_CONTAINER_TYPES, 'source_file'],
|
|
96
|
+
methodNodeTypes: ['function_declaration'],
|
|
97
|
+
bodyNodeTypes: [],
|
|
98
|
+
extractOwnerName: extractZigOwnerName,
|
|
99
|
+
extractName: extractZigName,
|
|
100
|
+
extractFunctionName: extractZigFunctionName,
|
|
101
|
+
extractReturnType: extractZigReturnType,
|
|
102
|
+
extractParameters: extractZigParameters,
|
|
103
|
+
// `pub` only: `export fn` is C linkage, still private to other Zig files
|
|
104
|
+
// (isExported carries the FFI fact — see export-detection.ts).
|
|
105
|
+
extractVisibility: (node) => (hasZigPubKeyword(node) ? 'public' : 'private'),
|
|
106
|
+
extractReceiverType: extractZigReceiverType,
|
|
107
|
+
isStatic(node, filePath) {
|
|
108
|
+
// A Zig "method" is static when it has no receiver parameter — `self` OR
|
|
109
|
+
// a first parameter typed as the enclosing container (`replica:
|
|
110
|
+
// *Replica`, `pool: *@This()`, `ledger: *Ledger` in `Ledger.zig`); see
|
|
111
|
+
// `zigReceiverParameter`.
|
|
112
|
+
return zigReceiverParameter(node, filePath) === null;
|
|
113
|
+
},
|
|
114
|
+
isAbstract() {
|
|
115
|
+
return false;
|
|
116
|
+
},
|
|
117
|
+
isFinal() {
|
|
118
|
+
return false;
|
|
119
|
+
},
|
|
120
|
+
};
|
|
@@ -63,7 +63,7 @@ export function createMethodExtractor(config) {
|
|
|
63
63
|
// Resolve owner name: config hook → field-based → type_identifier → simple_identifier → "Companion"
|
|
64
64
|
let ownerName;
|
|
65
65
|
if (config.extractOwnerName) {
|
|
66
|
-
ownerName = config.extractOwnerName(node);
|
|
66
|
+
ownerName = config.extractOwnerName(node, context.filePath);
|
|
67
67
|
}
|
|
68
68
|
if (!ownerName) {
|
|
69
69
|
const nameField = node.childForFieldName('name');
|
|
@@ -133,6 +133,17 @@ function findBodies(node, bodyNodeSet) {
|
|
|
133
133
|
result.push(bodyField);
|
|
134
134
|
addNestedBodies(bodyField, bodyNodeSet, result);
|
|
135
135
|
}
|
|
136
|
+
// Grammars with no body wrapper at all: a config that declares NO
|
|
137
|
+
// `bodyNodeTypes` (tree-sitter-zig's struct_declaration holds its
|
|
138
|
+
// function_declaration children directly) uses the type-declaration node
|
|
139
|
+
// itself as the body. The downstream walk filters by `methodNodeTypes`, so
|
|
140
|
+
// unrelated children are ignored. Deliberately NOT a fallback for configs
|
|
141
|
+
// that do declare body wrappers: for them a node without its wrapper is a
|
|
142
|
+
// bodiless declaration (forward declaration, `declare class`), and scanning
|
|
143
|
+
// it would change every such language for no method it could find.
|
|
144
|
+
if (result.length === 0 && bodyNodeSet.size === 0) {
|
|
145
|
+
result.push(node);
|
|
146
|
+
}
|
|
136
147
|
return result;
|
|
137
148
|
}
|
|
138
149
|
function addNestedBodies(parent, bodyNodeSet, out, seen) {
|
|
@@ -183,12 +194,13 @@ function buildMethod(node, ownerNode, context, config) {
|
|
|
183
194
|
isFinal = false;
|
|
184
195
|
// Static-owner detection is config-driven: each language declares which
|
|
185
196
|
// container node types imply static (e.g. Ruby singleton_class, Kotlin companion_object).
|
|
186
|
-
const isStatic = (config.staticOwnerTypes?.has(ownerNode.type) ?? false) ||
|
|
197
|
+
const isStatic = (config.staticOwnerTypes?.has(ownerNode.type) ?? false) ||
|
|
198
|
+
config.isStatic(node, context.filePath);
|
|
187
199
|
return {
|
|
188
200
|
name,
|
|
189
|
-
receiverType: config.extractReceiverType?.(node) ?? null,
|
|
201
|
+
receiverType: config.extractReceiverType?.(node, context.filePath) ?? null,
|
|
190
202
|
returnType: config.extractReturnType(node) ?? null,
|
|
191
|
-
parameters: config.extractParameters(node),
|
|
203
|
+
parameters: config.extractParameters(node, context.filePath),
|
|
192
204
|
visibility: config.extractVisibility(node),
|
|
193
205
|
isStatic,
|
|
194
206
|
isAbstract,
|
|
@@ -79,13 +79,19 @@ export interface MethodExtractionConfig {
|
|
|
79
79
|
bodyNodeTypes: string[];
|
|
80
80
|
extractName: (node: SyntaxNode) => string | undefined;
|
|
81
81
|
extractReturnType: (node: SyntaxNode) => string | undefined;
|
|
82
|
-
|
|
82
|
+
/** The optional `filePath` (the extractor context's) is passed to
|
|
83
|
+
* `extractParameters`, `isStatic` and `extractReceiverType` for languages
|
|
84
|
+
* whose receiver rule depends on the file — Zig's file-struct, whose type
|
|
85
|
+
* name is the file stem, so `fn incr(counter: *Counter)` in `Counter.zig`
|
|
86
|
+
* is a method only when the file is known. Same optional-trailing-argument
|
|
87
|
+
* shape as `extractOwnerName`; every other config ignores it. */
|
|
88
|
+
extractParameters: (node: SyntaxNode, filePath?: string) => ParameterInfo[];
|
|
83
89
|
extractVisibility: (node: SyntaxNode) => MethodVisibility;
|
|
84
|
-
isStatic: (node: SyntaxNode) => boolean;
|
|
90
|
+
isStatic: (node: SyntaxNode, filePath?: string) => boolean;
|
|
85
91
|
isAbstract: (node: SyntaxNode, ownerNode: SyntaxNode) => boolean;
|
|
86
92
|
isFinal: (node: SyntaxNode) => boolean;
|
|
87
93
|
extractAnnotations?: (node: SyntaxNode) => string[];
|
|
88
|
-
extractReceiverType?: (node: SyntaxNode) => string | undefined;
|
|
94
|
+
extractReceiverType?: (node: SyntaxNode, filePath?: string) => string | undefined;
|
|
89
95
|
isVirtual?: (node: SyntaxNode) => boolean;
|
|
90
96
|
isOverride?: (node: SyntaxNode) => boolean;
|
|
91
97
|
isAsync?: (node: SyntaxNode) => boolean;
|
|
@@ -97,7 +103,7 @@ export interface MethodExtractionConfig {
|
|
|
97
103
|
* When the ownerNode matches one of these types, isStatic is forced true. */
|
|
98
104
|
staticOwnerTypes?: ReadonlySet<string>;
|
|
99
105
|
/** Resolve the owner name from a standalone method node (e.g. Go receiver type). */
|
|
100
|
-
extractOwnerName?: (node: SyntaxNode) => string | undefined;
|
|
106
|
+
extractOwnerName?: (node: SyntaxNode, filePath?: string) => string | undefined;
|
|
101
107
|
/** Extract a primary constructor from the owner node itself (e.g. C# 12 class Point(int x, int y)). */
|
|
102
108
|
extractPrimaryConstructor?: (ownerNode: SyntaxNode, context: MethodExtractorContext) => MethodInfo | null;
|
|
103
109
|
/** Extract function name + label from an AST node during parent-walk.
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Field Registry
|
|
3
3
|
*
|
|
4
4
|
* Owner-scoped field/property index extracted from SymbolTable.
|
|
5
|
-
* Stores Property / Variable / Const / Static symbols
|
|
6
|
-
* `ownerNodeId
|
|
7
|
-
* under the same (owner, name) — e.g. legacy Property plus a
|
|
5
|
+
* Stores Property / Variable / Const / Static symbols in a nested
|
|
6
|
+
* `Map<ownerNodeId, Map<fieldName, defs[]>>` for O(1) lookup. Supports
|
|
7
|
+
* multiple defs under the same (owner, name) — e.g. legacy Property plus a
|
|
8
8
|
* scope-resolution Variable reconciliation entry.
|
|
9
9
|
*/
|
|
10
10
|
import type { SymbolDefinition } from '../../../_shared/index.js';
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Field Registry
|
|
3
3
|
*
|
|
4
4
|
* Owner-scoped field/property index extracted from SymbolTable.
|
|
5
|
-
* Stores Property / Variable / Const / Static symbols
|
|
6
|
-
* `ownerNodeId
|
|
7
|
-
* under the same (owner, name) — e.g. legacy Property plus a
|
|
5
|
+
* Stores Property / Variable / Const / Static symbols in a nested
|
|
6
|
+
* `Map<ownerNodeId, Map<fieldName, defs[]>>` for O(1) lookup. Supports
|
|
7
|
+
* multiple defs under the same (owner, name) — e.g. legacy Property plus a
|
|
8
8
|
* scope-resolution Variable reconciliation entry.
|
|
9
9
|
*/
|
|
10
10
|
const EMPTY = Object.freeze([]);
|
|
@@ -14,20 +14,24 @@ const EMPTY = Object.freeze([]);
|
|
|
14
14
|
export const createFieldRegistry = () => {
|
|
15
15
|
const fieldByOwner = new Map();
|
|
16
16
|
const lookupAllByOwner = (ownerNodeId, fieldName) => {
|
|
17
|
-
return fieldByOwner.get(
|
|
17
|
+
return fieldByOwner.get(ownerNodeId)?.get(fieldName) ?? EMPTY;
|
|
18
18
|
};
|
|
19
19
|
const lookupFieldByOwner = (ownerNodeId, fieldName) => {
|
|
20
20
|
const pool = lookupAllByOwner(ownerNodeId, fieldName);
|
|
21
21
|
return pool.length === 0 ? undefined : pool[0];
|
|
22
22
|
};
|
|
23
23
|
const register = (ownerNodeId, fieldName, def) => {
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
let byName = fieldByOwner.get(ownerNodeId);
|
|
25
|
+
if (!byName) {
|
|
26
|
+
byName = new Map();
|
|
27
|
+
fieldByOwner.set(ownerNodeId, byName);
|
|
28
|
+
}
|
|
29
|
+
const existing = byName.get(fieldName);
|
|
26
30
|
if (existing) {
|
|
27
31
|
existing.push(def);
|
|
28
32
|
}
|
|
29
33
|
else {
|
|
30
|
-
|
|
34
|
+
byName.set(fieldName, [def]);
|
|
31
35
|
}
|
|
32
36
|
};
|
|
33
37
|
const clear = () => {
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Method Registry
|
|
3
3
|
*
|
|
4
4
|
* Owner-scoped method index extracted from SymbolTable.
|
|
5
|
-
* Stores Method/Constructor/Function-with-ownerId symbols
|
|
6
|
-
* `ownerNodeId
|
|
7
|
-
* (array values) and arity-based filtering.
|
|
5
|
+
* Stores Method/Constructor/Function-with-ownerId symbols in a nested
|
|
6
|
+
* `Map<ownerNodeId, Map<methodName, defs[]>>` for O(1) lookup. Supports
|
|
7
|
+
* overloads (array values) and arity-based filtering.
|
|
8
8
|
*/
|
|
9
9
|
import type { SymbolDefinition } from '../../../_shared/index.js';
|
|
10
10
|
export interface MethodRegistry {
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Method Registry
|
|
3
3
|
*
|
|
4
4
|
* Owner-scoped method index extracted from SymbolTable.
|
|
5
|
-
* Stores Method/Constructor/Function-with-ownerId symbols
|
|
6
|
-
* `ownerNodeId
|
|
7
|
-
* (array values) and arity-based filtering.
|
|
5
|
+
* Stores Method/Constructor/Function-with-ownerId symbols in a nested
|
|
6
|
+
* `Map<ownerNodeId, Map<methodName, defs[]>>` for O(1) lookup. Supports
|
|
7
|
+
* overloads (array values) and arity-based filtering.
|
|
8
8
|
*/
|
|
9
9
|
// ---------------------------------------------------------------------------
|
|
10
10
|
// Factory
|
|
@@ -19,8 +19,9 @@ export const createMethodRegistry = () => {
|
|
|
19
19
|
// Set once when a Function+ownerId def lands here, powers the Tier 3
|
|
20
20
|
// dedup fast-path. Monotonic: never unset except on `clear()`.
|
|
21
21
|
let hasFunctionMethodsFlag = false;
|
|
22
|
+
const ownerDefs = (ownerNodeId, methodName) => methodByOwner.get(ownerNodeId)?.get(methodName);
|
|
22
23
|
const lookupMethodByOwner = (ownerNodeId, methodName, argCount) => {
|
|
23
|
-
const defs =
|
|
24
|
+
const defs = ownerDefs(ownerNodeId, methodName);
|
|
24
25
|
if (!defs || defs.length === 0)
|
|
25
26
|
return undefined;
|
|
26
27
|
// Arity narrowing: when an argCount is provided and there are multiple
|
|
@@ -89,16 +90,20 @@ export const createMethodRegistry = () => {
|
|
|
89
90
|
return methodsByName.get(name) ?? EMPTY;
|
|
90
91
|
};
|
|
91
92
|
const lookupAllByOwner = (ownerNodeId, methodName) => {
|
|
92
|
-
return
|
|
93
|
+
return ownerDefs(ownerNodeId, methodName) ?? EMPTY;
|
|
93
94
|
};
|
|
94
95
|
const register = (ownerNodeId, methodName, def) => {
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
let owned = methodByOwner.get(ownerNodeId);
|
|
97
|
+
if (!owned) {
|
|
98
|
+
owned = new Map();
|
|
99
|
+
methodByOwner.set(ownerNodeId, owned);
|
|
100
|
+
}
|
|
101
|
+
const existing = owned.get(methodName);
|
|
97
102
|
if (existing) {
|
|
98
103
|
existing.push(def);
|
|
99
104
|
}
|
|
100
105
|
else {
|
|
101
|
-
|
|
106
|
+
owned.set(methodName, [def]);
|
|
102
107
|
}
|
|
103
108
|
const byName = methodsByName.get(methodName);
|
|
104
109
|
if (byName) {
|
|
@@ -116,6 +116,9 @@ const LABEL_BEHAVIOR = {
|
|
|
116
116
|
Section: 'inert',
|
|
117
117
|
Route: 'inert',
|
|
118
118
|
Tool: 'inert',
|
|
119
|
+
// A broker address, not a symbol: nothing in any language resolves a name to
|
|
120
|
+
// it, so it stays out of the dispatch and callable indexes like `Route`.
|
|
121
|
+
Destination: 'inert',
|
|
119
122
|
// Taint/PDG substrate (issue #2080) — a control-flow node, never a
|
|
120
123
|
// symbol-resolution target. Inert: file index only, no owner scope.
|
|
121
124
|
BasicBlock: 'inert',
|
|
@@ -24,7 +24,7 @@ export const createTypeRegistry = () => {
|
|
|
24
24
|
return implByName.get(name) ?? [];
|
|
25
25
|
};
|
|
26
26
|
const lookupAllByOwner = (ownerNodeId, simpleName) => {
|
|
27
|
-
return nestedByOwner.get(
|
|
27
|
+
return nestedByOwner.get(ownerNodeId)?.get(simpleName) ?? EMPTY;
|
|
28
28
|
};
|
|
29
29
|
const registerClass = (name, qualifiedName, def) => {
|
|
30
30
|
const existing = classByName.get(name);
|
|
@@ -52,13 +52,17 @@ export const createTypeRegistry = () => {
|
|
|
52
52
|
}
|
|
53
53
|
};
|
|
54
54
|
const registerByOwner = (ownerNodeId, simpleName, def) => {
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
let byName = nestedByOwner.get(ownerNodeId);
|
|
56
|
+
if (!byName) {
|
|
57
|
+
byName = new Map();
|
|
58
|
+
nestedByOwner.set(ownerNodeId, byName);
|
|
59
|
+
}
|
|
60
|
+
const existing = byName.get(simpleName);
|
|
57
61
|
if (existing) {
|
|
58
62
|
existing.push(def);
|
|
59
63
|
}
|
|
60
64
|
else {
|
|
61
|
-
|
|
65
|
+
byName.set(simpleName, [def]);
|
|
62
66
|
}
|
|
63
67
|
};
|
|
64
68
|
const clear = () => {
|
|
@@ -48,6 +48,9 @@ function providerCandidates(ids, providers) {
|
|
|
48
48
|
// candidates when none are known instead of dropping the injection entirely.
|
|
49
49
|
return recognized.length > 0 ? recognized : all;
|
|
50
50
|
}
|
|
51
|
+
function isConcreteTypeNode(node) {
|
|
52
|
+
return node?.label === 'Class' || node?.label === 'Record' || node?.label === 'Enum';
|
|
53
|
+
}
|
|
51
54
|
export const diPhase = {
|
|
52
55
|
name: 'di',
|
|
53
56
|
deps: ['mro'],
|
|
@@ -103,21 +106,25 @@ export const diPhase = {
|
|
|
103
106
|
ambiguousInjections: 0,
|
|
104
107
|
};
|
|
105
108
|
}
|
|
106
|
-
const
|
|
109
|
+
const directSubtypes = new Map();
|
|
107
110
|
const directSupertypes = new Map();
|
|
108
111
|
for (const rel of ctx.graph.iterRelationshipsByType('IMPLEMENTS')) {
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
+
const subtypes = directSubtypes.get(rel.targetId) ?? new Set();
|
|
113
|
+
subtypes.add(rel.sourceId);
|
|
114
|
+
directSubtypes.set(rel.targetId, subtypes);
|
|
112
115
|
const supertypes = directSupertypes.get(rel.sourceId) ?? new Set();
|
|
113
116
|
supertypes.add(rel.targetId);
|
|
114
117
|
directSupertypes.set(rel.sourceId, supertypes);
|
|
115
118
|
}
|
|
116
119
|
for (const rel of ctx.graph.iterRelationshipsByType('EXTENDS')) {
|
|
120
|
+
const subtypes = directSubtypes.get(rel.targetId) ?? new Set();
|
|
121
|
+
subtypes.add(rel.sourceId);
|
|
122
|
+
directSubtypes.set(rel.targetId, subtypes);
|
|
117
123
|
const supertypes = directSupertypes.get(rel.sourceId) ?? new Set();
|
|
118
124
|
supertypes.add(rel.targetId);
|
|
119
125
|
directSupertypes.set(rel.sourceId, supertypes);
|
|
120
126
|
}
|
|
127
|
+
const orderedDirectSubtypes = new Map([...directSubtypes].map(([typeId, subtypes]) => [typeId, [...subtypes].sort().reverse()]));
|
|
121
128
|
const memberToClass = new Map();
|
|
122
129
|
for (const relationType of ['HAS_PROPERTY', 'HAS_METHOD']) {
|
|
123
130
|
for (const rel of ctx.graph.iterRelationshipsByType(relationType)) {
|
|
@@ -128,18 +135,45 @@ export const diPhase = {
|
|
|
128
135
|
const interfacesByLanguage = new Map();
|
|
129
136
|
const classesByLanguage = new Map();
|
|
130
137
|
ctx.graph.forEachNode((node) => {
|
|
131
|
-
|
|
138
|
+
const concreteType = isConcreteTypeNode(node);
|
|
139
|
+
if (!concreteType && node.label !== 'Interface')
|
|
132
140
|
return;
|
|
133
141
|
const language = node.properties.language;
|
|
134
142
|
if (typeof language !== 'string' || !candidateLanguages.has(language))
|
|
135
143
|
return;
|
|
136
|
-
const indexes =
|
|
144
|
+
const indexes = concreteType ? classesByLanguage : interfacesByLanguage;
|
|
137
145
|
const index = indexes.get(language) ?? emptyNameIndex();
|
|
138
146
|
addIndexedName(index, node);
|
|
139
147
|
indexes.set(language, index);
|
|
140
|
-
if (
|
|
148
|
+
if (concreteType)
|
|
141
149
|
providerNodes.set(node.id, node);
|
|
142
150
|
});
|
|
151
|
+
const concreteSubtypesByRoot = new Map();
|
|
152
|
+
const concreteSubtypes = (rootTypeId, language) => {
|
|
153
|
+
const cacheKey = `${language}\0${rootTypeId}`;
|
|
154
|
+
const cached = concreteSubtypesByRoot.get(cacheKey);
|
|
155
|
+
if (cached !== undefined)
|
|
156
|
+
return cached;
|
|
157
|
+
const concrete = new Set();
|
|
158
|
+
const queue = [rootTypeId];
|
|
159
|
+
const visited = new Set();
|
|
160
|
+
while (queue.length > 0) {
|
|
161
|
+
const typeId = queue.pop();
|
|
162
|
+
if (typeId === undefined || visited.has(typeId))
|
|
163
|
+
continue;
|
|
164
|
+
visited.add(typeId);
|
|
165
|
+
const typeNode = ctx.graph.getNode(typeId);
|
|
166
|
+
if (typeNode !== undefined &&
|
|
167
|
+
isConcreteTypeNode(typeNode) &&
|
|
168
|
+
typeNode.properties.language === language) {
|
|
169
|
+
concrete.add(typeId);
|
|
170
|
+
}
|
|
171
|
+
const children = orderedDirectSubtypes.get(typeId) ?? [];
|
|
172
|
+
queue.push(...children);
|
|
173
|
+
}
|
|
174
|
+
concreteSubtypesByRoot.set(cacheKey, concrete);
|
|
175
|
+
return concrete;
|
|
176
|
+
};
|
|
143
177
|
// A declaration returning a concrete class is assignable to every class or
|
|
144
178
|
// interface that type extends/implements. Expand once per language+type and
|
|
145
179
|
// register the declaration under those ancestor names. This keeps named
|
|
@@ -227,13 +261,12 @@ export const diPhase = {
|
|
|
227
261
|
ambiguousTypeNames.add(candidate.targetTypeName);
|
|
228
262
|
continue;
|
|
229
263
|
}
|
|
230
|
-
const
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}
|
|
264
|
+
const rootTypeId = typeof classEntry === 'string'
|
|
265
|
+
? classEntry
|
|
266
|
+
: typeof interfaceEntry === 'string'
|
|
267
|
+
? interfaceEntry
|
|
268
|
+
: undefined;
|
|
269
|
+
const structural = new Set(rootTypeId === undefined ? [] : concreteSubtypes(rootTypeId, candidate.language));
|
|
237
270
|
for (const id of providedTypes.get(candidate.language)?.get(candidate.targetTypeName) ?? []) {
|
|
238
271
|
structural.add(id);
|
|
239
272
|
}
|
|
@@ -15,6 +15,7 @@ export { ormPhase, type ORMOutput } from './orm.js';
|
|
|
15
15
|
export { crossFilePhase, type CrossFileOutput } from './cross-file.js';
|
|
16
16
|
export { scopeResolutionPhase, type ScopeResolutionOutput, } from '../scope-resolution/pipeline/phase.js';
|
|
17
17
|
export { springConfigPhase, type SpringConfigOutput } from './spring-config.js';
|
|
18
|
+
export { springDestinationsPhase, type SpringDestinationsOutput } from './spring-destinations.js';
|
|
18
19
|
export { springAutoConfigurationPhase, type SpringAutoConfigurationOutput, } from './spring-auto-configuration.js';
|
|
19
20
|
export { springAopPhase, springAopInheritancePhase, type SpringAopOutput, type SpringAopInheritanceOutput, } from './spring-aop.js';
|
|
20
21
|
export { pruneLocalSymbolsPhase, type PruneLocalSymbolsOutput } from './prune-local-symbols.js';
|