gitnexus 1.6.10-rc.21 → 1.6.10-rc.211
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 +212 -22
- package/dist/_shared/graph/types.d.ts +27 -8
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +4 -3
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js +1 -1
- package/dist/_shared/index.js.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 +19 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +23 -10
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.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 +3 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
- package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +6 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +316 -37
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +124 -1
- 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/lookup-core.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
- package/dist/_shared/scope-resolution/registries/lookup-core.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/symbol-definition.d.ts +47 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +297 -5
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +10 -2
- package/dist/cli/ai-context.js +128 -61
- package/dist/cli/analyze-config.d.ts +1 -1
- package/dist/cli/analyze-options.d.ts +131 -0
- package/dist/cli/analyze-options.js +1 -0
- package/dist/cli/analyze.d.ts +25 -114
- package/dist/cli/analyze.js +194 -36
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/detect-changes-format.js +19 -2
- package/dist/cli/doctor.d.ts +23 -0
- package/dist/cli/doctor.js +72 -9
- package/dist/cli/editor-targets.js +6 -0
- package/dist/cli/eval-server.d.ts +23 -1
- package/dist/cli/eval-server.js +128 -9
- package/dist/cli/format-symbol.d.ts +15 -0
- package/dist/cli/format-symbol.js +17 -0
- package/dist/cli/generated-skill.d.ts +17 -0
- package/dist/cli/generated-skill.js +1 -0
- package/dist/cli/group.js +23 -2
- package/dist/cli/help-i18n.js +3 -0
- package/dist/cli/i18n/en.d.ts +17 -8
- package/dist/cli/i18n/en.js +19 -8
- package/dist/cli/i18n/resources.d.ts +26 -8
- package/dist/cli/i18n/zh-CN.d.ts +9 -0
- package/dist/cli/i18n/zh-CN.js +17 -8
- package/dist/cli/index.js +16 -9
- package/dist/cli/lazy-action.d.ts +7 -0
- package/dist/cli/lazy-action.js +27 -0
- package/dist/cli/mcp.js +6 -3
- package/dist/cli/resolve-invocation.d.ts +7 -3
- package/dist/cli/resolve-invocation.js +7 -3
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.js +30 -7
- package/dist/cli/skill-gen.d.ts +1 -6
- package/dist/cli/skill-gen.js +88 -18
- package/dist/cli/standard-skills.d.ts +76 -0
- package/dist/cli/standard-skills.js +45 -0
- package/dist/cli/status.d.ts +4 -1
- package/dist/cli/status.js +57 -4
- package/dist/cli/tool.d.ts +1 -0
- package/dist/cli/tool.js +75 -7
- package/dist/cli/uninstall.js +7 -2
- package/dist/cli/wiki.d.ts +1 -0
- package/dist/cli/wiki.js +59 -10
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +31 -4
- package/dist/core/analysis-features.d.ts +21 -0
- package/dist/core/analysis-features.js +59 -0
- package/dist/core/analyzer-identity.d.ts +154 -0
- package/dist/core/analyzer-identity.js +2158 -0
- package/dist/core/augmentation/engine.js +95 -76
- package/dist/core/embedding-checkpoint.d.ts +143 -0
- package/dist/core/embedding-checkpoint.js +221 -0
- package/dist/core/embedding-count.d.ts +61 -0
- package/dist/core/embedding-count.js +69 -0
- package/dist/core/embeddings/ast-utils.js +9 -1
- package/dist/core/embeddings/embedder.d.ts +3 -2
- package/dist/core/embeddings/embedder.js +8 -5
- package/dist/core/embeddings/embedding-identity.d.ts +11 -0
- package/dist/core/embeddings/embedding-identity.js +24 -0
- package/dist/core/embeddings/embedding-pipeline.d.ts +24 -1
- package/dist/core/embeddings/embedding-pipeline.js +341 -19
- package/dist/core/embeddings/http-client.d.ts +10 -2
- package/dist/core/embeddings/http-client.js +282 -47
- package/dist/core/embeddings/node-module-compat.d.ts +4 -2
- package/dist/core/embeddings/node-module-compat.js +4 -2
- package/dist/core/embeddings/onnxruntime-common-resolver.js +5 -5
- package/dist/core/embeddings/onnxruntime-node-resolver.js +2 -2
- package/dist/core/embeddings/runtime-install.js +1 -1
- package/dist/core/git-staleness.js +1 -1
- package/dist/core/graph/graph.js +3 -0
- package/dist/core/graph/import-cycles.d.ts +194 -3
- package/dist/core/graph/import-cycles.js +522 -73
- package/dist/core/graph/types.d.ts +18 -0
- package/dist/core/group/bridge-db.js +5 -27
- package/dist/core/group/cross-impact.d.ts +21 -0
- package/dist/core/group/cross-impact.js +128 -15
- package/dist/core/group/cross-trace.js +27 -16
- package/dist/core/group/extractors/http-patterns/java.js +91 -14
- package/dist/core/group/extractors/http-patterns/node.js +19 -0
- package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
- package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
- package/dist/core/group/extractors/http-route-extractor.js +122 -48
- package/dist/core/group/extractors/include-extractor.js +20 -2
- package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
- package/dist/core/group/extractors/manifest-extractor.js +7 -7
- package/dist/core/group/service.js +10 -1
- package/dist/core/group/storage.js +2 -33
- package/dist/core/group/types.d.ts +18 -0
- package/dist/core/incremental/subgraph-extract.d.ts +9 -6
- package/dist/core/incremental/subgraph-extract.js +33 -10
- package/dist/core/index-freshness.d.ts +80 -0
- package/dist/core/index-freshness.js +120 -0
- package/dist/core/ingestion/call-processor.d.ts +13 -1
- package/dist/core/ingestion/call-processor.js +110 -3
- package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
- package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
- package/dist/core/ingestion/cfg/emit.d.ts +8 -23
- package/dist/core/ingestion/cfg/emit.js +9 -23
- package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
- package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
- package/dist/core/ingestion/cluster-enricher.js +8 -4
- package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
- package/dist/core/ingestion/community-processor.d.ts +21 -3
- package/dist/core/ingestion/community-processor.js +88 -83
- package/dist/core/ingestion/di-extractors/index.d.ts +22 -34
- package/dist/core/ingestion/di-extractors/index.js +17 -18
- package/dist/core/ingestion/di-extractors/spring.d.ts +27 -5
- package/dist/core/ingestion/di-extractors/spring.js +87 -3
- package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
- package/dist/core/ingestion/di-extractors/types.js +15 -0
- package/dist/core/ingestion/emit-references.js +4 -0
- package/dist/core/ingestion/filesystem-walker.js +16 -12
- package/dist/core/ingestion/finalize-orchestrator.js +1 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +9 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +41 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
- package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
- package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +27 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +48 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.js +379 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
- package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
- package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
- package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
- package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
- package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
- package/dist/core/ingestion/import-resolvers/go.js +44 -17
- package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +428 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
- package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/php.js +27 -8
- package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
- package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
- package/dist/core/ingestion/import-resolvers/python.js +25 -6
- package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
- package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
- package/dist/core/ingestion/import-resolvers/utils.js +215 -36
- package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
- package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
- package/dist/core/ingestion/language-config.d.ts +20 -1
- package/dist/core/ingestion/language-config.js +18 -23
- package/dist/core/ingestion/language-provider.d.ts +133 -7
- package/dist/core/ingestion/languages/c/captures.js +63 -0
- package/dist/core/ingestion/languages/c/import-target.js +12 -16
- package/dist/core/ingestion/languages/c/query.js +17 -0
- package/dist/core/ingestion/languages/c/scope-resolver.js +26 -19
- package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
- package/dist/core/ingestion/languages/c-cpp.js +13 -0
- package/dist/core/ingestion/languages/cobol/captures.js +93 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +34 -20
- package/dist/core/ingestion/languages/cobol.js +13 -0
- package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
- package/dist/core/ingestion/languages/cpp/adl.js +67 -44
- package/dist/core/ingestion/languages/cpp/captures.js +222 -3
- package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
- package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
- package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
- package/dist/core/ingestion/languages/cpp/query.js +106 -0
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +62 -20
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
- package/dist/core/ingestion/languages/csharp/captures.js +44 -0
- package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
- package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
- package/dist/core/ingestion/languages/csharp/query.js +25 -5
- package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
- package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
- package/dist/core/ingestion/languages/dart/captures.js +686 -16
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
- package/dist/core/ingestion/languages/dart/import-target.js +32 -9
- package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
- package/dist/core/ingestion/languages/dart/index.js +1 -1
- package/dist/core/ingestion/languages/dart/query.js +98 -1
- package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
- package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
- package/dist/core/ingestion/languages/dart.js +8 -1
- package/dist/core/ingestion/languages/go/captures.js +142 -3
- package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
- package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
- package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
- package/dist/core/ingestion/languages/go/import-target.js +34 -30
- package/dist/core/ingestion/languages/go/index.d.ts +1 -1
- package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
- package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
- package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/go/interpret.js +22 -8
- package/dist/core/ingestion/languages/go/method-owners.js +31 -12
- package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
- package/dist/core/ingestion/languages/go/package-clause.js +75 -0
- package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
- package/dist/core/ingestion/languages/go/query.js +56 -3
- package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
- package/dist/core/ingestion/languages/go.js +9 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +7 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +25 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +38 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +124 -0
- package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
- package/dist/core/ingestion/languages/java/captures.js +321 -49
- package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
- package/dist/core/ingestion/languages/java/import-target.js +68 -88
- package/dist/core/ingestion/languages/java/interpret.js +3 -2
- package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
- package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
- package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/java/package-facts.js +9 -0
- package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
- package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
- package/dist/core/ingestion/languages/java/query.js +39 -3
- package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
- package/dist/core/ingestion/languages/java/record-components.js +185 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +35 -2
- package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
- package/dist/core/ingestion/languages/java/spring-di.d.ts +20 -0
- package/dist/core/ingestion/languages/java/spring-di.js +160 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
- package/dist/core/ingestion/languages/java.js +76 -3
- package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
- package/dist/core/ingestion/languages/javascript/captures.js +278 -4
- package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
- package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
- package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
- package/dist/core/ingestion/languages/javascript/index.js +54 -5
- package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/javascript/query.js +232 -5
- package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
- package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
- package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
- package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.js +197 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +40 -3
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +111 -8
- package/dist/core/ingestion/languages/kotlin/captures.js +112 -0
- package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
- package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
- package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
- package/dist/core/ingestion/languages/kotlin/index.js +1 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
- package/dist/core/ingestion/languages/kotlin/query.js +47 -2
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +36 -3
- package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +20 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.js +299 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
- package/dist/core/ingestion/languages/kotlin.js +5 -6
- package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
- package/dist/core/ingestion/languages/php/captures.js +359 -51
- package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
- package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
- package/dist/core/ingestion/languages/php/import-target.js +229 -7
- package/dist/core/ingestion/languages/php/interpret.js +10 -0
- package/dist/core/ingestion/languages/php/query.js +31 -0
- package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
- package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
- package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
- package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
- package/dist/core/ingestion/languages/python/captures.js +53 -5
- package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
- package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
- package/dist/core/ingestion/languages/python/import-target.js +277 -91
- package/dist/core/ingestion/languages/python/index.d.ts +1 -1
- package/dist/core/ingestion/languages/python/index.js +1 -1
- package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
- package/dist/core/ingestion/languages/python/interpret.js +249 -3
- package/dist/core/ingestion/languages/python/query.js +9 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +17 -2
- package/dist/core/ingestion/languages/python/receiver-binding.js +192 -2
- package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
- package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
- package/dist/core/ingestion/languages/python/simple-hooks.js +9 -5
- package/dist/core/ingestion/languages/ruby/captures.js +200 -0
- package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
- package/dist/core/ingestion/languages/ruby/query.js +93 -0
- package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
- package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
- package/dist/core/ingestion/languages/rust/captures.js +52 -1
- package/dist/core/ingestion/languages/rust/interpret.js +18 -0
- package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
- package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
- package/dist/core/ingestion/languages/rust/module-path.js +214 -0
- package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
- package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
- package/dist/core/ingestion/languages/rust/query.js +48 -6
- package/dist/core/ingestion/languages/rust/range-binding.d.ts +1 -11
- package/dist/core/ingestion/languages/rust/range-binding.js +149 -63
- package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
- package/dist/core/ingestion/languages/rust.js +17 -0
- package/dist/core/ingestion/languages/swift/captures.js +99 -3
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
- package/dist/core/ingestion/languages/swift/import-target.js +4 -9
- package/dist/core/ingestion/languages/swift/query.js +17 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
- package/dist/core/ingestion/languages/swift.js +2 -0
- package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
- package/dist/core/ingestion/languages/typescript/captures.js +288 -5
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
- package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
- package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
- package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
- package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
- package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
- package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
- package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
- package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
- package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
- package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/typescript/query.js +340 -14
- package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
- package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
- package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
- package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
- package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
- package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
- package/dist/core/ingestion/languages/typescript/tsconfig.js +291 -0
- package/dist/core/ingestion/languages/typescript.js +87 -1
- package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
- package/dist/core/ingestion/languages/vue/import-target.js +11 -47
- package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
- package/dist/core/ingestion/local-symbol-pruner.js +11 -11
- package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
- package/dist/core/ingestion/method-extractors/generic.js +1 -0
- package/dist/core/ingestion/method-types.d.ts +16 -0
- package/dist/core/ingestion/parsing-processor.js +32 -1
- package/dist/core/ingestion/pipeline-phases/di.d.ts +8 -33
- package/dist/core/ingestion/pipeline-phases/di.js +275 -157
- package/dist/core/ingestion/pipeline-phases/index.d.ts +3 -0
- package/dist/core/ingestion/pipeline-phases/index.js +3 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +158 -3
- package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +11 -2
- package/dist/core/ingestion/pipeline-phases/processes.js +102 -7
- package/dist/core/ingestion/pipeline-phases/routes.js +56 -10
- package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
- package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
- package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
- package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
- package/dist/core/ingestion/pipeline.d.ts +27 -3
- package/dist/core/ingestion/pipeline.js +62 -12
- package/dist/core/ingestion/process-processor.d.ts +109 -2
- package/dist/core/ingestion/process-processor.js +464 -52
- package/dist/core/ingestion/resolve-references.d.ts +6 -1
- package/dist/core/ingestion/resolve-references.js +78 -6
- package/dist/core/ingestion/route-extractors/data-route-table.d.ts +25 -0
- package/dist/core/ingestion/route-extractors/data-route-table.js +864 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
- package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
- package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
- package/dist/core/ingestion/route-extractors/spring.js +109 -24
- package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
- package/dist/core/ingestion/scope-extractor.d.ts +22 -7
- package/dist/core/ingestion/scope-extractor.js +617 -59
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +381 -22
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +15 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +53 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +275 -41
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +56 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +130 -32
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +46 -3
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +64 -0
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1233 -0
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +19 -4
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +160 -4
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +64 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +118 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +109 -8
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +82 -38
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +61 -1
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +384 -48
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
- package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
- package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +968 -56
- package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
- package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
- package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
- package/dist/core/ingestion/taint/typescript-model.js +34 -2
- package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
- package/dist/core/ingestion/tree-sitter-queries.js +688 -5
- package/dist/core/ingestion/type-env.js +11 -7
- package/dist/core/ingestion/type-extractors/jvm.js +17 -2
- package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
- package/dist/core/ingestion/type-extractors/shared.js +16 -0
- package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
- package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
- package/dist/core/ingestion/type-extractors/typescript.js +26 -0
- package/dist/core/ingestion/utils/ast-helpers.d.ts +311 -14
- package/dist/core/ingestion/utils/ast-helpers.js +745 -48
- package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
- package/dist/core/ingestion/utils/call-analysis.js +202 -7
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +153 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +928 -0
- package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
- package/dist/core/ingestion/utils/callable-labels.js +31 -0
- package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
- package/dist/core/ingestion/utils/effective-ram.js +58 -0
- package/dist/core/ingestion/utils/line-base.d.ts +14 -0
- package/dist/core/ingestion/utils/line-base.js +14 -0
- package/dist/core/ingestion/utils/method-props.d.ts +27 -4
- package/dist/core/ingestion/utils/method-props.js +29 -4
- package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
- package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
- package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
- package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
- package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
- package/dist/core/ingestion/utils/template-arguments.js +196 -0
- package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
- package/dist/core/ingestion/utils/type-parameters.js +206 -0
- package/dist/core/ingestion/workers/callable-id.d.ts +72 -0
- package/dist/core/ingestion/workers/callable-id.js +116 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
- package/dist/core/ingestion/workers/parse-worker.js +409 -39
- package/dist/core/ingestion/workers/worker-pool.d.ts +34 -27
- package/dist/core/ingestion/workers/worker-pool.js +133 -25
- package/dist/core/lbug/csv-generator.d.ts +27 -0
- package/dist/core/lbug/csv-generator.js +80 -17
- package/dist/core/lbug/extension-load-error.d.ts +2 -2
- package/dist/core/lbug/extension-load-error.js +44 -27
- package/dist/core/lbug/extension-loader.d.ts +29 -0
- package/dist/core/lbug/extension-loader.js +32 -7
- package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
- package/dist/core/lbug/graph-emit-sink.js +581 -0
- package/dist/core/lbug/lbug-adapter.d.ts +337 -3
- package/dist/core/lbug/lbug-adapter.js +772 -67
- package/dist/core/lbug/lbug-config.d.ts +93 -6
- package/dist/core/lbug/lbug-config.js +269 -9
- package/dist/core/lbug/native-check.d.ts +39 -0
- package/dist/core/lbug/native-check.js +323 -46
- package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
- package/dist/core/lbug/pdg-emit-sink.js +21 -111
- package/dist/core/lbug/pool-adapter.d.ts +23 -1
- package/dist/core/lbug/pool-adapter.js +115 -7
- package/dist/core/lbug/query-batch.d.ts +75 -0
- package/dist/core/lbug/query-batch.js +102 -0
- package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
- package/dist/core/lbug/rel-pair-routing.js +228 -10
- package/dist/core/lbug/schema.d.ts +162 -3
- package/dist/core/lbug/schema.js +392 -157
- package/dist/core/lbug/sidecar-recovery.d.ts +1 -0
- package/dist/core/lbug/sidecar-recovery.js +1 -1
- package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
- package/dist/core/lbug/sync-csv-writer.js +108 -0
- package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
- package/dist/core/platform/capabilities.d.ts +0 -1
- package/dist/core/platform/capabilities.js +12 -7
- package/dist/core/run-analyze.d.ts +150 -3
- package/dist/core/run-analyze.js +1562 -151
- package/dist/core/search/bm25-index.d.ts +11 -0
- package/dist/core/search/bm25-index.js +60 -26
- package/dist/core/search/fts-indexes.d.ts +167 -2
- package/dist/core/search/fts-indexes.js +264 -10
- package/dist/core/wiki/graph-queries.js +145 -112
- package/dist/core/wiki/llm-client.d.ts +37 -5
- package/dist/core/wiki/llm-client.js +88 -17
- package/dist/core/wiki/prompts.d.ts +19 -0
- package/dist/core/wiki/prompts.js +20 -1
- package/dist/lib/utils.d.ts +113 -0
- package/dist/lib/utils.js +185 -0
- package/dist/mcp/http-transport.d.ts +5 -0
- package/dist/mcp/http-transport.js +19 -5
- package/dist/mcp/local/aop-metadata.d.ts +77 -0
- package/dist/mcp/local/aop-metadata.js +227 -0
- package/dist/mcp/local/bean-metadata.d.ts +3 -0
- package/dist/mcp/local/bean-metadata.js +46 -0
- package/dist/mcp/local/local-backend.d.ts +167 -6
- package/dist/mcp/local/local-backend.js +1756 -405
- package/dist/mcp/local/path-predicate.d.ts +19 -0
- package/dist/mcp/local/path-predicate.js +21 -0
- package/dist/mcp/local/pdg-impact.d.ts +132 -10
- package/dist/mcp/local/pdg-impact.js +391 -98
- package/dist/mcp/output-budget.d.ts +5 -0
- package/dist/mcp/output-budget.js +52 -0
- package/dist/mcp/read-only-policy.d.ts +12 -0
- package/dist/mcp/read-only-policy.js +102 -0
- package/dist/mcp/repository-policy.d.ts +35 -0
- package/dist/mcp/repository-policy.js +333 -0
- package/dist/mcp/resources.js +34 -7
- package/dist/mcp/server.d.ts +5 -2
- package/dist/mcp/server.js +48 -18
- package/dist/mcp/tools.d.ts +8 -8
- package/dist/mcp/tools.js +91 -20
- package/dist/server/analyze-job.d.ts +40 -2
- package/dist/server/analyze-job.js +30 -2
- package/dist/server/analyze-launch.d.ts +1 -1
- package/dist/server/analyze-launch.js +79 -10
- package/dist/server/analyze-worker-core.d.ts +3 -2
- package/dist/server/analyze-worker-core.js +15 -3
- package/dist/server/analyze-worker-ipc.d.ts +1 -1
- package/dist/server/analyze-worker-ipc.js +4 -0
- package/dist/server/analyze-worker-protocol.d.ts +59 -0
- package/dist/server/analyze-worker-protocol.js +1 -0
- package/dist/server/analyze-worker.d.ts +1 -17
- package/dist/server/analyze-worker.js +29 -6
- package/dist/server/api.d.ts +2 -11
- package/dist/server/api.js +200 -155
- package/dist/server/embed-run-outcome.d.ts +89 -0
- package/dist/server/embed-run-outcome.js +88 -0
- package/dist/server/git-clone.js +6 -2
- package/dist/server/mcp-http.d.ts +1 -1
- package/dist/server/mcp-http.js +4 -2
- package/dist/server/middleware.d.ts +116 -9
- package/dist/server/middleware.js +291 -22
- package/dist/server/sse-progress.d.ts +41 -0
- package/dist/server/sse-progress.js +125 -0
- package/dist/server/upload-ingest.js +2 -1
- package/dist/server/validation.js +2 -1
- package/dist/storage/branch-index.d.ts +11 -6
- package/dist/storage/branch-index.js +15 -7
- package/dist/storage/file-hash.js +2 -2
- package/dist/storage/fs-atomic.d.ts +25 -0
- package/dist/storage/fs-atomic.js +42 -0
- package/dist/storage/git.d.ts +165 -0
- package/dist/storage/git.js +352 -3
- package/dist/storage/index-lock.d.ts +83 -0
- package/dist/storage/index-lock.js +654 -0
- package/dist/storage/parse-cache.js +482 -1
- package/dist/storage/parsedfile-store.d.ts +8 -0
- package/dist/storage/parsedfile-store.js +235 -1
- package/dist/storage/repo-manager.d.ts +29 -309
- package/dist/storage/repo-manager.js +187 -165
- package/dist/storage/repo-meta.d.ts +530 -0
- package/dist/storage/repo-meta.js +100 -0
- package/dist/types/pipeline.d.ts +37 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
- package/hooks/claude/gitnexus-hook.cjs +1 -1
- package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
- package/package.json +20 -12
- package/scripts/cross-platform-shard.ts +143 -0
- package/scripts/cross-platform-tests.ts +94 -0
- package/scripts/ensure-fts.ts +14 -3
- package/scripts/run-cross-platform.ts +36 -10
- package/scripts/sync-plugin-manifests.mjs +192 -0
- package/skills/gitnexus-cli.md +3 -3
- package/skills/gitnexus-debugging.md +37 -7
- package/skills/gitnexus-exploring.md +26 -4
- package/skills/gitnexus-impact-analysis.md +71 -10
- package/skills/gitnexus-lfg/README.md +55 -0
- package/skills/gitnexus-lfg/SKILL.md +86 -0
- package/skills/gitnexus-plan/README.md +147 -0
- package/skills/gitnexus-plan/SKILL.md +348 -0
- package/skills/gitnexus-plan/references/context-ledger.md +137 -0
- package/skills/gitnexus-plan/references/context-pack.md +126 -0
- package/skills/gitnexus-plan/references/evidence-provenance.md +309 -0
- package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
- package/skills/gitnexus-plan/references/plan-template.md +201 -0
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2366 -0
- package/skills/gitnexus-refactoring.md +48 -5
- package/skills/gitnexus-review/SKILL.md +279 -0
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
- package/skills/gitnexus-taint-analysis.md +13 -7
- package/skills/gitnexus-work/README.md +71 -0
- package/skills/gitnexus-work/SKILL.md +272 -0
- package/skills/gitnexus-work/references/evidence-provenance.md +309 -0
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2366 -0
- package/vendor/leiden/utils.cjs +28 -1
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
- package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
- package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
- package/web/assets/agent-DIzEQ1JJ.js +626 -0
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
- package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +132 -0
- package/web/assets/{c4Diagram-Y2BXMSZH-DOXVs7-C.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +6 -6
- package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
- package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
- package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
- package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
- package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
- package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
- package/web/assets/chunk-6L755F7B-CMhLBxi2.js +1 -0
- package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +2 -0
- package/web/assets/chunk-A7VWPJGB-B4O3oQdQ.js +1 -0
- package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
- package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
- package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
- package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
- package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
- package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
- package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
- package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
- package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
- package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
- package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
- package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
- package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
- package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
- package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
- package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
- package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
- package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
- package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +70 -0
- package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +231 -0
- package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
- package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
- package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
- package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
- package/web/assets/chunk-VJFVEZTB-CX66F2ep.js +206 -0
- package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
- package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
- package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
- package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
- package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
- package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
- package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
- package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
- package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
- package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
- package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
- package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +3 -0
- package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
- package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
- package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
- package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
- package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
- package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
- package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
- package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
- package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
- package/web/assets/{index-B4eB4dNZ.js → index-BBNl0qfX.js} +51 -51
- package/web/assets/index-CJDpyH-n.css +2 -0
- package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
- package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-BLjivjXL.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +6 -6
- package/web/assets/{journeyDiagram-M6C3CM3L-Cetgs3NH.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +6 -6
- package/web/assets/{kanban-definition-75IXJCU3-DMlCaIpf.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +27 -27
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
- package/web/assets/{mindmap-definition-2TDM6QVE-B4GbXQBc.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +29 -29
- package/web/assets/node-Ct_zna8U.js +8 -0
- package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
- package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
- package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
- package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
- package/web/assets/preload-helper-Czpn1I53.js +1 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-B1TQnlm0.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +6 -6
- package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
- package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
- package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
- package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
- package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
- package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
- package/web/assets/requirementDiagram-RASO5HTO-B-l8InpK.js +84 -0
- package/web/assets/sankeyDiagram-F32LOJ6L-Kd7zjJgX.js +40 -0
- package/web/assets/sdk-CzHHH8tD.js +37 -0
- package/web/assets/sequenceDiagram-URATNSBD-BlcdY9DS.js +162 -0
- package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
- package/web/assets/src-C5sx_gMp.js +1 -0
- package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
- package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
- package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
- package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
- package/web/assets/timeline-definition-WJXWRH4I-DUfp1R3E.js +120 -0
- package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
- package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
- package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
- package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
- package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
- package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
- package/web/index.html +17 -15
- package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
- package/dist/core/ingestion/languages/python/index-stats.js +0 -25
- package/skills/gitnexus-pr-review.md +0 -163
- package/web/assets/ProcessFlowModal-Dna7GkwO.js +0 -22
- package/web/assets/agent-DNYDy-KA.js +0 -660
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-BU5ZRITg.js +0 -36
- package/web/assets/blockDiagram-7IZFK4PR-Dut1BpTV.js +0 -132
- package/web/assets/chunk-2T2R6R2M-pkw2oXHH.js +0 -4
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
- package/web/assets/chunk-67TQ5CYL-zxhDWgyF.js +0 -124
- package/web/assets/chunk-7J6CGLKN-AmkN8jJN.js +0 -10
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
- package/web/assets/chunk-INKRHTLW-D9BM9HWZ.js +0 -70
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
- package/web/assets/chunk-KGFNY3KK-tD2F6wxK.js +0 -62
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
- package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
- package/web/assets/chunk-LCXTWHL2-Ba9JK-6F.js +0 -231
- package/web/assets/chunk-LII3EMHJ-EGx-eBIu.js +0 -1
- package/web/assets/chunk-LRIF4GLE-C3_PqUBq.js +0 -1
- package/web/assets/chunk-QA3QBVWF-D4cSJBf6.js +0 -2
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
- package/web/assets/chunk-RG4AUYOV-OqBBMwuQ.js +0 -206
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
- package/web/assets/chunk-T2UQINTJ-BJusEiGe.js +0 -1
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
- package/web/assets/chunk-UY5QBCOK-BCpUlARQ.js +0 -1
- package/web/assets/chunk-VU6ZFW4Y-BeXVk45_.js +0 -2
- package/web/assets/chunk-ZXARS5L4-BI_qR2Nm.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-D9zSIg0x.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-D9zSIg0x.js +0 -1
- package/web/assets/dagre-ND4H6XIP-CpcV5kbl.js +0 -4
- package/web/assets/diagram-3NCE3AQN-6SMxBRpj.js +0 -43
- package/web/assets/diagram-GF46GFSD-BZEdNcRZ.js +0 -24
- package/web/assets/diagram-HNR7UZ2L-DxKW2a2Y.js +0 -3
- package/web/assets/diagram-QXG6HAR7-HfTHcXX_.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-CyijUS8r.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-D0fvpWEX.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-Bvr9bbhk.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-TzODrLzv.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-ONQSwJIY.js +0 -106
- package/web/assets/index-CX_fADmQ.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-DIPVUIQ6.js +0 -2
- package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-D3YC_xyg.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
- package/web/assets/requirementDiagram-JXO7QTGE-f8wczLQf.js +0 -84
- package/web/assets/sankeyDiagram-URQDO5SZ-BTxzG5j0.js +0 -40
- package/web/assets/sequenceDiagram-VS2MUI6T-DuamM-IR.js +0 -162
- package/web/assets/src-BNCXICdA.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-Ch2pEUcw.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-7ANuoZLL.js +0 -1
- package/web/assets/timeline-definition-O6YCAMPW-07BR8R8G.js +0 -120
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-BQX2ossk.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-CGIJBBiK.js +0 -78
- package/web/assets/xychartDiagram-N2JHSOCM-B3HNMuWp.js +0 -7
- /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
|
@@ -34,9 +34,24 @@
|
|
|
34
34
|
* as `ownedDefs` + a local `BindingRef { origin: 'local' }`.
|
|
35
35
|
* 3. **Collect raw imports.** Walk `@import.*` matches. Call
|
|
36
36
|
* `provider.interpretImport` per match; attach the returned
|
|
37
|
-
* `ParsedImport` to the ParsedFile
|
|
38
|
-
*
|
|
39
|
-
*
|
|
37
|
+
* `ParsedImport` to the ParsedFile — not to any `Scope`.
|
|
38
|
+
* `provider.importOwningScope` is declared on `LanguageProvider` and
|
|
39
|
+
* implemented by a dozen providers, but has no call site anywhere; this
|
|
40
|
+
* step's output is a flat per-file list.
|
|
41
|
+
*
|
|
42
|
+
* One scope fact is read before that list flattens it away:
|
|
43
|
+
* `runsOnlyWhenCalled`, set when the statement sits anywhere inside a
|
|
44
|
+
* `Function`. It is decided here because here is the last stage that can
|
|
45
|
+
* — finalize receives the flat list, and its consumer receives a map
|
|
46
|
+
* keyed by the file's Module scope only (see
|
|
47
|
+
* `ParsedImport.runsOnlyWhenCalled`). This is a position fact, not a
|
|
48
|
+
* syntax one, so it is decided centrally for every language rather than
|
|
49
|
+
* per provider — with one capability a provider may declare to opt out
|
|
50
|
+
* of it entirely, `importsExecuteWhereWritten: false`, because position
|
|
51
|
+
* cannot defer an import that never executes (C/C++ `#include`, Rust
|
|
52
|
+
* `use`, COBOL `COPY`). Providers still decide their own *syntactic* nesting
|
|
53
|
+
* facts in their capture emitters, where the node is in hand (see
|
|
54
|
+
* `languages/python/import-decomposer.ts`).
|
|
40
55
|
* 4. **Collect type bindings.** Walk `@type-binding.*` matches. Call
|
|
41
56
|
* `provider.interpretTypeBinding` per match. Attach the resulting
|
|
42
57
|
* `TypeRef` to the innermost containing scope's `typeBindings`
|
|
@@ -59,7 +74,9 @@
|
|
|
59
74
|
* - `ParsedFile.referenceSites` — pre-resolution usage facts.
|
|
60
75
|
*/
|
|
61
76
|
import { buildPositionIndex, buildScopeTree, canParentScope, makeScopeId } from '../../_shared/index.js';
|
|
62
|
-
import {
|
|
77
|
+
import { isValidReceiverChain } from './utils/receiver-chain-codec.js';
|
|
78
|
+
import { extractTemplateArguments, stripTrailingCallSuffix, typeApplicationArguments, } from './utils/template-arguments.js';
|
|
79
|
+
import { parseTypeParameterList } from './utils/type-parameters.js';
|
|
63
80
|
// ─── Public entry point ─────────────────────────────────────────────────────
|
|
64
81
|
/**
|
|
65
82
|
* Drive the five extraction passes and return a `ParsedFile`.
|
|
@@ -84,7 +101,11 @@ export function extract(matches, filePath, provider) {
|
|
|
84
101
|
for (let i = 0; i < scopeDrafts.length; i++) {
|
|
85
102
|
const d = scopeDrafts[i];
|
|
86
103
|
if (d.parent === null && d.kind !== 'Module') {
|
|
87
|
-
|
|
104
|
+
// `ownsReceivers` must be carried across: it is decided from the scope's
|
|
105
|
+
// own capture in pass 1 and re-parenting does not change what the scope
|
|
106
|
+
// binds. Dropping it here would silently un-mark every function scope in
|
|
107
|
+
// a file whose root parsed as ERROR (the only way a scope is orphaned).
|
|
108
|
+
scopeDrafts[i] = makeDraft(d.id, moduleScope.id, d.kind, d.range, d.filePath, d.ownsReceivers, d.lexicalNames);
|
|
88
109
|
}
|
|
89
110
|
}
|
|
90
111
|
const scopes = scopeDrafts.map(draftToScope);
|
|
@@ -105,12 +126,17 @@ export function extract(matches, filePath, provider) {
|
|
|
105
126
|
pass2AttachDeclarations(partitioned.declaration, scopeDrafts, positionIndex, localDefs, filePath, provider, scopeTree);
|
|
106
127
|
// ── Pass 3: collect raw imports ─────────────────────────────────────
|
|
107
128
|
const parsedImports = [];
|
|
108
|
-
pass3CollectImports(partitioned.import_, parsedImports, provider);
|
|
129
|
+
pass3CollectImports(partitioned.import_, positionIndex, filePath, parsedImports, provider, scopeTree);
|
|
109
130
|
// ── Pass 4: collect type bindings ───────────────────────────────────
|
|
110
131
|
pass4CollectTypeBindings(partitioned.typeBinding, scopeDrafts, positionIndex, filePath, provider, scopeTree);
|
|
111
132
|
// ── Pass 5: collect reference sites ─────────────────────────────────
|
|
112
133
|
const referenceSites = [];
|
|
113
134
|
pass5CollectReferences(partitioned.reference, positionIndex, filePath, referenceSites, provider, scopeTree);
|
|
135
|
+
// ── Pass 6: collect normalized callable-value-flow facts ───────────
|
|
136
|
+
// Kept after (and independent from) Pass 5 so existing reference-site
|
|
137
|
+
// extraction remains byte-identical.
|
|
138
|
+
const callableFlowSites = [];
|
|
139
|
+
pass6CollectCallableFlows(partitioned.callableFlow, positionIndex, filePath, callableFlowSites);
|
|
114
140
|
// Freeze Scope drafts into final shape and return.
|
|
115
141
|
const frozenScopes = scopeDrafts.map(draftToScope);
|
|
116
142
|
return Object.freeze({
|
|
@@ -120,12 +146,15 @@ export function extract(matches, filePath, provider) {
|
|
|
120
146
|
parsedImports: Object.freeze(parsedImports.slice()),
|
|
121
147
|
localDefs: Object.freeze(localDefs.slice()),
|
|
122
148
|
referenceSites: Object.freeze(referenceSites.slice()),
|
|
149
|
+
...(callableFlowSites.length > 0
|
|
150
|
+
? { callableFlowSites: Object.freeze(callableFlowSites.slice()) }
|
|
151
|
+
: {}),
|
|
123
152
|
});
|
|
124
153
|
}
|
|
125
154
|
/**
|
|
126
|
-
* Bucket each match by
|
|
127
|
-
*
|
|
128
|
-
*
|
|
155
|
+
* Bucket each match by every topic represented by its anchor captures. An
|
|
156
|
+
* emitter may deliberately group a lexical scope and its declaration in one
|
|
157
|
+
* match so both passes observe the exact same source range.
|
|
129
158
|
*
|
|
130
159
|
* A match may contain additional captures (e.g., `@import.source`,
|
|
131
160
|
* `@declaration.class.name`) that are used by the provider hooks to
|
|
@@ -138,49 +167,50 @@ function partitionByTopic(matches) {
|
|
|
138
167
|
const import_ = [];
|
|
139
168
|
const typeBinding = [];
|
|
140
169
|
const reference = [];
|
|
170
|
+
const callableFlow = [];
|
|
141
171
|
for (const match of matches) {
|
|
142
|
-
const topic
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
172
|
+
for (const topic of topicsOf(match)) {
|
|
173
|
+
switch (topic) {
|
|
174
|
+
case 'scope':
|
|
175
|
+
scope.push(match);
|
|
176
|
+
break;
|
|
177
|
+
case 'declaration':
|
|
178
|
+
declaration.push(match);
|
|
179
|
+
break;
|
|
180
|
+
case 'import':
|
|
181
|
+
import_.push(match);
|
|
182
|
+
break;
|
|
183
|
+
case 'type-binding':
|
|
184
|
+
typeBinding.push(match);
|
|
185
|
+
break;
|
|
186
|
+
case 'reference':
|
|
187
|
+
reference.push(match);
|
|
188
|
+
break;
|
|
189
|
+
case 'callable-flow':
|
|
190
|
+
callableFlow.push(match);
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
163
193
|
}
|
|
164
194
|
}
|
|
165
|
-
return { scope, declaration, import_, typeBinding, reference };
|
|
195
|
+
return { scope, declaration, import_, typeBinding, reference, callableFlow };
|
|
166
196
|
}
|
|
167
|
-
function
|
|
168
|
-
|
|
169
|
-
// prefixes. For multi-capture matches, ALL captures share the topic;
|
|
170
|
-
// we pick the first matching key for efficiency.
|
|
197
|
+
function topicsOf(match) {
|
|
198
|
+
const topics = new Set();
|
|
171
199
|
for (const name of Object.keys(match)) {
|
|
172
200
|
if (name.startsWith('@scope.'))
|
|
173
|
-
|
|
174
|
-
if (name.startsWith('@declaration.'))
|
|
175
|
-
|
|
176
|
-
if (name.startsWith('@import.'))
|
|
177
|
-
|
|
178
|
-
if (name.startsWith('@type-binding.'))
|
|
179
|
-
|
|
180
|
-
if (name.startsWith('@reference.'))
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
201
|
+
topics.add('scope');
|
|
202
|
+
else if (name.startsWith('@declaration.'))
|
|
203
|
+
topics.add('declaration');
|
|
204
|
+
else if (name.startsWith('@import.'))
|
|
205
|
+
topics.add('import');
|
|
206
|
+
else if (name.startsWith('@type-binding.'))
|
|
207
|
+
topics.add('type-binding');
|
|
208
|
+
else if (name.startsWith('@reference.'))
|
|
209
|
+
topics.add('reference');
|
|
210
|
+
else if (name.startsWith('@callable-flow.'))
|
|
211
|
+
topics.add('callable-flow');
|
|
212
|
+
}
|
|
213
|
+
return topics;
|
|
184
214
|
}
|
|
185
215
|
function ensureModuleScope(scopeDrafts, filePath, allMatches) {
|
|
186
216
|
const moduleScope = scopeDrafts.find((s) => s.kind === 'Module');
|
|
@@ -221,6 +251,8 @@ function draftToScope(draft) {
|
|
|
221
251
|
ownedDefs: Object.freeze(draft.ownedDefs.slice()),
|
|
222
252
|
imports: Object.freeze(draft.imports.slice()),
|
|
223
253
|
typeBindings: new Map(draft.typeBindings),
|
|
254
|
+
lexicalNames: draft.lexicalNames,
|
|
255
|
+
ownsReceivers: draft.ownsReceivers,
|
|
224
256
|
};
|
|
225
257
|
}
|
|
226
258
|
// ─── Pass 1: build scope tree ──────────────────────────────────────────────
|
|
@@ -274,7 +306,7 @@ function pass1BuildScopes(matches, filePath, provider) {
|
|
|
274
306
|
stack.pop();
|
|
275
307
|
}
|
|
276
308
|
const parent = stack.length > 0 ? stack[stack.length - 1].id : null;
|
|
277
|
-
drafts.push(makeDraft(cand.id, parent, cand.kind, cand.range, filePath));
|
|
309
|
+
drafts.push(makeDraft(cand.id, parent, cand.kind, cand.range, filePath, provider.scopeOwnsReceivers?.(cand.match), parseScopeLexicalNames(cand.match)));
|
|
278
310
|
stack.push(cand);
|
|
279
311
|
}
|
|
280
312
|
return drafts;
|
|
@@ -299,11 +331,13 @@ function resolveKindForScopeMatch(match, anchor, provider) {
|
|
|
299
331
|
return 'Block';
|
|
300
332
|
case 'expression':
|
|
301
333
|
return 'Expression';
|
|
334
|
+
case 'object':
|
|
335
|
+
return 'Object';
|
|
302
336
|
default:
|
|
303
337
|
return null;
|
|
304
338
|
}
|
|
305
339
|
}
|
|
306
|
-
function makeDraft(id, parent, kind, range, filePath) {
|
|
340
|
+
function makeDraft(id, parent, kind, range, filePath, ownsReceivers, lexicalNames) {
|
|
307
341
|
return {
|
|
308
342
|
id,
|
|
309
343
|
parent,
|
|
@@ -314,13 +348,35 @@ function makeDraft(id, parent, kind, range, filePath) {
|
|
|
314
348
|
ownedDefs: [],
|
|
315
349
|
imports: [],
|
|
316
350
|
typeBindings: new Map(),
|
|
351
|
+
lexicalNames,
|
|
352
|
+
ownsReceivers,
|
|
317
353
|
};
|
|
318
354
|
}
|
|
355
|
+
function parseScopeLexicalNames(match) {
|
|
356
|
+
const raw = match['@scope.lexical-names']?.text;
|
|
357
|
+
if (raw === undefined)
|
|
358
|
+
return undefined;
|
|
359
|
+
try {
|
|
360
|
+
const parsed = JSON.parse(raw);
|
|
361
|
+
if (!Array.isArray(parsed))
|
|
362
|
+
return undefined;
|
|
363
|
+
const names = parsed.filter((name) => typeof name === 'string' && name.length > 0);
|
|
364
|
+
return names.length > 0 ? new Set(names) : undefined;
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
return undefined;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
319
370
|
// ─── Pass 2: attach declarations + local bindings ──────────────────────────
|
|
320
371
|
function pass2AttachDeclarations(matches, drafts, positionIndex, localDefs, filePath, provider, scopeTree) {
|
|
321
372
|
const draftById = new Map();
|
|
322
373
|
for (const d of drafts)
|
|
323
374
|
draftById.set(d.id, d);
|
|
375
|
+
// First def seen per `nodeId`, for the duplicate backfill below. Two query
|
|
376
|
+
// patterns can legitimately match ONE declaration — a C++ templated struct
|
|
377
|
+
// matches both the standalone `struct_specifier` rule and the
|
|
378
|
+
// `template_declaration` rule that wraps it — and both mint the same def id.
|
|
379
|
+
const firstDefByNodeId = new Map();
|
|
324
380
|
for (const match of matches) {
|
|
325
381
|
const anchor = anchorCaptureFor(match, '@declaration.');
|
|
326
382
|
if (anchor === undefined)
|
|
@@ -328,6 +384,32 @@ function pass2AttachDeclarations(matches, drafts, positionIndex, localDefs, file
|
|
|
328
384
|
const def = buildDefFromDeclarationMatch(match, anchor, filePath);
|
|
329
385
|
if (def === undefined)
|
|
330
386
|
continue;
|
|
387
|
+
// ── Duplicate-declaration backfill ───────────────────────────────────────
|
|
388
|
+
// `buildDefIndex` is FIRST-WRITE-WINS, so when one declaration produces two
|
|
389
|
+
// defs under one id, whichever match tree-sitter reported first is the one
|
|
390
|
+
// resolution sees. That was harmless while the twins were byte-identical.
|
|
391
|
+
// It stops being harmless the moment one twin can carry a field the other
|
|
392
|
+
// structurally cannot: a C++ `template <class T> struct Vec` has its
|
|
393
|
+
// parameter list on the ENCLOSING `template_declaration`, so the standalone
|
|
394
|
+
// `struct_specifier` twin can never see it, and match order would silently
|
|
395
|
+
// decide whether `Vec` remembers `T`. Source order deciding a resolution
|
|
396
|
+
// fact is the failure mode this subsystem rejects everywhere else.
|
|
397
|
+
//
|
|
398
|
+
// Copying the field onto BOTH twins makes the outcome identical whichever
|
|
399
|
+
// one wins. Deliberately narrow — only `typeParameters`, the one field with
|
|
400
|
+
// an asymmetric twin today. Widening this to "merge all metadata" would
|
|
401
|
+
// change what every existing duplicate resolves to, which is a different
|
|
402
|
+
// change with a different blast radius and no evidence behind it yet.
|
|
403
|
+
const first = firstDefByNodeId.get(def.nodeId);
|
|
404
|
+
if (first === undefined) {
|
|
405
|
+
firstDefByNodeId.set(def.nodeId, def);
|
|
406
|
+
}
|
|
407
|
+
else if (first.typeParameters === undefined && def.typeParameters !== undefined) {
|
|
408
|
+
first.typeParameters = def.typeParameters;
|
|
409
|
+
}
|
|
410
|
+
else if (def.typeParameters === undefined && first.typeParameters !== undefined) {
|
|
411
|
+
def.typeParameters = first.typeParameters;
|
|
412
|
+
}
|
|
331
413
|
// Find the innermost scope that contains the declaration's anchor range.
|
|
332
414
|
const innermostId = positionIndex.atPosition(filePath, anchor.range.startLine, anchor.range.startCol);
|
|
333
415
|
if (innermostId === undefined)
|
|
@@ -398,8 +480,15 @@ function buildDefFromDeclarationMatch(match, anchor, filePath) {
|
|
|
398
480
|
const declaredType = match['@declaration.field-type']?.text;
|
|
399
481
|
const returnType = match['@declaration.return-type']?.text;
|
|
400
482
|
const templateConstraints = parseJsonCapture(match['@declaration.template-constraints']);
|
|
483
|
+
// The DECLARED parameters, a different axis from `templateArguments` above:
|
|
484
|
+
// that reads the arguments written on the name, this reads the list the
|
|
485
|
+
// declaration was written in terms of. A declaration can carry both, and for a
|
|
486
|
+
// C++ partial specialization the pairing is the only thing that tells it apart
|
|
487
|
+
// from a full specialization with the identical arguments.
|
|
488
|
+
const typeParameters = parseTypeParameterList(match['@declaration.type-parameters']?.text ?? '');
|
|
401
489
|
const isExplicit = parseBooleanCapture(match['@declaration.is-explicit']);
|
|
402
490
|
const isDeleted = parseBooleanCapture(match['@declaration.is-deleted']);
|
|
491
|
+
const isSynthetic = parseBooleanCapture(match['@declaration.is-synthetic']);
|
|
403
492
|
return {
|
|
404
493
|
nodeId: makeDefId(filePath, anchor.range, type, nameCap.text),
|
|
405
494
|
filePath,
|
|
@@ -412,9 +501,11 @@ function buildDefFromDeclarationMatch(match, anchor, filePath) {
|
|
|
412
501
|
...(declaredType !== undefined ? { declaredType } : {}),
|
|
413
502
|
...(returnType !== undefined ? { returnType } : {}),
|
|
414
503
|
...(templateArguments !== undefined ? { templateArguments } : {}),
|
|
504
|
+
...(typeParameters !== undefined ? { typeParameters } : {}),
|
|
415
505
|
...(templateConstraints !== undefined ? { templateConstraints } : {}),
|
|
416
506
|
...(isExplicit === true ? { isExplicit: true } : {}),
|
|
417
507
|
...(isDeleted === true ? { isDeleted: true } : {}),
|
|
508
|
+
...(isSynthetic === true ? { isSynthetic: true } : {}),
|
|
418
509
|
};
|
|
419
510
|
}
|
|
420
511
|
/** Parse an opaque JSON payload synthesized by per-language captures
|
|
@@ -511,7 +602,8 @@ function parseJsonStringArrayCapture(cap) {
|
|
|
511
602
|
}
|
|
512
603
|
}
|
|
513
604
|
function deriveDeclarationName(match, def) {
|
|
514
|
-
const nameCap = match['@declaration.name'] ??
|
|
605
|
+
const nameCap = match['@declaration.binding-name'] ??
|
|
606
|
+
match['@declaration.name'] ??
|
|
515
607
|
match[Object.keys(match).find((k) => k.startsWith('@declaration.') && k.endsWith('.name')) ?? ''];
|
|
516
608
|
if (nameCap !== undefined)
|
|
517
609
|
return nameCap.text;
|
|
@@ -574,6 +666,8 @@ function normalizeNodeLabel(kindStr) {
|
|
|
574
666
|
return 'Annotation';
|
|
575
667
|
case 'namespace':
|
|
576
668
|
return 'Namespace';
|
|
669
|
+
case 'program':
|
|
670
|
+
return 'Module';
|
|
577
671
|
case 'macro':
|
|
578
672
|
return 'Macro';
|
|
579
673
|
default:
|
|
@@ -637,9 +731,74 @@ function makeDefId(filePath, range, type, name) {
|
|
|
637
731
|
return `def:${filePath}#${range.startLine}:${range.startCol}:${type}:${name}`;
|
|
638
732
|
}
|
|
639
733
|
// ─── Pass 3: collect raw imports ───────────────────────────────────────────
|
|
640
|
-
|
|
734
|
+
/**
|
|
735
|
+
* Does this import run only when something calls the function it sits in?
|
|
736
|
+
*
|
|
737
|
+
* Walks the scope chain to the file root rather than reading the immediate
|
|
738
|
+
* kind, because the immediate kind is not enough in either direction. A `Block`
|
|
739
|
+
* at the top of a module (`if (FLAG) { require('./x'); }`) runs during
|
|
740
|
+
* initialization; the same `Block` inside a function does not. `Class`,
|
|
741
|
+
* `Namespace`, `Expression` and `Object` bodies execute where they are defined,
|
|
742
|
+
* so they are initialization-time too. Only an enclosing `Function` — anywhere
|
|
743
|
+
* up the chain — defers execution.
|
|
744
|
+
*
|
|
745
|
+
* Language-agnostic on purpose: it is what catches Python's
|
|
746
|
+
* `def f(): from x import Y`, Ruby's `def f; require 'x'; end` and a CommonJS
|
|
747
|
+
* `require()` in a function body, none of which any `kind` marks as deferred —
|
|
748
|
+
* only their position says it.
|
|
749
|
+
*
|
|
750
|
+
* The rule is about EXECUTION, so it does not hold for a language whose
|
|
751
|
+
* imports are not executed statements at all — a C/C++ `#include` (spliced by
|
|
752
|
+
* the preprocessor before the program runs) or a Rust `use` (a compile-time
|
|
753
|
+
* path alias). Both are legal inside a function body and neither is deferred
|
|
754
|
+
* by sitting there, so a cycle they form is REAL. Marking one deferred would
|
|
755
|
+
* make `check --cycles` drop that cycle, and suppressing a true cycle is the
|
|
756
|
+
* failure direction that matters. Such a language opts out by declaring
|
|
757
|
+
* `LanguageProvider.importsExecuteWhereWritten: false`, checked by the caller
|
|
758
|
+
* — the capability is named on the provider rather than the language being
|
|
759
|
+
* named here, because shared ingestion code must not branch on language
|
|
760
|
+
* (AGENTS.md).
|
|
761
|
+
*
|
|
762
|
+
* Decided HERE and nowhere later because this is the last stage that knows the
|
|
763
|
+
* answer — see `ParsedImport.runsOnlyWhenCalled` for why finalize and the graph
|
|
764
|
+
* bridge cannot recover it.
|
|
765
|
+
*/
|
|
766
|
+
function runsOnlyWhenCalled(scopeTree, scopeId) {
|
|
767
|
+
// Inline rather than `utils/scope-tree-walk.ts`'s `walkToScope`, which is the
|
|
768
|
+
// shared primitive for exactly this climb and IS the right call everywhere it
|
|
769
|
+
// is used today — five `bindingScopeFor` hooks, all per-BINDING. This runs per
|
|
770
|
+
// IMPORT on every file of every analyze, and `walkToScope` takes `...kinds`
|
|
771
|
+
// and builds `new Set(kinds)` per call: measured on this host, 1.0 ns inline
|
|
772
|
+
// against 32.3 ns through the helper for the module-level case that is ~99% of
|
|
773
|
+
// imports, plus ~232 B of allocation each. Rewriting the helper's membership
|
|
774
|
+
// test as `kinds.includes` takes it to 8.8 ns — still 8x, because the rest
|
|
775
|
+
// array allocates regardless. Reuse loses to a two-field loop here; it would
|
|
776
|
+
// not on a colder path.
|
|
777
|
+
//
|
|
778
|
+
// No depth cap: the chain is acyclic by construction, since `buildScopeTree`
|
|
779
|
+
// only parents a scope to one that STRICTLY contains it.
|
|
780
|
+
let current = scopeId;
|
|
781
|
+
while (current !== null) {
|
|
782
|
+
const scope = scopeTree.getScope(current);
|
|
783
|
+
if (scope === undefined)
|
|
784
|
+
return false;
|
|
785
|
+
if (scope.kind === 'Function')
|
|
786
|
+
return true;
|
|
787
|
+
current = scope.parent;
|
|
788
|
+
}
|
|
789
|
+
return false;
|
|
790
|
+
}
|
|
791
|
+
function pass3CollectImports(matches, positionIndex, filePath, parsedImports, provider, scopeTree) {
|
|
641
792
|
if (provider.interpretImport === undefined)
|
|
642
793
|
return;
|
|
794
|
+
// Hoisted: the capability is a property of the language, identical for every
|
|
795
|
+
// match in the file. A provider that declares its imports do not execute
|
|
796
|
+
// where they are written (C/C++ `#include`, Rust `use`, COBOL `COPY`) skips
|
|
797
|
+
// the position walk entirely — position cannot defer something that never
|
|
798
|
+
// runs, and marking one deferred would hide a real cycle. Absent reads as
|
|
799
|
+
// `true`, so an undeclared provider is unchanged. See
|
|
800
|
+
// `LanguageProvider.importsExecuteWhereWritten`.
|
|
801
|
+
const positionCanDefer = provider.importsExecuteWhereWritten !== false;
|
|
643
802
|
for (const match of matches) {
|
|
644
803
|
const anchor = anchorCaptureFor(match, '@import.');
|
|
645
804
|
if (anchor === undefined)
|
|
@@ -647,10 +806,24 @@ function pass3CollectImports(matches, parsedImports, provider) {
|
|
|
647
806
|
const parsed = provider.interpretImport(match);
|
|
648
807
|
if (parsed === null)
|
|
649
808
|
continue;
|
|
650
|
-
|
|
809
|
+
// The statement's own position, resolved to the innermost scope holding
|
|
810
|
+
// it. An unlocatable anchor leaves the import unmarked, which reads as
|
|
811
|
+
// "runs at initialization" — the fail-safe direction, since it can only
|
|
812
|
+
// make `check --cycles` over-report.
|
|
813
|
+
const inScopeId = positionCanDefer
|
|
814
|
+
? positionIndex.atPosition(filePath, anchor.range.startLine, anchor.range.startCol)
|
|
815
|
+
: undefined;
|
|
816
|
+
const deferred = inScopeId !== undefined && runsOnlyWhenCalled(scopeTree, inScopeId);
|
|
817
|
+
parsedImports.push(deferred ? { ...parsed, runsOnlyWhenCalled: true } : parsed);
|
|
651
818
|
}
|
|
652
819
|
}
|
|
653
820
|
// ─── Pass 4: collect type bindings ─────────────────────────────────────────
|
|
821
|
+
/** Cap on the retained as-written annotation. Real container spellings are a
|
|
822
|
+
* handful of characters; a multi-line mapped/conditional type is neither a
|
|
823
|
+
* container any `elementTypeOf` parses nor worth keeping one copy of per
|
|
824
|
+
* binding on a kernel-scale repo. Over the cap the spelling is dropped, which
|
|
825
|
+
* makes an index step decline — the safe direction. */
|
|
826
|
+
const MAX_DECLARED_SPELLING_LENGTH = 256;
|
|
654
827
|
function pass4CollectTypeBindings(matches, drafts, positionIndex, filePath, provider, scopeTree) {
|
|
655
828
|
const draftById = new Map();
|
|
656
829
|
for (const d of drafts)
|
|
@@ -680,11 +853,39 @@ function pass4CollectTypeBindings(matches, drafts, positionIndex, filePath, prov
|
|
|
680
853
|
// `bindingScopeFor` may hoist the type binding to an outer scope.
|
|
681
854
|
const hostId = provider.bindingScopeFor?.(match, draftToScope(innermost), scopeTree) ?? autoHostedId;
|
|
682
855
|
const host = draftById.get(hostId) ?? innermost;
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
856
|
+
// The annotation as the source wrote it, kept only when the provider's
|
|
857
|
+
// interpretation is not already it. `interpretTypeBinding` normalizes
|
|
858
|
+
// container spellings away (`User[]` → `User`, `List[User]` → `User`,
|
|
859
|
+
// `[]*User` → `User`), which makes a reduced container indistinguishable
|
|
860
|
+
// from a class of the same name — and an index step folding on that
|
|
861
|
+
// ambiguity typed `grid[0]` as `Grid`. Read at the one place the
|
|
862
|
+
// distinction matters; see `TypeRef.declaredSpelling`.
|
|
863
|
+
//
|
|
864
|
+
// Read from the capture rather than from `ParsedTypeBinding` deliberately:
|
|
865
|
+
// `@type-binding.type` is the shared anchor EVERY provider already reads to
|
|
866
|
+
// build `rawTypeName`, so nothing has to be threaded through fourteen
|
|
867
|
+
// interpreters (and none can forget to).
|
|
868
|
+
// A provider may override when its grammar keeps part of the written type
|
|
869
|
+
// outside `@type-binding.type` (C++ hangs `*` on the declarator).
|
|
870
|
+
const writtenType = (parsed.declaredSpelling ?? match['@type-binding.type']?.text)?.trim();
|
|
871
|
+
const declaredSpelling = writtenType !== undefined &&
|
|
872
|
+
writtenType.length > 0 &&
|
|
873
|
+
writtenType.length <= MAX_DECLARED_SPELLING_LENGTH &&
|
|
874
|
+
writtenType !== parsed.rawTypeName
|
|
875
|
+
? writtenType
|
|
876
|
+
: undefined;
|
|
877
|
+
const typeRef = declaredSpelling === undefined
|
|
878
|
+
? {
|
|
879
|
+
rawName: parsed.rawTypeName,
|
|
880
|
+
declaredAtScope: host.id,
|
|
881
|
+
source: parsed.source,
|
|
882
|
+
}
|
|
883
|
+
: {
|
|
884
|
+
rawName: parsed.rawTypeName,
|
|
885
|
+
declaredSpelling,
|
|
886
|
+
declaredAtScope: host.id,
|
|
887
|
+
source: parsed.source,
|
|
888
|
+
};
|
|
688
889
|
// Prefer stronger sources when multiple matches fire for the same
|
|
689
890
|
// bound name in the same scope. Example: `u: User = find()` matches
|
|
690
891
|
// both the annotation and constructor-inferred patterns; the explicit
|
|
@@ -757,13 +958,15 @@ function followChainedRef(start, draftById) {
|
|
|
757
958
|
* name in the same scope. Higher number wins; ties keep the later match
|
|
758
959
|
* (last-write-wins preserves historical order within a tier).
|
|
759
960
|
*
|
|
760
|
-
* Rationale: explicit annotations always beat
|
|
761
|
-
*
|
|
762
|
-
*
|
|
961
|
+
* Rationale: explicit variable and field annotations always beat bindings
|
|
962
|
+
* derived from parameter annotations or inference because they reflect the
|
|
963
|
+
* most specific user intent. `self`/`cls` are treated as strongly as other
|
|
964
|
+
* declared types because they are language-required receiver types.
|
|
763
965
|
*/
|
|
764
966
|
function typeBindingStrength(source) {
|
|
765
967
|
switch (source) {
|
|
766
968
|
case 'annotation':
|
|
969
|
+
return 3;
|
|
767
970
|
case 'parameter-annotation':
|
|
768
971
|
case 'return-annotation':
|
|
769
972
|
case 'self':
|
|
@@ -791,6 +994,11 @@ function pass5CollectReferences(matches, positionIndex, filePath, referenceSites
|
|
|
791
994
|
// sibling via the full-path QualifiedNameIndex before the simple-tail walk
|
|
792
995
|
// (#1982). Absent for unqualified references — resolution stays unchanged.
|
|
793
996
|
const qualifiedCap = match['@reference.qualified-name'];
|
|
997
|
+
// Generic ARGUMENTS written on a heritage reference (`: IValidator<string>`);
|
|
998
|
+
// `inherits` only, because a call/read/write anchor spans the whole call
|
|
999
|
+
// expression, whose `<…>` would be an argument list, a comparison, or
|
|
1000
|
+
// nothing at all — widening the kind would mint confident nonsense (#2912).
|
|
1001
|
+
const typeArguments = kind === 'inherits' ? heritageTypeArguments(match, anchor, nameCap) : undefined;
|
|
794
1002
|
const inScopeId = positionIndex.atPosition(filePath, anchor.range.startLine, anchor.range.startCol);
|
|
795
1003
|
if (inScopeId === undefined)
|
|
796
1004
|
continue;
|
|
@@ -801,6 +1009,28 @@ function pass5CollectReferences(matches, positionIndex, filePath, referenceSites
|
|
|
801
1009
|
const arity = extractArity(match);
|
|
802
1010
|
const argumentTypes = extractArgumentTypes(match);
|
|
803
1011
|
const argumentTypeClasses = parseJsonParameterTypeClassesCapture(match['@reference.parameter-type-classes']);
|
|
1012
|
+
// Object-literal key for value-ref sites (`{ key: fn }` / shorthand);
|
|
1013
|
+
// consumed by the property-dispatch pass (#2437).
|
|
1014
|
+
const propertyKeyCap = match['@reference.property-key'];
|
|
1015
|
+
// Compact receiver chain, when the emitter produced one. Validated HERE as
|
|
1016
|
+
// well as at the store boundary: bounds applied only on load are a
|
|
1017
|
+
// recurring defect in this codebase — the writer keeps minting payloads the
|
|
1018
|
+
// reader keeps rejecting, which is a permanent warm-cache-miss reparse loop
|
|
1019
|
+
// that logs nothing.
|
|
1020
|
+
const receiverChain = extractReceiverChain(match);
|
|
1021
|
+
// Callee-position marker: a member-read capture that is actually the callee
|
|
1022
|
+
// of an enclosing call (`obj.f` in `obj.f()`). Recorded, not acted on —
|
|
1023
|
+
// whether the read is a phantom or a genuine func-typed-field read depends
|
|
1024
|
+
// on the resolved tail's kind, which only edge emission knows. Emitted by
|
|
1025
|
+
// languages whose read pattern has no call-position exclusion; absent
|
|
1026
|
+
// everywhere else, so the site stays byte-identical for them.
|
|
1027
|
+
const inCalleePosition = match['@reference.callee-position'] !== undefined;
|
|
1028
|
+
// Pointer-embedding marker: `struct S { *T }` rather than `struct S { T }`.
|
|
1029
|
+
// Recorded, not acted on — Go's method-set rules make the two forms differ
|
|
1030
|
+
// (see `ReferenceSite.embeddedAsPointer`), and only structural interface
|
|
1031
|
+
// detection knows what to do with that. Absent for every language without
|
|
1032
|
+
// pointer embedding, so their sites stay byte-identical.
|
|
1033
|
+
const embeddedAsPointer = match['@reference.embedded-pointer'] !== undefined;
|
|
804
1034
|
const site = {
|
|
805
1035
|
name: nameCap.text,
|
|
806
1036
|
atRange: anchor.range,
|
|
@@ -809,15 +1039,68 @@ function pass5CollectReferences(matches, positionIndex, filePath, referenceSites
|
|
|
809
1039
|
...(qualifiedCap?.text !== undefined && qualifiedCap.text.length > 0
|
|
810
1040
|
? { rawQualifiedName: qualifiedCap.text }
|
|
811
1041
|
: {}),
|
|
1042
|
+
...(typeArguments !== undefined ? { typeArguments } : {}),
|
|
1043
|
+
...(propertyKeyCap?.text !== undefined && propertyKeyCap.text.length > 0
|
|
1044
|
+
? { propertyKey: propertyKeyCap.text }
|
|
1045
|
+
: {}),
|
|
812
1046
|
...(callForm !== undefined ? { callForm } : {}),
|
|
813
1047
|
...(explicitReceiver !== undefined ? { explicitReceiver } : {}),
|
|
814
1048
|
...(arity !== undefined ? { arity } : {}),
|
|
815
1049
|
...(argumentTypes !== undefined ? { argumentTypes } : {}),
|
|
816
1050
|
...(argumentTypeClasses !== undefined ? { argumentTypeClasses } : {}),
|
|
1051
|
+
...(receiverChain !== undefined ? { receiverChain } : {}),
|
|
1052
|
+
...(inCalleePosition ? { inCalleePosition: true } : {}),
|
|
1053
|
+
...(embeddedAsPointer ? { embeddedAsPointer: true } : {}),
|
|
817
1054
|
};
|
|
818
1055
|
referenceSites.push(site);
|
|
819
1056
|
}
|
|
820
1057
|
}
|
|
1058
|
+
/**
|
|
1059
|
+
* The generic arguments a heritage reference was written with, by whichever of
|
|
1060
|
+
* the two routes this emitter uses (#2912).
|
|
1061
|
+
*
|
|
1062
|
+
* `@reference.type-arguments` is the explicit route, for an emitter whose anchor
|
|
1063
|
+
* is the bare NAME node (Rust's `impl Trait for S` anchors on the trait
|
|
1064
|
+
* identifier inside a `generic_type`). It wins where present: moving such an
|
|
1065
|
+
* anchor to cover the arguments would change the site's range, and that range is
|
|
1066
|
+
* part of every inheritance EDGE ID — a spelling detail must not renumber the
|
|
1067
|
+
* graph. Every other emitter already anchors on the whole base, so its spelling
|
|
1068
|
+
* is read directly and no query changed.
|
|
1069
|
+
*/
|
|
1070
|
+
function heritageTypeArguments(match, anchor, nameCap) {
|
|
1071
|
+
const explicit = match['@reference.type-arguments']?.text;
|
|
1072
|
+
return explicit !== undefined
|
|
1073
|
+
? typeApplicationArguments(explicit)
|
|
1074
|
+
: referenceTypeArguments(anchor.text, nameCap.text);
|
|
1075
|
+
}
|
|
1076
|
+
/**
|
|
1077
|
+
* Type arguments written on a heritage reference, read from the anchor's own
|
|
1078
|
+
* spelling — `IValidator<string>` → `['string']` (#2912).
|
|
1079
|
+
*
|
|
1080
|
+
* Two shapes are handled before the spelling is read as an application:
|
|
1081
|
+
*
|
|
1082
|
+
* - A trailing CONSTRUCTOR INVOCATION is dropped. `record R : Base<int>(x)`
|
|
1083
|
+
* and Kotlin `class C : Bar<Int>()` write a call in the heritage position;
|
|
1084
|
+
* the call is not part of the type, and leaving it attached would make the
|
|
1085
|
+
* list fail to close at the end and lose the arguments entirely.
|
|
1086
|
+
* - The application's base must BE the referenced name (`Other::Inner<T>`
|
|
1087
|
+
* ends with `Inner`). An anchor that spans more than the base type is not
|
|
1088
|
+
* read at all rather than read wrongly.
|
|
1089
|
+
*
|
|
1090
|
+
* `undefined` for a non-generic base and for every spelling that is not exactly
|
|
1091
|
+
* one balanced argument list — absence is the "unknown" value that consumers
|
|
1092
|
+
* fail open on, so declining is always safe here.
|
|
1093
|
+
*/
|
|
1094
|
+
function referenceTypeArguments(anchorText, baseName) {
|
|
1095
|
+
const text = stripTrailingCallSuffix(anchorText.trim());
|
|
1096
|
+
const opener = text.search(OPENING_BRACKET);
|
|
1097
|
+
if (opener === -1)
|
|
1098
|
+
return undefined;
|
|
1099
|
+
if (!text.slice(0, opener).trimEnd().endsWith(baseName))
|
|
1100
|
+
return undefined;
|
|
1101
|
+
return typeApplicationArguments(text);
|
|
1102
|
+
}
|
|
1103
|
+
const OPENING_BRACKET = /[<[]/;
|
|
821
1104
|
function referenceKindFromAnchor(name) {
|
|
822
1105
|
const suffix = name.slice('@reference.'.length);
|
|
823
1106
|
// Strip sub-tag after the kind (`@reference.call.member` → `call`).
|
|
@@ -840,6 +1123,8 @@ function referenceKindFromAnchor(name) {
|
|
|
840
1123
|
return 'import-use';
|
|
841
1124
|
case 'macro':
|
|
842
1125
|
return 'macro';
|
|
1126
|
+
case 'value-ref':
|
|
1127
|
+
return 'value-ref';
|
|
843
1128
|
default:
|
|
844
1129
|
return undefined;
|
|
845
1130
|
}
|
|
@@ -872,6 +1157,19 @@ function extractExplicitReceiver(match) {
|
|
|
872
1157
|
return undefined;
|
|
873
1158
|
return { name: cap.text };
|
|
874
1159
|
}
|
|
1160
|
+
/**
|
|
1161
|
+
* The compact receiver chain, when the language emitter synthesized one.
|
|
1162
|
+
*
|
|
1163
|
+
* Returns `undefined` for anything that does not decode, so a malformed or
|
|
1164
|
+
* over-bound payload degrades to the existing text cascade rather than
|
|
1165
|
+
* poisoning the durable store. Never throws — this runs per reference site.
|
|
1166
|
+
*/
|
|
1167
|
+
function extractReceiverChain(match) {
|
|
1168
|
+
const cap = match['@reference.receiver-chain'];
|
|
1169
|
+
if (cap === undefined)
|
|
1170
|
+
return undefined;
|
|
1171
|
+
return isValidReceiverChain(cap.text) ? cap.text : undefined;
|
|
1172
|
+
}
|
|
875
1173
|
function extractArity(match) {
|
|
876
1174
|
const cap = match['@reference.arity'];
|
|
877
1175
|
if (cap === undefined)
|
|
@@ -893,6 +1191,245 @@ function extractArgumentTypes(match) {
|
|
|
893
1191
|
}
|
|
894
1192
|
return undefined;
|
|
895
1193
|
}
|
|
1194
|
+
// ─── Pass 6: collect callable-value-flow facts ─────────────────────────────
|
|
1195
|
+
const CALLABLE_FLOW_KINDS = [
|
|
1196
|
+
'seed',
|
|
1197
|
+
'copy',
|
|
1198
|
+
'alias',
|
|
1199
|
+
'address',
|
|
1200
|
+
'store',
|
|
1201
|
+
'load',
|
|
1202
|
+
'formal',
|
|
1203
|
+
'argument',
|
|
1204
|
+
'invoke',
|
|
1205
|
+
];
|
|
1206
|
+
function pass6CollectCallableFlows(matches, positionIndex, filePath, out) {
|
|
1207
|
+
for (const match of matches) {
|
|
1208
|
+
const kind = callableFlowKind(match);
|
|
1209
|
+
if (kind === undefined)
|
|
1210
|
+
continue;
|
|
1211
|
+
const anchor = match[`@callable-flow.${kind}`];
|
|
1212
|
+
if (anchor === undefined)
|
|
1213
|
+
continue;
|
|
1214
|
+
switch (kind) {
|
|
1215
|
+
case 'seed': {
|
|
1216
|
+
const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
|
|
1217
|
+
const target = match['@callable-flow.target'];
|
|
1218
|
+
const targetName = match['@callable-flow.target-name']?.text ?? target?.text;
|
|
1219
|
+
if (destination === undefined || target === undefined || !nonEmpty(targetName))
|
|
1220
|
+
continue;
|
|
1221
|
+
const expectedSignature = callableFlowExpectedSignature(match);
|
|
1222
|
+
out.push({
|
|
1223
|
+
kind,
|
|
1224
|
+
destination,
|
|
1225
|
+
targetName,
|
|
1226
|
+
targetRange: target.range,
|
|
1227
|
+
...(nonEmpty(match['@callable-flow.target-qualified-name']?.text)
|
|
1228
|
+
? { targetQualifiedName: match['@callable-flow.target-qualified-name'].text }
|
|
1229
|
+
: {}),
|
|
1230
|
+
...(expectedSignature !== undefined ? { expectedSignature } : {}),
|
|
1231
|
+
});
|
|
1232
|
+
break;
|
|
1233
|
+
}
|
|
1234
|
+
case 'copy':
|
|
1235
|
+
case 'alias': {
|
|
1236
|
+
const source = callableFlowOperand(match, 'source', positionIndex, filePath);
|
|
1237
|
+
const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
|
|
1238
|
+
if (source === undefined || destination === undefined)
|
|
1239
|
+
continue;
|
|
1240
|
+
out.push({ kind, source, destination });
|
|
1241
|
+
break;
|
|
1242
|
+
}
|
|
1243
|
+
case 'address': {
|
|
1244
|
+
const source = callableFlowOperand(match, 'source', positionIndex, filePath);
|
|
1245
|
+
const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
|
|
1246
|
+
if (source === undefined || destination === undefined)
|
|
1247
|
+
continue;
|
|
1248
|
+
out.push({ kind, source, destination });
|
|
1249
|
+
break;
|
|
1250
|
+
}
|
|
1251
|
+
case 'store': {
|
|
1252
|
+
const source = callableFlowOperand(match, 'source', positionIndex, filePath);
|
|
1253
|
+
const pointer = callableFlowOperand(match, 'pointer', positionIndex, filePath);
|
|
1254
|
+
if (source === undefined || pointer === undefined)
|
|
1255
|
+
continue;
|
|
1256
|
+
out.push({ kind, source, pointer });
|
|
1257
|
+
break;
|
|
1258
|
+
}
|
|
1259
|
+
case 'load': {
|
|
1260
|
+
const pointer = callableFlowOperand(match, 'pointer', positionIndex, filePath);
|
|
1261
|
+
const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
|
|
1262
|
+
if (pointer === undefined || destination === undefined)
|
|
1263
|
+
continue;
|
|
1264
|
+
out.push({ kind, pointer, destination });
|
|
1265
|
+
break;
|
|
1266
|
+
}
|
|
1267
|
+
case 'formal': {
|
|
1268
|
+
const owner = match['@callable-flow.owner'];
|
|
1269
|
+
const binding = callableFlowOperand(match, 'binding', positionIndex, filePath);
|
|
1270
|
+
const parameterIndex = parseNonNegativeInt(match['@callable-flow.parameter-index']?.text);
|
|
1271
|
+
const passingMode = parseCallablePassingMode(match['@callable-flow.passing-mode']?.text);
|
|
1272
|
+
if (owner === undefined ||
|
|
1273
|
+
!nonEmpty(owner.text) ||
|
|
1274
|
+
binding === undefined ||
|
|
1275
|
+
parameterIndex === undefined ||
|
|
1276
|
+
passingMode === undefined) {
|
|
1277
|
+
continue;
|
|
1278
|
+
}
|
|
1279
|
+
const expectedSignature = callableFlowExpectedSignature(match);
|
|
1280
|
+
out.push({
|
|
1281
|
+
kind,
|
|
1282
|
+
ownerName: owner.text,
|
|
1283
|
+
ownerRange: owner.range,
|
|
1284
|
+
parameterIndex,
|
|
1285
|
+
binding,
|
|
1286
|
+
passingMode,
|
|
1287
|
+
...(expectedSignature !== undefined ? { expectedSignature } : {}),
|
|
1288
|
+
});
|
|
1289
|
+
break;
|
|
1290
|
+
}
|
|
1291
|
+
case 'argument': {
|
|
1292
|
+
const source = callableFlowOperand(match, 'source', positionIndex, filePath);
|
|
1293
|
+
const parameterIndex = parseNonNegativeInt(match['@callable-flow.parameter-index']?.text);
|
|
1294
|
+
if (source === undefined || parameterIndex === undefined)
|
|
1295
|
+
continue;
|
|
1296
|
+
out.push({
|
|
1297
|
+
kind,
|
|
1298
|
+
callSite: anchor.range,
|
|
1299
|
+
parameterIndex,
|
|
1300
|
+
source,
|
|
1301
|
+
...(nonEmpty(match['@callable-flow.direct-callee-name']?.text)
|
|
1302
|
+
? { directCalleeName: match['@callable-flow.direct-callee-name'].text }
|
|
1303
|
+
: {}),
|
|
1304
|
+
});
|
|
1305
|
+
break;
|
|
1306
|
+
}
|
|
1307
|
+
case 'invoke': {
|
|
1308
|
+
const callee = callableFlowOperand(match, 'callee', positionIndex, filePath);
|
|
1309
|
+
const inScope = positionIndex.atPosition(filePath, anchor.range.startLine, anchor.range.startCol);
|
|
1310
|
+
const invocationKind = parseCallableInvocationKind(match['@callable-flow.invocation-kind']?.text);
|
|
1311
|
+
if (callee === undefined || inScope === undefined || invocationKind === undefined)
|
|
1312
|
+
continue;
|
|
1313
|
+
const receiver = callableFlowOperand(match, 'receiver', positionIndex, filePath);
|
|
1314
|
+
const arity = parseNonNegativeInt(match['@callable-flow.arity']?.text);
|
|
1315
|
+
out.push({
|
|
1316
|
+
kind,
|
|
1317
|
+
callSite: anchor.range,
|
|
1318
|
+
inScope,
|
|
1319
|
+
callee,
|
|
1320
|
+
invocationKind,
|
|
1321
|
+
...(receiver !== undefined ? { receiver } : {}),
|
|
1322
|
+
...(arity !== undefined ? { arity } : {}),
|
|
1323
|
+
});
|
|
1324
|
+
break;
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
function callableFlowKind(match) {
|
|
1330
|
+
return CALLABLE_FLOW_KINDS.find((kind) => match[`@callable-flow.${kind}`] !== undefined);
|
|
1331
|
+
}
|
|
1332
|
+
function callableFlowOperand(match, role, positionIndex, filePath) {
|
|
1333
|
+
const cap = match[`@callable-flow.${role}`];
|
|
1334
|
+
if (cap === undefined || !nonEmpty(cap.text))
|
|
1335
|
+
return undefined;
|
|
1336
|
+
const inScope = positionIndex.atPosition(filePath, cap.range.startLine, cap.range.startCol);
|
|
1337
|
+
if (inScope === undefined)
|
|
1338
|
+
return undefined;
|
|
1339
|
+
const expressionKind = parseCallableOperandKind(match[`@callable-flow.${role}-kind`]?.text);
|
|
1340
|
+
const indirection = parseNonNegativeInt(match[`@callable-flow.${role}-indirection`]?.text);
|
|
1341
|
+
if (indirection !== undefined && indirection > 16)
|
|
1342
|
+
return undefined;
|
|
1343
|
+
return {
|
|
1344
|
+
name: cap.text,
|
|
1345
|
+
inScope,
|
|
1346
|
+
atRange: cap.range,
|
|
1347
|
+
indirection: indirection ?? 0,
|
|
1348
|
+
addressOf: match[`@callable-flow.${role}-address`]?.text === 'true',
|
|
1349
|
+
...(expressionKind !== undefined ? { expressionKind } : {}),
|
|
1350
|
+
...(nonEmpty(match[`@callable-flow.${role}-qualified-name`]?.text)
|
|
1351
|
+
? { qualifiedName: match[`@callable-flow.${role}-qualified-name`].text }
|
|
1352
|
+
: {}),
|
|
1353
|
+
};
|
|
1354
|
+
}
|
|
1355
|
+
function callableFlowExpectedSignature(match) {
|
|
1356
|
+
const parameterCount = parseNonNegativeInt(match['@callable-flow.expected-arity']?.text);
|
|
1357
|
+
const parameterTypes = parseJsonStringArray(match['@callable-flow.expected-types']?.text);
|
|
1358
|
+
const parameterTypeClasses = parseJsonParameterTypeClassesCapture(match['@callable-flow.expected-type-classes']);
|
|
1359
|
+
const isConst = parseBooleanText(match['@callable-flow.expected-const']?.text);
|
|
1360
|
+
if (parameterCount === undefined &&
|
|
1361
|
+
parameterTypes === undefined &&
|
|
1362
|
+
parameterTypeClasses === undefined &&
|
|
1363
|
+
isConst === undefined) {
|
|
1364
|
+
return undefined;
|
|
1365
|
+
}
|
|
1366
|
+
return {
|
|
1367
|
+
...(parameterCount !== undefined ? { parameterCount } : {}),
|
|
1368
|
+
...(parameterTypes !== undefined ? { parameterTypes } : {}),
|
|
1369
|
+
...(parameterTypeClasses !== undefined ? { parameterTypeClasses } : {}),
|
|
1370
|
+
...(isConst !== undefined ? { isConst } : {}),
|
|
1371
|
+
};
|
|
1372
|
+
}
|
|
1373
|
+
function parseCallableOperandKind(text) {
|
|
1374
|
+
switch (text) {
|
|
1375
|
+
case 'binding':
|
|
1376
|
+
case 'callable-designator':
|
|
1377
|
+
case 'bound-member':
|
|
1378
|
+
case 'anonymous-callable':
|
|
1379
|
+
return text;
|
|
1380
|
+
default:
|
|
1381
|
+
return undefined;
|
|
1382
|
+
}
|
|
1383
|
+
}
|
|
1384
|
+
function parseBooleanText(text) {
|
|
1385
|
+
if (text === 'true')
|
|
1386
|
+
return true;
|
|
1387
|
+
if (text === 'false')
|
|
1388
|
+
return false;
|
|
1389
|
+
return undefined;
|
|
1390
|
+
}
|
|
1391
|
+
function parseJsonStringArray(text) {
|
|
1392
|
+
if (text === undefined)
|
|
1393
|
+
return undefined;
|
|
1394
|
+
try {
|
|
1395
|
+
const parsed = JSON.parse(text);
|
|
1396
|
+
return Array.isArray(parsed) && parsed.every((value) => typeof value === 'string')
|
|
1397
|
+
? parsed
|
|
1398
|
+
: undefined;
|
|
1399
|
+
}
|
|
1400
|
+
catch {
|
|
1401
|
+
return undefined;
|
|
1402
|
+
}
|
|
1403
|
+
}
|
|
1404
|
+
function parseNonNegativeInt(text) {
|
|
1405
|
+
if (text === undefined || !/^\d+$/.test(text))
|
|
1406
|
+
return undefined;
|
|
1407
|
+
const value = Number.parseInt(text, 10);
|
|
1408
|
+
return Number.isSafeInteger(value) ? value : undefined;
|
|
1409
|
+
}
|
|
1410
|
+
function parseCallablePassingMode(text) {
|
|
1411
|
+
switch (text) {
|
|
1412
|
+
case 'value':
|
|
1413
|
+
case 'reference':
|
|
1414
|
+
case 'pointer':
|
|
1415
|
+
return text;
|
|
1416
|
+
default:
|
|
1417
|
+
return undefined;
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1420
|
+
function parseCallableInvocationKind(text) {
|
|
1421
|
+
switch (text) {
|
|
1422
|
+
case 'indirect':
|
|
1423
|
+
case 'member-pointer':
|
|
1424
|
+
case 'callable-object':
|
|
1425
|
+
return text;
|
|
1426
|
+
default:
|
|
1427
|
+
return undefined;
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
1430
|
+
function nonEmpty(value) {
|
|
1431
|
+
return value !== undefined && value.length > 0;
|
|
1432
|
+
}
|
|
896
1433
|
// ─── Internal: range + capture utilities ───────────────────────────────────
|
|
897
1434
|
function rangesEqual(a, b) {
|
|
898
1435
|
return (a.startLine === b.startLine &&
|
|
@@ -910,15 +1447,27 @@ function rangesEqual(a, b) {
|
|
|
910
1447
|
* change.
|
|
911
1448
|
*/
|
|
912
1449
|
const KNOWN_SUB_TAGS = new Set([
|
|
1450
|
+
'@scope.lexical-names',
|
|
913
1451
|
'@declaration.name',
|
|
914
1452
|
'@declaration.qualified_name',
|
|
915
1453
|
'@import.name',
|
|
916
1454
|
'@import.source',
|
|
917
1455
|
'@import.alias',
|
|
1456
|
+
// Provider-set marker, not a statement anchor. Listed for the same reason as
|
|
1457
|
+
// its siblings: it is emitted on a sub-node of the import statement, and the
|
|
1458
|
+
// anchor must stay `@import.statement` regardless of relative span.
|
|
1459
|
+
'@import.publishes',
|
|
918
1460
|
'@type-binding.name',
|
|
919
1461
|
'@type-binding.type',
|
|
920
1462
|
'@reference.name',
|
|
921
1463
|
'@reference.qualified-name',
|
|
1464
|
+
// The generic arguments a heritage base was written with, when the emitter's
|
|
1465
|
+
// anchor is the bare name and cannot carry them (#2912). A sub-tag for the
|
|
1466
|
+
// usual reason: it spans a sibling node of the anchor, never the site itself.
|
|
1467
|
+
'@reference.type-arguments',
|
|
1468
|
+
'@reference.property-key',
|
|
1469
|
+
'@reference.callee-position',
|
|
1470
|
+
'@reference.embedded-pointer',
|
|
922
1471
|
'@reference.receiver',
|
|
923
1472
|
'@reference.operator',
|
|
924
1473
|
'@reference.arity',
|
|
@@ -930,6 +1479,15 @@ const KNOWN_SUB_TAGS = new Set([
|
|
|
930
1479
|
'@declaration.parameter-type-classes',
|
|
931
1480
|
'@declaration.return-type',
|
|
932
1481
|
'@declaration.template-constraints',
|
|
1482
|
+
// MUST be listed, and the failure it prevents is silent def LOSS rather than
|
|
1483
|
+
// a missing field. `anchorCaptureFor` picks the broadest-span `@declaration.*`
|
|
1484
|
+
// capture that is not a known sub-tag; a type-parameter list is normally
|
|
1485
|
+
// narrower than the declaration that owns it, but a C++ `template <class A,
|
|
1486
|
+
// class B, …>` or a multi-line Java `<T extends A & B>` written above a short
|
|
1487
|
+
// declaration can out-span it. The anchor would then be `type-parameters`,
|
|
1488
|
+
// `normalizeNodeLabel` would return undefined for it, and the whole class def
|
|
1489
|
+
// would be dropped rather than merely losing its parameters.
|
|
1490
|
+
'@declaration.type-parameters',
|
|
933
1491
|
'@declaration.is-explicit',
|
|
934
1492
|
'@declaration.is-deleted',
|
|
935
1493
|
]);
|