gitnexus 1.6.10-rc.98 → 1.6.10
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 +177 -18
- package/dist/_shared/graph/types.d.ts +21 -2
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +3 -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 +16 -0
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +19 -7
- 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/evidence-weights.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +5 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +315 -36
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +115 -0
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/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 +278 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +3 -2
- package/dist/cli/ai-context.js +71 -16
- 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 +21 -113
- package/dist/cli/analyze.js +172 -29
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/detect-changes-format.js +19 -2
- package/dist/cli/doctor.d.ts +12 -0
- package/dist/cli/doctor.js +32 -5
- package/dist/cli/editor-targets.js +6 -0
- package/dist/cli/eval-server.js +2 -1
- 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 +229 -21
- package/dist/cli/help-i18n.js +1 -2
- package/dist/cli/i18n/en.d.ts +11 -9
- package/dist/cli/i18n/en.js +13 -9
- package/dist/cli/i18n/resources.d.ts +15 -11
- package/dist/cli/i18n/zh-CN.d.ts +4 -2
- package/dist/cli/i18n/zh-CN.js +11 -9
- package/dist/cli/index.js +8 -4
- package/dist/cli/resolve-invocation.d.ts +7 -3
- package/dist/cli/resolve-invocation.js +7 -3
- package/dist/cli/setup.js +4 -3
- package/dist/cli/skill-gen.d.ts +1 -6
- package/dist/cli/tool.d.ts +1 -0
- package/dist/cli/tool.js +74 -17
- package/dist/cli/wiki.js +53 -10
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +54 -13
- package/dist/core/analyzer-identity.d.ts +80 -0
- package/dist/core/analyzer-identity.js +364 -26
- package/dist/core/augmentation/engine.js +86 -71
- 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/embedding-pipeline.d.ts +8 -0
- package/dist/core/embeddings/embedding-pipeline.js +253 -14
- package/dist/core/embeddings/http-client.d.ts +5 -0
- package/dist/core/embeddings/http-client.js +142 -27
- 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.d.ts +204 -1
- package/dist/core/group/bridge-db.js +401 -28
- package/dist/core/group/completeness.d.ts +130 -0
- package/dist/core/group/completeness.js +83 -0
- package/dist/core/group/config-parser.js +0 -5
- package/dist/core/group/cross-impact.d.ts +46 -1
- package/dist/core/group/cross-impact.js +220 -19
- package/dist/core/group/cross-trace.d.ts +32 -11
- package/dist/core/group/cross-trace.js +114 -20
- package/dist/core/group/extractors/http-patterns/java.js +278 -22
- package/dist/core/group/extractors/http-patterns/node.js +332 -216
- 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/extractors/python-workspace-extractor.js +5 -2
- package/dist/core/group/group-lock.d.ts +31 -0
- package/dist/core/group/group-lock.js +166 -0
- package/dist/core/group/service.js +297 -16
- package/dist/core/group/storage.d.ts +3 -0
- package/dist/core/group/storage.js +7 -39
- package/dist/core/group/sync.d.ts +49 -3
- package/dist/core/group/sync.js +0 -0
- package/dist/core/group/types.d.ts +183 -8
- package/dist/core/group/types.js +28 -1
- 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 +77 -2
- package/dist/core/index-freshness.js +109 -2
- 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 +6 -6
- package/dist/core/ingestion/cluster-enricher.js +8 -4
- package/dist/core/ingestion/community-processor.d.ts +21 -3
- package/dist/core/ingestion/community-processor.js +81 -82
- package/dist/core/ingestion/di-extractors/index.d.ts +9 -33
- package/dist/core/ingestion/di-extractors/spring.d.ts +1 -1
- package/dist/core/ingestion/di-extractors/spring.js +8 -1
- 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/filesystem-walker.js +30 -14
- package/dist/core/ingestion/finalize-orchestrator.js +1 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +6 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +35 -1
- 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-catalog.js +1 -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/di-metadata.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.js +162 -13
- 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 +429 -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 +65 -19
- 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 +29 -1
- package/dist/core/ingestion/language-config.js +110 -35
- package/dist/core/ingestion/language-provider.d.ts +209 -7
- package/dist/core/ingestion/language-provider.js +37 -0
- package/dist/core/ingestion/languages/c/captures.js +7 -0
- package/dist/core/ingestion/languages/c/import-target.js +12 -16
- package/dist/core/ingestion/languages/c/scope-resolver.js +20 -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/scope-resolver.js +27 -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 +14 -2
- 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 +48 -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 +19 -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 +598 -16
- 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 +6 -1
- package/dist/core/ingestion/languages/go/captures.js +108 -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 +4 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +12 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +12 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +48 -0
- package/dist/core/ingestion/languages/java/captures.js +129 -44
- 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/query.js +16 -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 +10 -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-conditionals.d.ts +11 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
- package/dist/core/ingestion/languages/java/spring-di.d.ts +4 -1
- package/dist/core/ingestion/languages/java/spring-di.js +41 -9
- 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 +94 -3
- package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
- package/dist/core/ingestion/languages/javascript/captures.js +262 -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 +211 -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-siblings.js +77 -9
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +48 -0
- package/dist/core/ingestion/languages/kotlin/captures.js +43 -1
- 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/query.js +28 -2
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +23 -2
- 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-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 +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.js +60 -11
- 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/php/captures.d.ts +5 -0
- package/dist/core/ingestion/languages/php/captures.js +319 -51
- package/dist/core/ingestion/languages/php/import-target.d.ts +3 -4
- package/dist/core/ingestion/languages/php/import-target.js +192 -62
- package/dist/core/ingestion/languages/php/query.js +31 -0
- 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.js +29 -0
- 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 -7
- package/dist/core/ingestion/languages/python/query.js +9 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +8 -6
- package/dist/core/ingestion/languages/python/receiver-binding.js +108 -12
- package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
- package/dist/core/ingestion/languages/python/simple-hooks.js +2 -8
- package/dist/core/ingestion/languages/python.js +13 -0
- package/dist/core/ingestion/languages/ruby/captures.js +158 -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 +39 -1
- 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 +39 -6
- 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 +87 -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 +267 -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/convex-endpoint-metadata.d.ts +7 -0
- package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.js +92 -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/query.d.ts +1 -0
- package/dist/core/ingestion/languages/typescript/query.js +303 -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 +292 -0
- package/dist/core/ingestion/languages/typescript.js +93 -2
- 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/pipeline-phases/di.d.ts +1 -1
- package/dist/core/ingestion/pipeline-phases/di.js +136 -21
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +154 -4
- package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +3 -2
- package/dist/core/ingestion/pipeline-phases/processes.js +91 -6
- package/dist/core/ingestion/pipeline-phases/routes.js +116 -25
- 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/types.d.ts +7 -0
- package/dist/core/ingestion/pipeline.d.ts +26 -2
- package/dist/core/ingestion/pipeline.js +60 -11
- 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 +66 -6
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +8 -2
- package/dist/core/ingestion/route-extractors/constant-resolver.js +11 -7
- package/dist/core/ingestion/route-extractors/data-route-table.d.ts +40 -0
- package/dist/core/ingestion/route-extractors/data-route-table.js +876 -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/java-const-resolver.d.ts +114 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.js +569 -0
- package/dist/core/ingestion/route-extractors/js-const-resolver.d.ts +192 -0
- package/dist/core/ingestion/route-extractors/js-const-resolver.js +1033 -0
- package/dist/core/ingestion/route-extractors/nest.d.ts +53 -0
- package/dist/core/ingestion/route-extractors/nest.js +523 -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 +214 -29
- 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 +311 -16
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +311 -21
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +47 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +280 -42
- 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 +58 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +137 -34
- 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 +39 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +18 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +113 -18
- 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 +3 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +101 -41
- 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 +5 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +8 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +105 -5
- 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 +29 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +57 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +55 -1
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +241 -19
- 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 +905 -22
- 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/tree-sitter-queries.d.ts +11 -11
- package/dist/core/ingestion/tree-sitter-queries.js +678 -4
- package/dist/core/ingestion/type-env.js +11 -7
- package/dist/core/ingestion/type-extractors/jvm.js +2 -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 +322 -16
- package/dist/core/ingestion/utils/ast-helpers.js +727 -150
- 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 +59 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +51 -1
- 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 +80 -0
- package/dist/core/ingestion/workers/callable-id.js +125 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
- package/dist/core/ingestion/workers/parse-worker.js +493 -54
- package/dist/core/ingestion/workers/worker-pool.d.ts +20 -27
- package/dist/core/ingestion/workers/worker-pool.js +91 -3
- package/dist/core/lbug/csv-generator.d.ts +27 -0
- package/dist/core/lbug/csv-generator.js +72 -17
- package/dist/core/lbug/extension-load-error.js +13 -2
- package/dist/core/lbug/extension-loader.d.ts +29 -0
- package/dist/core/lbug/extension-loader.js +31 -6
- 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 +290 -11
- package/dist/core/lbug/lbug-adapter.js +652 -69
- package/dist/core/lbug/native-check.d.ts +21 -0
- package/dist/core/lbug/native-check.js +248 -32
- 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 +9 -0
- package/dist/core/lbug/pool-adapter.js +164 -14
- 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 +163 -4
- package/dist/core/lbug/schema.js +404 -159
- package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
- package/dist/core/lbug/sync-csv-writer.js +108 -0
- package/dist/core/run-analyze.d.ts +147 -0
- package/dist/core/run-analyze.js +1215 -179
- 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 +150 -9
- package/dist/core/search/fts-indexes.js +241 -23
- package/dist/core/wiki/graph-queries.js +145 -112
- package/dist/core/wiki/llm-client.d.ts +29 -3
- package/dist/core/wiki/llm-client.js +47 -12
- 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/local/aop-metadata.d.ts +77 -0
- package/dist/mcp/local/aop-metadata.js +227 -0
- package/dist/mcp/local/bean-metadata.d.ts +2 -1
- package/dist/mcp/local/bean-metadata.js +22 -1
- package/dist/mcp/local/convex-metadata.d.ts +8 -0
- package/dist/mcp/local/convex-metadata.js +45 -0
- package/dist/mcp/local/local-backend.d.ts +174 -11
- package/dist/mcp/local/local-backend.js +1678 -331
- 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/repository-policy.d.ts +1 -0
- package/dist/mcp/repository-policy.js +5 -0
- package/dist/mcp/resources.js +26 -4
- package/dist/mcp/server.js +23 -13
- package/dist/mcp/tools.d.ts +8 -0
- package/dist/mcp/tools.js +76 -23
- package/dist/server/analyze-job.d.ts +37 -2
- package/dist/server/analyze-job.js +13 -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 +1 -1
- package/dist/server/analyze-worker-core.js +10 -1
- 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/api.d.ts +2 -11
- package/dist/server/api.js +164 -163
- 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/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/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 +131 -0
- package/dist/storage/git.js +236 -2
- package/dist/storage/index-lock.d.ts +102 -0
- package/dist/storage/index-lock.js +660 -0
- package/dist/storage/parse-cache.js +588 -3
- package/dist/storage/parsedfile-store.js +76 -6
- package/dist/storage/repo-manager.d.ts +54 -435
- package/dist/storage/repo-manager.js +312 -215
- 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 +11 -2
- package/scripts/cross-platform-shard.ts +153 -0
- package/scripts/cross-platform-tests.ts +122 -0
- package/scripts/run-cross-platform.ts +16 -5
- 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-plan/README.md +11 -6
- package/skills/gitnexus-plan/references/evidence-provenance.md +49 -12
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +654 -372
- package/skills/gitnexus-refactoring.md +48 -5
- package/skills/gitnexus-review/SKILL.md +12 -6
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +1 -1
- package/skills/gitnexus-taint-analysis.md +13 -7
- package/skills/gitnexus-work/SKILL.md +4 -1
- package/skills/gitnexus-work/references/evidence-provenance.md +49 -12
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +654 -372
- package/vendor/leiden/utils.cjs +28 -1
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
- package/web/assets/{__vite-browser-external-bMKyYQkO.js → __vite-browser-external-COxE8F0G.js} +1 -1
- package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
- package/web/assets/agent-Dr4l5EOp.js +662 -0
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-DBefcjof.js → blockDiagram-54WLDVWM-Dg_hrRWE.js} +4 -4
- package/web/assets/{c4Diagram-Y2BXMSZH-EjWnjEJl.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +2 -2
- 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-LII3EMHJ-BL6lKJ_P.js → chunk-6L755F7B-CMhLBxi2.js} +1 -1
- package/web/assets/{chunk-QA3QBVWF-DVXPOIxe.js → chunk-7CWYLC5S-DRgGkkpF.js} +1 -1
- package/web/assets/{chunk-ZXARS5L4-C3v-4Fsw.js → chunk-A7VWPJGB-B4O3oQdQ.js} +1 -1
- 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-INKRHTLW-Ckl3_KkO.js → chunk-SZD42YQK-ijyKKVr1.js} +21 -21
- package/web/assets/{chunk-LCXTWHL2-C162wE5z.js → chunk-TFPGFQPA-Dj6a-0pC.js} +3 -3
- 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-RG4AUYOV-ZNgyLFq6.js → chunk-VJFVEZTB-CX66F2ep.js} +3 -3
- 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-HNR7UZ2L-DVRltWbL.js → diagram-KFBZAVDW-Dfmf_4ti.js} +3 -3
- 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/error-D9MtuG9s.js +1 -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-D7mTFcvQ.js → index-2zdvEdzg.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-XpjJRU9h.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +2 -2
- package/web/assets/{journeyDiagram-M6C3CM3L-C6wjooas.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +3 -3
- package/web/assets/{kanban-definition-75IXJCU3-5_UVY79g.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +6 -6
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
- package/web/assets/{mindmap-definition-2TDM6QVE-8xDLzk2e.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +5 -5
- package/web/assets/node.browser-U-KyT5AW.js +1 -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/{quadrantDiagram-VICAPDV7-DR54jOeR.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +3 -3
- 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-JXO7QTGE-PEkg7sKC.js → requirementDiagram-RASO5HTO-B-l8InpK.js} +4 -4
- package/web/assets/{sankeyDiagram-URQDO5SZ-DDWEtjcs.js → sankeyDiagram-F32LOJ6L-Kd7zjJgX.js} +3 -3
- package/web/assets/{sequenceDiagram-VS2MUI6T-Bv-uwANx.js → sequenceDiagram-URATNSBD-BlcdY9DS.js} +7 -7
- 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-O6YCAMPW-Qmsuo7qS.js → timeline-definition-WJXWRH4I-DUfp1R3E.js} +3 -3
- 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 +16 -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/web/assets/ProcessFlowModal-CwkpVkv-.js +0 -22
- package/web/assets/agent-Ds-lkZjX.js +0 -626
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +0 -36
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.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-CA7OhIEf.js +0 -124
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.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-J5EP6P6S-L19oz55R.js +0 -1
- package/web/assets/chunk-KGFNY3KK-BZeP-55u.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-LRIF4GLE-n59lhprL.js +0 -1
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.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-ByqTVLvh.js +0 -1
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +0 -2
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +0 -1
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +0 -4
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +0 -43
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +0 -24
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.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-T368on4D.js +0 -2
- package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
- package/web/assets/node-Ct_zna8U.js +0 -8
- 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-Bv4LpAbr.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
- package/web/assets/sdk-CzHHH8tD.js +0 -37
- package/web/assets/src-Cv1eWg0o.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +0 -1
- 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-BD1iK1SX.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +0 -78
- package/web/assets/xychartDiagram-N2JHSOCM-CoZ_Tits.js +0 -7
- /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
|
@@ -1,22 +1,38 @@
|
|
|
1
1
|
import { generateId } from '../../../lib/utils.js';
|
|
2
2
|
import { extractTemplateArguments, stripTemplateArguments, templateArgumentsIdTag, } from './template-arguments.js';
|
|
3
3
|
import { splitQualifiedName } from './qualified-name.js';
|
|
4
|
+
import { isOverloadableCallable } from './callable-labels.js';
|
|
4
5
|
/**
|
|
5
|
-
* Qualify a
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
6
|
+
* Qualify a name by its enclosing `mod_item` scope, so two same-tail items nested
|
|
7
|
+
* under different modules get DISTINCT paths (`outer.Inner` vs `other.Inner`).
|
|
8
|
+
* Walks `mod_item` ancestors (outermost → innermost) and joins them with the
|
|
9
|
+
* normalized raw text via the shared `splitQualifiedName`. Keyed purely on
|
|
10
|
+
* tree-sitter node types (no language name), so it is a no-op for every grammar
|
|
11
|
+
* without such a node.
|
|
12
|
+
*
|
|
13
|
+
* TWO callers, with different contracts — read both before widening either:
|
|
14
|
+
*
|
|
15
|
+
* 1. The inherent-impl target (`impl Inner { … }`) — the #1982 follow-up to
|
|
16
|
+
* #1975, reachable through the {@link qualifyRustImplTargetByModScope} alias
|
|
17
|
+
* and mirrored by the inherent-impl branch in `findEnclosingClassInfo` so the
|
|
18
|
+
* owner edge and the node id agree byte-for-byte. That caller gates on an
|
|
19
|
+
* UNSCOPED `type_identifier`, which is what keeps a SCOPED `impl a::Inner` on
|
|
20
|
+
* its full raw text.
|
|
21
|
+
*
|
|
22
|
+
* 2. Free items, for module node identity (#2742). That caller gates on the node
|
|
23
|
+
* being on neither side of an owner edge (`MEMBER_OWNER_NODE_TYPES`,
|
|
24
|
+
* `enclosingClassInfo`) and not inside a callable, because only the id moves
|
|
25
|
+
* here — every owner-edge anchor is minted separately and does not follow.
|
|
26
|
+
*
|
|
27
|
+
* A name with NO enclosing `mod` is returned verbatim, never normalized: rewriting
|
|
28
|
+
* a scoped target's separator (`a::Inner` → `a.Inner`) would move its node id away
|
|
29
|
+
* from the id its owner edge emits, which is how caller 2 first broke caller 1's
|
|
30
|
+
* #1975 contract. Splitting an unscoped name has always been the identity, so
|
|
31
|
+
* caller 1 is unaffected either way.
|
|
16
32
|
*/
|
|
17
|
-
export const
|
|
33
|
+
export const qualifyByEnclosingModScope = (node, rawText) => {
|
|
18
34
|
const modSegments = [];
|
|
19
|
-
let current =
|
|
35
|
+
let current = node.parent;
|
|
20
36
|
while (current) {
|
|
21
37
|
if (current.type === 'mod_item') {
|
|
22
38
|
const nameNode = current.childForFieldName?.('name') ??
|
|
@@ -26,8 +42,21 @@ export const qualifyRustImplTargetByModScope = (implNode, rawTargetText) => {
|
|
|
26
42
|
}
|
|
27
43
|
current = current.parent;
|
|
28
44
|
}
|
|
29
|
-
return
|
|
45
|
+
// No enclosing `mod`: return the raw text UNTOUCHED. Normalizing here would
|
|
46
|
+
// rewrite a scoped target's separator (`a::Inner` -> `a.Inner`) and silently
|
|
47
|
+
// move its node id away from the one the owner edge emits, which is how this
|
|
48
|
+
// helper first broke the #1975 scoped-impl ownership when it was generalized
|
|
49
|
+
// beyond unscoped targets. Callers that pass an unscoped name are unaffected,
|
|
50
|
+
// since splitting one has always been the identity.
|
|
51
|
+
if (modSegments.length === 0)
|
|
52
|
+
return rawText;
|
|
53
|
+
return [...modSegments, ...splitQualifiedName(rawText)].filter(Boolean).join('.');
|
|
30
54
|
};
|
|
55
|
+
/**
|
|
56
|
+
* Impl-target alias of {@link qualifyByEnclosingModScope}, kept as its own name
|
|
57
|
+
* because the caller gates it on UNSCOPED targets (see the contract above).
|
|
58
|
+
*/
|
|
59
|
+
export const qualifyRustImplTargetByModScope = qualifyByEnclosingModScope;
|
|
31
60
|
/**
|
|
32
61
|
* #1991: scope-label predicate that single-sources the `nodeLabel === 'Trait'`
|
|
33
62
|
* checks in parsing-processor.ts / parse-worker.ts. A Ruby `module` maps to the
|
|
@@ -82,25 +111,104 @@ const isConcreteTypedefCapture = (captureMap) => {
|
|
|
82
111
|
return (definitionNode?.type === 'type_definition' &&
|
|
83
112
|
(captureMap['definition.struct'] !== undefined || captureMap['definition.enum'] !== undefined));
|
|
84
113
|
};
|
|
85
|
-
export const
|
|
86
|
-
const
|
|
114
|
+
export const isSuppressedConcreteTypedefDuplicate = (captureMap, concreteTypedefRanges) => {
|
|
115
|
+
const definitionNode = getDefinitionNodeFromCaptures(captureMap);
|
|
116
|
+
return (definitionNode?.type === 'type_definition' &&
|
|
117
|
+
captureMap['definition.typedef'] !== undefined &&
|
|
118
|
+
concreteTypedefRanges.has(nodeRangeKey(definitionNode)));
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Graph labels produced by a value capture (`@definition.const` /
|
|
122
|
+
* `@definition.static` / `@definition.variable`) — a binding that holds a value.
|
|
123
|
+
*
|
|
124
|
+
* `Property` is deliberately NOT here. It outranks these: Python matches both
|
|
125
|
+
* `@definition.property` (annotated) and `@definition.variable` (bare) on one
|
|
126
|
+
* assignment, and the property must win so a typed class attribute keeps its
|
|
127
|
+
* `Property` node and its owning `HAS_PROPERTY` edge. `Property` is instead
|
|
128
|
+
* suppressed only by a *callable* claim — see {@link buildDefinitionNameClaims}.
|
|
129
|
+
*/
|
|
130
|
+
const VALUE_DEFINITION_LABELS = new Set([
|
|
131
|
+
'Const',
|
|
132
|
+
'Static',
|
|
133
|
+
'Variable',
|
|
134
|
+
]);
|
|
135
|
+
/** True when `label` is the kind of node a value capture emits. */
|
|
136
|
+
export const isValueDefinitionLabel = (label) => VALUE_DEFINITION_LABELS.has(label);
|
|
137
|
+
/**
|
|
138
|
+
* Pre-scan `matches` for the `${definitionNode.startIndex}:${name}` keys already
|
|
139
|
+
* claimed by a higher-ranked definition capture, so the parse-worker's duplicate
|
|
140
|
+
* suppression is order-independent.
|
|
141
|
+
*
|
|
142
|
+
* Rank, highest first: callable (`Function`/`Method`/`Constructor`) → `Property`
|
|
143
|
+
* → value (`Const`/`Static`/`Variable`). A capture is dropped only when a
|
|
144
|
+
* STRICTLY higher rank claimed the same declaration node and name, so no capture
|
|
145
|
+
* can suppress itself and no rank can suppress a peer.
|
|
146
|
+
*
|
|
147
|
+
* ## Why this exists (#2687)
|
|
148
|
+
*
|
|
149
|
+
* `const X = () => {}` matches BOTH `@definition.function` and
|
|
150
|
+
* `@definition.const` on the same `lexical_declaration`. Only one graph node
|
|
151
|
+
* should survive — the `Function`, because that is what `CALLS` edges target.
|
|
152
|
+
* The parse-worker's in-loop dedup intends exactly that, but only the value
|
|
153
|
+
* branch consults its `processedDefinitionNodes` set, so suppression worked only
|
|
154
|
+
* if the function match happened to be processed first. It is not: tree-sitter
|
|
155
|
+
* completes the const pattern at `@name`, while the function pattern must also
|
|
156
|
+
* match the trailing `(arrow_function)` / `(function_expression)` value, so the
|
|
157
|
+
* const match is yielded FIRST and the edgeless `Const:` twin escaped.
|
|
158
|
+
*
|
|
159
|
+
* Consulting this set makes the outcome independent of match order.
|
|
160
|
+
*
|
|
161
|
+
* ## Keying
|
|
162
|
+
*
|
|
163
|
+
* Keys are `startIndex:name`, never `startIndex` alone — a multi-name
|
|
164
|
+
* declaration (`const a = 1, b = () => {}`) shares ONE definition node, and a
|
|
165
|
+
* bare-index key would wrongly suppress `a`'s legitimate `Const` node.
|
|
166
|
+
*
|
|
167
|
+
* Labels come from {@link getLabelFromCaptures}, the same function the main loop
|
|
168
|
+
* uses, so the pre-scan and the loop can never disagree about what counts as a
|
|
169
|
+
* value capture — including when a provider's `labelOverride` reclassifies one.
|
|
170
|
+
* A match that resolves to a value label registers nothing, so a match can never
|
|
171
|
+
* suppress itself.
|
|
172
|
+
*
|
|
173
|
+
* Language-agnostic: keyed off capture names and labels only.
|
|
174
|
+
*
|
|
175
|
+
* Also collects the concrete-typedef ranges that suppress the analogous
|
|
176
|
+
* typedef/struct duplicate, so both suppression sets come from one traversal.
|
|
177
|
+
*/
|
|
178
|
+
export const buildDefinitionPreScan = (matches, provider) => {
|
|
179
|
+
const nonValue = new Set();
|
|
180
|
+
const callable = new Set();
|
|
181
|
+
const concreteTypedefRanges = new Set();
|
|
87
182
|
for (const match of matches) {
|
|
183
|
+
// ONE capture-map build per match feeds both suppression sets. These used
|
|
184
|
+
// to be two independent passes over `matches` (each rebuilding this object)
|
|
185
|
+
// on the hot per-file parse path.
|
|
88
186
|
const captureMap = {};
|
|
89
187
|
for (const capture of match.captures) {
|
|
90
188
|
captureMap[capture.name] = capture.node;
|
|
91
189
|
}
|
|
92
190
|
const definitionNode = getDefinitionNodeFromCaptures(captureMap);
|
|
93
|
-
if (definitionNode
|
|
94
|
-
|
|
191
|
+
if (definitionNode === null)
|
|
192
|
+
continue;
|
|
193
|
+
if (isConcreteTypedefCapture(captureMap)) {
|
|
194
|
+
concreteTypedefRanges.add(nodeRangeKey(definitionNode));
|
|
95
195
|
}
|
|
196
|
+
// No `@name` capture means nothing a lower-ranked capture could collide
|
|
197
|
+
// with — a value or property pattern always binds a name. Checked before
|
|
198
|
+
// `getLabelFromCaptures` so a nameless match never pays for label
|
|
199
|
+
// resolution (which can reach a provider's `labelOverride`).
|
|
200
|
+
const nameNode = captureMap['name'];
|
|
201
|
+
if (nameNode === undefined)
|
|
202
|
+
continue;
|
|
203
|
+
const label = getLabelFromCaptures(captureMap, provider);
|
|
204
|
+
if (label === null || isValueDefinitionLabel(label))
|
|
205
|
+
continue;
|
|
206
|
+
const key = `${definitionNode.startIndex}:${nameNode.text}`;
|
|
207
|
+
nonValue.add(key);
|
|
208
|
+
if (isOverloadableCallable(label))
|
|
209
|
+
callable.add(key);
|
|
96
210
|
}
|
|
97
|
-
return
|
|
98
|
-
};
|
|
99
|
-
export const isSuppressedConcreteTypedefDuplicate = (captureMap, concreteTypedefRanges) => {
|
|
100
|
-
const definitionNode = getDefinitionNodeFromCaptures(captureMap);
|
|
101
|
-
return (definitionNode?.type === 'type_definition' &&
|
|
102
|
-
captureMap['definition.typedef'] !== undefined &&
|
|
103
|
-
concreteTypedefRanges.has(nodeRangeKey(definitionNode)));
|
|
211
|
+
return { nonValue, callable, concreteTypedefRanges };
|
|
104
212
|
};
|
|
105
213
|
/**
|
|
106
214
|
* Node types that represent function/method definitions across languages.
|
|
@@ -165,6 +273,15 @@ export const CLASS_CONTAINER_TYPES = new Set([
|
|
|
165
273
|
'class_declaration',
|
|
166
274
|
'abstract_class_declaration',
|
|
167
275
|
'interface_declaration',
|
|
276
|
+
// A TypeScript object-type alias owns its members exactly as the interface
|
|
277
|
+
// beside it does — same `property_signature` members, same "who reads this
|
|
278
|
+
// contract field?" question. Without it an alias member is minted with a
|
|
279
|
+
// bare id and no owner, so two aliases in one file sharing a field name
|
|
280
|
+
// collapse onto one node and nothing links the field to its consumers,
|
|
281
|
+
// while the identical interface resolves. Aliases with no object type
|
|
282
|
+
// (`type Id = string`) declare no members, so they own nothing and are
|
|
283
|
+
// unaffected.
|
|
284
|
+
'type_alias_declaration',
|
|
168
285
|
'struct_declaration',
|
|
169
286
|
'record_declaration',
|
|
170
287
|
'class_specifier',
|
|
@@ -192,10 +309,43 @@ export const CLASS_CONTAINER_TYPES = new Set([
|
|
|
192
309
|
'struct_type',
|
|
193
310
|
'interface_type',
|
|
194
311
|
]);
|
|
312
|
+
/**
|
|
313
|
+
* Node types whose OWN node id must not be re-keyed by an enclosing-scope
|
|
314
|
+
* qualifier (see {@link qualifyByEnclosingModScope}) unless the owner-edge
|
|
315
|
+
* anchor moves in the same change.
|
|
316
|
+
*
|
|
317
|
+
* These are the containers a member can be declared inside. Their members'
|
|
318
|
+
* `HAS_METHOD` / `HAS_PROPERTY` edges anchor on `findEnclosingClassInfo().classId`,
|
|
319
|
+
* which is minted from the container's bare `nameNode.text` further down this
|
|
320
|
+
* file and only follows a qualified shape when the provider opts in via
|
|
321
|
+
* `classExtractor.qualifiedNodeId`. So qualifying a container's id alone points
|
|
322
|
+
* every one of its member edges at a node that does not exist — the edges are
|
|
323
|
+
* dropped at COPY time and the container silently loses all its members.
|
|
324
|
+
*
|
|
325
|
+
* Derived from `CLASS_CONTAINER_TYPES` on purpose: that set is already the
|
|
326
|
+
* single source of "this node type owns member edges", carries the INVARIANT
|
|
327
|
+
* note above binding it to `CONTAINER_TYPE_TO_LABEL`, and so a language adding
|
|
328
|
+
* a container cannot gain a mismatched id shape here without also failing that
|
|
329
|
+
* invariant. Keyed purely on tree-sitter node types — no language names.
|
|
330
|
+
*/
|
|
331
|
+
export const MEMBER_OWNER_NODE_TYPES = new Set([
|
|
332
|
+
...CLASS_CONTAINER_TYPES,
|
|
333
|
+
// Rust `union_item` owns a `field_declaration_list` exactly as `struct_item`
|
|
334
|
+
// does, and its fields ARE captured as `Property`, but it is absent from
|
|
335
|
+
// `CLASS_CONTAINER_TYPES`, so `findEnclosingClassInfo` does not recognize it as
|
|
336
|
+
// an owner: union fields carry no `HAS_PROPERTY` edge at all and therefore
|
|
337
|
+
// cannot dangle. Listed here so the union's own id keeps the same shape as the
|
|
338
|
+
// struct beside it, and so making it a real owner later starts from a
|
|
339
|
+
// consistent id rather than having to move one.
|
|
340
|
+
'union_item',
|
|
341
|
+
]);
|
|
195
342
|
export const CONTAINER_TYPE_TO_LABEL = {
|
|
196
343
|
class_declaration: 'Class',
|
|
197
344
|
abstract_class_declaration: 'Class',
|
|
198
345
|
interface_declaration: 'Interface',
|
|
346
|
+
// Required by the CLASS_CONTAINER_TYPES invariant above: a container missing
|
|
347
|
+
// here gets orphaned member edges or a wrong owner label.
|
|
348
|
+
type_alias_declaration: 'TypeAlias',
|
|
199
349
|
struct_declaration: 'Struct',
|
|
200
350
|
struct_specifier: 'Struct',
|
|
201
351
|
class_specifier: 'Class',
|
|
@@ -259,6 +409,70 @@ export function findAncestorBeforeBoundary(node, targetTypes, boundaryTypes) {
|
|
|
259
409
|
}
|
|
260
410
|
return null;
|
|
261
411
|
}
|
|
412
|
+
/**
|
|
413
|
+
* Enclosing callable for grammars that split a callable into a SIGNATURE node
|
|
414
|
+
* and a SIBLING body, where the callable is therefore never an ancestor of the
|
|
415
|
+
* code inside it.
|
|
416
|
+
*
|
|
417
|
+
* Dart is the case that forced this: `int outer() { … }` parses as
|
|
418
|
+
* `function_signature` followed by `function_body` as SIBLINGS, so an ancestor
|
|
419
|
+
* walk from a closure inside the body can never reach `outer`. No membership
|
|
420
|
+
* set fixes that — the walk is looking in the wrong direction (#2699).
|
|
421
|
+
*
|
|
422
|
+
* Deliberately a FALLBACK, used only when the ancestor walk found nothing.
|
|
423
|
+
*
|
|
424
|
+
* The sibling must be a BARE SIGNATURE, and that restriction is load-bearing —
|
|
425
|
+
* "any preceding callable sibling" is WRONG and was caught regressing PHP. In
|
|
426
|
+
* `<?php function target($x) {…} $handler = function ($x) {…};` the closure is
|
|
427
|
+
* at FILE level, so the primary ancestor walk correctly finds nothing and this
|
|
428
|
+
* fallback runs; an unrestricted version then grabs the preceding
|
|
429
|
+
* `function_definition` and mis-qualifies the file-level `$handler` as
|
|
430
|
+
* `target.$handler`. A preceding sibling is only an ENCLOSING callable when it
|
|
431
|
+
* cannot hold its own body — i.e. when the grammar split the body off.
|
|
432
|
+
*
|
|
433
|
+
* `SPLIT_SIGNATURE_NODE_TYPES` is exactly that set, and it is derived rather
|
|
434
|
+
* than listed: `LOCAL_SCOPE_BODY_NODE_TYPES` already filters the bare-signature
|
|
435
|
+
* types out of `FUNCTION_NODE_TYPES`, so the difference between them IS the
|
|
436
|
+
* split-signature set. PHP's `function_definition` carries a body and is in
|
|
437
|
+
* both, so it is excluded; Dart's `function_signature` is in only the former,
|
|
438
|
+
* so it qualifies.
|
|
439
|
+
*
|
|
440
|
+
* Language-neutral by construction — it names no grammar, and any future
|
|
441
|
+
* signature/body-split language is covered for free.
|
|
442
|
+
*/
|
|
443
|
+
export function findSplitBodyCallableAncestor(node, signatureOnlyTypes, boundaryTypes) {
|
|
444
|
+
let current = node.parent;
|
|
445
|
+
while (current !== null) {
|
|
446
|
+
if (boundaryTypes.has(current.type))
|
|
447
|
+
return null;
|
|
448
|
+
const prev = current.previousNamedSibling;
|
|
449
|
+
if (prev !== null &&
|
|
450
|
+
signatureOnlyTypes.has(prev.type) &&
|
|
451
|
+
// `current` must be the signature's BODY, not merely the next thing after
|
|
452
|
+
// it. Without this, valid TypeScript trips the fallback: in
|
|
453
|
+
// declare namespace Api {
|
|
454
|
+
// function internalHelper(x): number;
|
|
455
|
+
// export function send(x): number;
|
|
456
|
+
// }
|
|
457
|
+
// `send`'s `export_statement` is the next sibling of `internalHelper`'s
|
|
458
|
+
// `function_signature`, so `send` was mis-qualified as
|
|
459
|
+
// `internalHelper.send@r:c`. TypeScript emits bodyless
|
|
460
|
+
// function_signature/method_signature for overloads and ambient
|
|
461
|
+
// declarations, so the split-signature set is NOT Dart-only.
|
|
462
|
+
//
|
|
463
|
+
// A body contains statements; a declaration wrapper contains another
|
|
464
|
+
// signature. Rejecting any `current` that directly holds a signature of
|
|
465
|
+
// its own separates the two without naming a grammar.
|
|
466
|
+
!current.namedChildren.some((child) => signatureOnlyTypes.has(child.type))) {
|
|
467
|
+
return prev;
|
|
468
|
+
}
|
|
469
|
+
current = current.parent;
|
|
470
|
+
}
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
// SPLIT_SIGNATURE_NODE_TYPES is defined next to LOCAL_SCOPE_BODY_NODE_TYPES,
|
|
474
|
+
// which it derives from — declaring it here would read it in its temporal dead
|
|
475
|
+
// zone and throw at module load (tsc does NOT catch that; only running does).
|
|
262
476
|
/**
|
|
263
477
|
* Determine the graph node label from a tree-sitter capture map.
|
|
264
478
|
* Handles language-specific reclassification via the provider's labelOverride hook
|
|
@@ -360,31 +574,29 @@ export function getLabelFromCaptures(captureMap, provider) {
|
|
|
360
574
|
* `MAX_ENCLOSING_WALK_ITERATIONS` defense-in-depth guard below prevents
|
|
361
575
|
* pathological hooks from creating an infinite loop. */
|
|
362
576
|
const MAX_ENCLOSING_WALK_ITERATIONS = 4096;
|
|
363
|
-
/**
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
* keeps this a no-op for C#, whose `object_creation_expression` uses
|
|
370
|
-
* `initializer_expression`, never `class_body` (#2550).
|
|
371
|
-
*
|
|
372
|
-
* The SAME name must be produced by every layer that keys the anonymous
|
|
373
|
-
* class (structure-phase node id, enclosing-owner walk, scope-side
|
|
374
|
-
* declaration synthesis, receiver typeBinding) — they agree by all calling
|
|
375
|
-
* this one helper.
|
|
376
|
-
*/
|
|
377
|
-
/** Type-declaration node types that can host (and name) a Java anonymous
|
|
378
|
-
* class body. Naming follows JLS 13.1: the binary name is the
|
|
379
|
-
* IMMEDIATELY enclosing type's binary name + `$N`, so the synthesized
|
|
380
|
-
* name is the `$`-joined chain of enclosing host names
|
|
381
|
-
* (`EnumWrap$Mode$1`), numbered per immediate host in source order. */
|
|
382
|
-
const JAVA_ANON_HOST_TYPES = new Set([
|
|
383
|
-
'class_declaration',
|
|
384
|
-
'enum_declaration',
|
|
385
|
-
'interface_declaration',
|
|
386
|
-
'record_declaration',
|
|
577
|
+
/** Named Java declarations that can host, or themselves be, local types. */
|
|
578
|
+
const JAVA_NAMED_TYPE_NODE_LABELS = new Map([
|
|
579
|
+
['class_declaration', 'Class'],
|
|
580
|
+
['enum_declaration', 'Enum'],
|
|
581
|
+
['interface_declaration', 'Interface'],
|
|
582
|
+
['record_declaration', 'Record'],
|
|
387
583
|
]);
|
|
584
|
+
const JAVA_ANON_HOST_TYPES = new Set(JAVA_NAMED_TYPE_NODE_LABELS.keys());
|
|
585
|
+
const JAVA_LOCAL_TYPE_CONTAINERS = new Set([
|
|
586
|
+
'block',
|
|
587
|
+
'constructor_body',
|
|
588
|
+
'switch_block_statement_group',
|
|
589
|
+
]);
|
|
590
|
+
/** A legal local type declaration is a class, enum, record, or interface
|
|
591
|
+
* directly occupying a block-statement position. Annotation interfaces are
|
|
592
|
+
* deliberately excluded: javac rejects local annotation declarations. */
|
|
593
|
+
export const javaLocalTypeDeclarationContainer = (node) => {
|
|
594
|
+
if (!JAVA_NAMED_TYPE_NODE_LABELS.has(node.type))
|
|
595
|
+
return null;
|
|
596
|
+
const parent = node.parent;
|
|
597
|
+
return parent !== null && JAVA_LOCAL_TYPE_CONTAINERS.has(parent.type) ? parent : null;
|
|
598
|
+
};
|
|
599
|
+
const isJavaLocalTypeNode = (node) => javaLocalTypeDeclarationContainer(node) !== null;
|
|
388
600
|
/** The two Java anonymous-class-body shapes (#2550/#2555): an
|
|
389
601
|
* `object_creation_expression` with a `class_body` child
|
|
390
602
|
* (`new Runnable() { ... }`), and an `enum_constant` with a `body:`
|
|
@@ -392,10 +604,7 @@ const JAVA_ANON_HOST_TYPES = new Set([
|
|
|
392
604
|
const isJavaAnonymousBodyNode = (node) => (node.type === 'object_creation_expression' &&
|
|
393
605
|
node.namedChildren?.some((c) => c.type === 'class_body') === true) ||
|
|
394
606
|
(node.type === 'enum_constant' && node.childForFieldName?.('body')?.type === 'class_body');
|
|
395
|
-
/** Nearest ancestor of `node` that is an enclosing
|
|
396
|
-
* a named host declaration OR another anonymous body (both shapes).
|
|
397
|
-
* Anonymous ancestors chain through: an anon inside an anon is
|
|
398
|
-
* `Host$1$1`, and an anon inside an enum constant body is `E$1$1`. */
|
|
607
|
+
/** Nearest ancestor of `node` that is an enclosing type per JLS 13.1. */
|
|
399
608
|
const nearestJavaEnclosingType = (node) => {
|
|
400
609
|
let cursor = node.parent;
|
|
401
610
|
let iterations = 0;
|
|
@@ -408,84 +617,134 @@ const nearestJavaEnclosingType = (node) => {
|
|
|
408
617
|
}
|
|
409
618
|
return null;
|
|
410
619
|
};
|
|
411
|
-
/**
|
|
412
|
-
*
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
const
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
620
|
+
/** Parse-tree-bounded memo. Sequence ordinals are built once per tree, avoiding
|
|
621
|
+
* a host-candidate scan for every extraction/ownership consumer. */
|
|
622
|
+
const javaTypeIdentityMemo = new WeakMap();
|
|
623
|
+
const javaHostKey = (node) => `${node.type}:${node.startIndex}`;
|
|
624
|
+
const javaIdentityCandidatesBelow = (root) => {
|
|
625
|
+
const seen = new Set();
|
|
626
|
+
const candidates = [];
|
|
627
|
+
for (const type of [
|
|
628
|
+
'object_creation_expression',
|
|
629
|
+
'enum_constant',
|
|
630
|
+
...JAVA_NAMED_TYPE_NODE_LABELS.keys(),
|
|
631
|
+
]) {
|
|
632
|
+
for (const candidate of root.descendantsOfType?.(type) ?? []) {
|
|
633
|
+
if (!isJavaAnonymousBodyNode(candidate) && !isJavaLocalTypeNode(candidate))
|
|
634
|
+
continue;
|
|
635
|
+
const key = javaHostKey(candidate);
|
|
636
|
+
if (seen.has(key))
|
|
637
|
+
continue;
|
|
638
|
+
seen.add(key);
|
|
639
|
+
candidates.push(candidate);
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
return candidates.sort((left, right) => left.startIndex - right.startIndex);
|
|
643
|
+
};
|
|
644
|
+
const buildJavaTypeIdentityState = (root) => {
|
|
645
|
+
const ordinalByStart = new Map();
|
|
646
|
+
const sequenceCounts = new Map();
|
|
647
|
+
for (const candidate of javaIdentityCandidatesBelow(root)) {
|
|
648
|
+
const host = nearestJavaEnclosingType(candidate);
|
|
649
|
+
if (host === null)
|
|
650
|
+
continue;
|
|
651
|
+
const isAnonymous = isJavaAnonymousBodyNode(candidate);
|
|
652
|
+
const bindingName = isAnonymous ? '' : candidate.childForFieldName?.('name')?.text;
|
|
653
|
+
// Anonymous types deliberately use the empty sequence key; malformed named
|
|
654
|
+
// declarations must not enter that sequence.
|
|
655
|
+
if (!isAnonymous && !bindingName)
|
|
656
|
+
continue;
|
|
657
|
+
const sequenceKey = `${javaHostKey(host)}:${bindingName}`;
|
|
658
|
+
const ordinal = (sequenceCounts.get(sequenceKey) ?? 0) + 1;
|
|
659
|
+
sequenceCounts.set(sequenceKey, ordinal);
|
|
660
|
+
ordinalByStart.set(candidate.startIndex, ordinal);
|
|
661
|
+
}
|
|
662
|
+
return { byStart: new Map(), ordinalByStart };
|
|
663
|
+
};
|
|
664
|
+
const javaTypeIdentityStateFor = (node) => {
|
|
421
665
|
const tree = node.tree;
|
|
422
|
-
if (tree
|
|
423
|
-
const
|
|
424
|
-
|
|
425
|
-
return cached;
|
|
666
|
+
if (tree === undefined) {
|
|
667
|
+
const host = nearestJavaEnclosingType(node);
|
|
668
|
+
return buildJavaTypeIdentityState(host ?? node);
|
|
426
669
|
}
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
670
|
+
let state = javaTypeIdentityMemo.get(tree);
|
|
671
|
+
if (state === undefined) {
|
|
672
|
+
state = buildJavaTypeIdentityState(tree.rootNode ?? node);
|
|
673
|
+
javaTypeIdentityMemo.set(tree, state);
|
|
674
|
+
}
|
|
675
|
+
return state;
|
|
676
|
+
};
|
|
677
|
+
/** Source-type-relative binary name of a Java enclosing type, including
|
|
678
|
+
* synthesized local/anonymous hosts and named member-type chains. */
|
|
679
|
+
const javaBinaryNameOfType = (node) => {
|
|
680
|
+
if (isJavaAnonymousBodyNode(node) || isJavaLocalTypeNode(node)) {
|
|
681
|
+
return synthesizeJavaTypeIdentity(node)?.name;
|
|
682
|
+
}
|
|
683
|
+
if (!JAVA_ANON_HOST_TYPES.has(node.type))
|
|
684
|
+
return undefined;
|
|
685
|
+
const simpleName = node.childForFieldName?.('name')?.text;
|
|
686
|
+
if (simpleName === undefined || simpleName.length === 0)
|
|
687
|
+
return undefined;
|
|
433
688
|
const enclosing = nearestJavaEnclosingType(node);
|
|
434
689
|
if (enclosing === null)
|
|
690
|
+
return simpleName;
|
|
691
|
+
const enclosingName = javaBinaryNameOfType(enclosing);
|
|
692
|
+
return enclosingName === undefined ? undefined : `${enclosingName}$${simpleName}`;
|
|
693
|
+
};
|
|
694
|
+
/**
|
|
695
|
+
* Authoritative Java local/anonymous type identity.
|
|
696
|
+
*
|
|
697
|
+
* JLS 13.1 defines the shape and immediate-host prefix. OpenJDK javac's
|
|
698
|
+
* Check.localClassName allocates N independently for each
|
|
699
|
+
* (enclosing binary name, local simple name) pair; anonymous types use the
|
|
700
|
+
* empty simple name and therefore have their own sequence. Package names are
|
|
701
|
+
* omitted from this project identity because graph ids already include the
|
|
702
|
+
* file path.
|
|
703
|
+
*/
|
|
704
|
+
export const synthesizeJavaTypeIdentity = (node) => {
|
|
705
|
+
const localLabel = JAVA_NAMED_TYPE_NODE_LABELS.get(node.type);
|
|
706
|
+
const isLocal = localLabel !== undefined && isJavaLocalTypeNode(node);
|
|
707
|
+
const isAnonymous = isJavaAnonymousBodyNode(node);
|
|
708
|
+
const enclosing = nearestJavaEnclosingType(node);
|
|
709
|
+
const memberSimpleName = !isLocal && !isAnonymous && localLabel !== undefined
|
|
710
|
+
? node.childForFieldName?.('name')?.text
|
|
711
|
+
: undefined;
|
|
712
|
+
const synthesizedHostIdentity = memberSimpleName !== undefined && enclosing !== null
|
|
713
|
+
? synthesizeJavaTypeIdentity(enclosing)
|
|
714
|
+
: undefined;
|
|
715
|
+
if (!isLocal && !isAnonymous && synthesizedHostIdentity === undefined)
|
|
435
716
|
return undefined;
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
return undefined;
|
|
454
|
-
hostNames.unshift(hostName);
|
|
455
|
-
}
|
|
456
|
-
cursor = cursor.parent;
|
|
457
|
-
}
|
|
458
|
-
prefix = hostNames.join('$');
|
|
459
|
-
}
|
|
460
|
-
// All anonymous bodies (both shapes) whose immediately enclosing TYPE
|
|
461
|
-
// is THIS one, in source order. `descendantsOfType` over the subtree
|
|
462
|
-
// also finds bodies belonging to nested enclosing types — filter them
|
|
463
|
-
// out by re-deriving each candidate's own enclosing type.
|
|
464
|
-
const candidates = [
|
|
465
|
-
...(enclosing.descendantsOfType?.('object_creation_expression') ?? []),
|
|
466
|
-
...(enclosing.descendantsOfType?.('enum_constant') ?? []),
|
|
467
|
-
]
|
|
468
|
-
.filter(isJavaAnonymousBodyNode)
|
|
469
|
-
.filter((c) => {
|
|
470
|
-
const host = nearestJavaEnclosingType(c);
|
|
471
|
-
return (host !== null && host.startIndex === enclosing.startIndex && host.type === enclosing.type);
|
|
472
|
-
})
|
|
473
|
-
.sort((a, b) => a.startIndex - b.startIndex);
|
|
474
|
-
if (tree !== undefined) {
|
|
475
|
-
let byStart = javaAnonNameMemo.get(tree);
|
|
476
|
-
if (byStart === undefined) {
|
|
477
|
-
byStart = new Map();
|
|
478
|
-
javaAnonNameMemo.set(tree, byStart);
|
|
479
|
-
}
|
|
480
|
-
for (let i = 0; i < candidates.length; i++) {
|
|
481
|
-
byStart.set(candidates[i].startIndex, `${prefix}$${i + 1}`);
|
|
482
|
-
}
|
|
483
|
-
return byStart.get(node.startIndex);
|
|
717
|
+
if (enclosing === null)
|
|
718
|
+
return undefined;
|
|
719
|
+
const state = javaTypeIdentityStateFor(node);
|
|
720
|
+
const cached = state.byStart.get(node.startIndex);
|
|
721
|
+
if (cached !== undefined)
|
|
722
|
+
return cached;
|
|
723
|
+
const prefix = javaBinaryNameOfType(enclosing);
|
|
724
|
+
if (prefix === undefined)
|
|
725
|
+
return undefined;
|
|
726
|
+
if (memberSimpleName !== undefined) {
|
|
727
|
+
const identity = {
|
|
728
|
+
name: `${prefix}$${memberSimpleName}`,
|
|
729
|
+
label: localLabel,
|
|
730
|
+
bindingName: memberSimpleName,
|
|
731
|
+
};
|
|
732
|
+
state.byStart.set(node.startIndex, identity);
|
|
733
|
+
return identity;
|
|
484
734
|
}
|
|
485
|
-
const
|
|
486
|
-
if (
|
|
735
|
+
const bindingName = isLocal ? node.childForFieldName?.('name')?.text : undefined;
|
|
736
|
+
if (isLocal && !bindingName)
|
|
487
737
|
return undefined;
|
|
488
|
-
|
|
738
|
+
const ordinal = state.ordinalByStart.get(node.startIndex);
|
|
739
|
+
if (ordinal === undefined)
|
|
740
|
+
return undefined;
|
|
741
|
+
const identity = {
|
|
742
|
+
name: `${prefix}$${ordinal}${bindingName ?? ''}`,
|
|
743
|
+
label: isAnonymous ? 'Class' : localLabel,
|
|
744
|
+
...(bindingName === undefined ? {} : { bindingName }),
|
|
745
|
+
};
|
|
746
|
+
state.byStart.set(node.startIndex, identity);
|
|
747
|
+
return identity;
|
|
489
748
|
};
|
|
490
749
|
export const findEnclosingClassInfo = (node, filePath, resolveEnclosingOwner,
|
|
491
750
|
/**
|
|
@@ -528,20 +787,26 @@ getQualifiedOwnerName) => {
|
|
|
528
787
|
}
|
|
529
788
|
}
|
|
530
789
|
}
|
|
531
|
-
// Go:
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
790
|
+
// Go: the `type_spec` IS the declared type (`type User struct { ... }`, and
|
|
791
|
+
// one per member of a grouped `type ( A struct{…}; B struct{…} )` block).
|
|
792
|
+
//
|
|
793
|
+
// Matched here rather than on the enclosing `type_declaration` (#2837): this
|
|
794
|
+
// walk climbs `node.parent`, so it passes THROUGH the containing spec on its
|
|
795
|
+
// way up from any member, and the structure it already has is the answer.
|
|
796
|
+
// Keying on the wrapper instead meant picking one spec out of several with
|
|
797
|
+
// no reference point — which filed every member of a grouped block under its
|
|
798
|
+
// FIRST struct, so two same-named fields minted one id and first-write-wins
|
|
799
|
+
// dropped the second.
|
|
800
|
+
if (current.type === 'type_spec') {
|
|
801
|
+
const typeBody = current.childForFieldName?.('type');
|
|
802
|
+
if (typeBody?.type === 'struct_type' || typeBody?.type === 'interface_type') {
|
|
803
|
+
const nameNode = current.childForFieldName?.('name');
|
|
804
|
+
if (nameNode) {
|
|
805
|
+
const label = typeBody.type === 'struct_type' ? 'Struct' : 'Interface';
|
|
806
|
+
return {
|
|
807
|
+
classId: generateId(label, `${filePath}:${nameNode.text}`),
|
|
808
|
+
className: nameNode.text,
|
|
809
|
+
};
|
|
545
810
|
}
|
|
546
811
|
}
|
|
547
812
|
}
|
|
@@ -553,12 +818,12 @@ getQualifiedOwnerName) => {
|
|
|
553
818
|
// enum constant, and every C# `object_creation_expression`), so the
|
|
554
819
|
// walk continues unchanged for those — including on to
|
|
555
820
|
// `enum_declaration`, which sits in CLASS_CONTAINER_TYPES below.
|
|
556
|
-
if (current
|
|
557
|
-
const
|
|
558
|
-
if (
|
|
821
|
+
if (isJavaAnonymousBodyNode(current) || JAVA_ANON_HOST_TYPES.has(current.type)) {
|
|
822
|
+
const identity = synthesizeJavaTypeIdentity(current);
|
|
823
|
+
if (identity !== undefined) {
|
|
559
824
|
return {
|
|
560
|
-
classId: generateId(
|
|
561
|
-
className:
|
|
825
|
+
classId: generateId(identity.label, `${filePath}:${identity.name}`),
|
|
826
|
+
className: identity.name,
|
|
562
827
|
};
|
|
563
828
|
}
|
|
564
829
|
}
|
|
@@ -715,6 +980,31 @@ getQualifiedOwnerName) => {
|
|
|
715
980
|
}
|
|
716
981
|
return null;
|
|
717
982
|
};
|
|
983
|
+
/**
|
|
984
|
+
* True when an object-literal member is contained by an array before reaching
|
|
985
|
+
* another callable or class boundary.
|
|
986
|
+
*
|
|
987
|
+
* An array does not provide a stable named owner for its elements, so members
|
|
988
|
+
* below one cannot use `<binding>.<member>` identity or ownership. They still
|
|
989
|
+
* need distinct graph identities, however; callers use this predicate to opt
|
|
990
|
+
* into source-position qualification while keeping ownership suppressed.
|
|
991
|
+
*/
|
|
992
|
+
export const isArrayContainedObjectLiteralMember = (node) => {
|
|
993
|
+
let current = node;
|
|
994
|
+
let sawObject = false;
|
|
995
|
+
while (current) {
|
|
996
|
+
if (current.type === 'object')
|
|
997
|
+
sawObject = true;
|
|
998
|
+
if (current.type === 'array' && sawObject)
|
|
999
|
+
return true;
|
|
1000
|
+
if (current !== node &&
|
|
1001
|
+
(FUNCTION_NODE_TYPES.has(current.type) || CLASS_CONTAINER_TYPES.has(current.type))) {
|
|
1002
|
+
return false;
|
|
1003
|
+
}
|
|
1004
|
+
current = current.parent;
|
|
1005
|
+
}
|
|
1006
|
+
return false;
|
|
1007
|
+
};
|
|
718
1008
|
/**
|
|
719
1009
|
* Block-statement AST types that disqualify an object-literal binding from
|
|
720
1010
|
* carrying a HAS_METHOD edge. A `const` declared inside one of these is block-
|
|
@@ -763,7 +1053,89 @@ const BLOCK_SCOPE_BOUNDARY_TYPES = new Set([
|
|
|
763
1053
|
* ancestor also returns null (catches block-scoped declarations inside
|
|
764
1054
|
* top-level `if`/`for`/`try`/etc., which cannot be imported).
|
|
765
1055
|
*/
|
|
766
|
-
|
|
1056
|
+
/**
|
|
1057
|
+
* Owner for the keys of an ANONYMOUS object literal in return position (R3-4).
|
|
1058
|
+
*
|
|
1059
|
+
* `return { symbol, score, wickRatio, … }` binds to nothing, so its keys had no
|
|
1060
|
+
* anchor and could not be qualified — which on the reporting repo left the
|
|
1061
|
+
* central payload of the signal pipeline, ~25 fields, entirely unqueryable.
|
|
1062
|
+
* There are 437 such sites in one backend directory, so this is the dominant
|
|
1063
|
+
* shape, not an edge case.
|
|
1064
|
+
*
|
|
1065
|
+
* The enclosing FUNCTION is the honest owner: the literal is that function's
|
|
1066
|
+
* return shape, which is a contract its callers consume. Qualifying by it keeps
|
|
1067
|
+
* two functions returning the same key name as two distinct nodes, exactly as
|
|
1068
|
+
* `ownerName` does for variable-bound literals.
|
|
1069
|
+
*
|
|
1070
|
+
* Returns null when the literal is not DIRECTLY returned (a nested literal, or
|
|
1071
|
+
* one inside a callback several frames down), because then the enclosing
|
|
1072
|
+
* function is not what the object describes.
|
|
1073
|
+
*/
|
|
1074
|
+
/**
|
|
1075
|
+
* True when this definition node is a key of a literal in RETURN position.
|
|
1076
|
+
*
|
|
1077
|
+
* Deliberately independent of whether an OWNER NAME could be derived. The two
|
|
1078
|
+
* are different questions, and conflating them mislabels the anonymous case:
|
|
1079
|
+
* `[function (row) { return { k: row.x }; }]` yields no name to qualify by, so
|
|
1080
|
+
* the owner lookup returns null — but the key is still a return shape, and
|
|
1081
|
+
* flagging it by owner-presence would leave it looking like a DECLARED anchor
|
|
1082
|
+
* and let it outrank a real declaration during narrowing.
|
|
1083
|
+
*/
|
|
1084
|
+
export const isReturnShapeProperty = (node) => {
|
|
1085
|
+
let current = node;
|
|
1086
|
+
let objectDepth = 0;
|
|
1087
|
+
while (current && objectDepth === 0) {
|
|
1088
|
+
if (current.type === 'object')
|
|
1089
|
+
objectDepth = 1;
|
|
1090
|
+
else if (FUNCTION_NODE_TYPES.has(current.type))
|
|
1091
|
+
return false;
|
|
1092
|
+
else
|
|
1093
|
+
current = current.parent;
|
|
1094
|
+
}
|
|
1095
|
+
return current?.parent?.type === 'return_statement';
|
|
1096
|
+
};
|
|
1097
|
+
export const findReturnShapeOwnerInfo = (node, filePath) => {
|
|
1098
|
+
// Walk to the literal this key belongs to; bail if it is nested inside
|
|
1099
|
+
// another object, whose shape it describes instead.
|
|
1100
|
+
let current = node;
|
|
1101
|
+
let objectDepth = 0;
|
|
1102
|
+
while (current && objectDepth === 0) {
|
|
1103
|
+
if (current.type === 'object')
|
|
1104
|
+
objectDepth = 1;
|
|
1105
|
+
else if (FUNCTION_NODE_TYPES.has(current.type))
|
|
1106
|
+
return null;
|
|
1107
|
+
else
|
|
1108
|
+
current = current.parent;
|
|
1109
|
+
}
|
|
1110
|
+
if (!current)
|
|
1111
|
+
return null;
|
|
1112
|
+
const literal = current;
|
|
1113
|
+
if (literal.parent?.type !== 'return_statement')
|
|
1114
|
+
return null;
|
|
1115
|
+
// The nearest enclosing function-like, and its name. An anonymous function
|
|
1116
|
+
// (a callback, an IIFE) gives nothing to qualify by, so those stay
|
|
1117
|
+
// unanchored rather than colliding on a shared empty owner.
|
|
1118
|
+
let fn = literal.parent.parent;
|
|
1119
|
+
while (fn && !FUNCTION_NODE_TYPES.has(fn.type))
|
|
1120
|
+
fn = fn.parent;
|
|
1121
|
+
if (!fn)
|
|
1122
|
+
return null;
|
|
1123
|
+
const nameNode = fn.childForFieldName?.('name');
|
|
1124
|
+
if (nameNode?.type === 'identifier' || nameNode?.type === 'property_identifier') {
|
|
1125
|
+
return { ownerName: nameNode.text };
|
|
1126
|
+
}
|
|
1127
|
+
// `const formatAlert = (…) => ({ … })` and `const f = function () {}`: the
|
|
1128
|
+
// name is on the declarator, not the function.
|
|
1129
|
+
const declarator = fn.parent;
|
|
1130
|
+
if (declarator?.type === 'variable_declarator') {
|
|
1131
|
+
const declName = declarator.childForFieldName?.('name');
|
|
1132
|
+
if (declName?.type === 'identifier')
|
|
1133
|
+
return { ownerName: declName.text };
|
|
1134
|
+
}
|
|
1135
|
+
void filePath;
|
|
1136
|
+
return null;
|
|
1137
|
+
};
|
|
1138
|
+
export const findObjectLiteralBindingInfo = (node, filePath, options) => {
|
|
767
1139
|
// ── Phase A: walk up from node, count `object` ancestors, find declarator
|
|
768
1140
|
let current = node;
|
|
769
1141
|
let objectDepth = 0;
|
|
@@ -772,6 +1144,12 @@ export const findObjectLiteralBindingInfo = (node, filePath) => {
|
|
|
772
1144
|
if (current.type === 'object') {
|
|
773
1145
|
objectDepth += 1;
|
|
774
1146
|
}
|
|
1147
|
+
if (current !== node && current.type === 'array') {
|
|
1148
|
+
// `const handlers = [{ run() {} }]` has no `handlers.run` member.
|
|
1149
|
+
// Crossing the array would mint a confident but false owner edge; keep
|
|
1150
|
+
// the existing conservative under-approximation used for nested objects.
|
|
1151
|
+
return null;
|
|
1152
|
+
}
|
|
775
1153
|
if (current.type === 'variable_declarator' && objectDepth >= 1) {
|
|
776
1154
|
if (objectDepth > 1) {
|
|
777
1155
|
// Method belongs to a nested object literal; safe under-approximation.
|
|
@@ -812,8 +1190,195 @@ export const findObjectLiteralBindingInfo = (node, filePath) => {
|
|
|
812
1190
|
const ownerLabel = declaration?.type === 'variable_declaration' ? 'Variable' : 'Const';
|
|
813
1191
|
return {
|
|
814
1192
|
ownerId: generateId(ownerLabel, `${filePath}:${nameNode.text}`),
|
|
1193
|
+
...(options?.includeOwnerName === true ? { ownerName: nameNode.text } : {}),
|
|
815
1194
|
};
|
|
816
1195
|
};
|
|
1196
|
+
/**
|
|
1197
|
+
* Find the owner of a member assigned by `<Owner>.prototype.<member> = fn`
|
|
1198
|
+
* (#2723 follow-up).
|
|
1199
|
+
*
|
|
1200
|
+
* Sibling of {@link findObjectLiteralBindingInfo}: same seam, same return
|
|
1201
|
+
* shape, different syntax. There the owner is the variable the literal is
|
|
1202
|
+
* bound to; here it is the identifier to the left of `.prototype`.
|
|
1203
|
+
*
|
|
1204
|
+
* The owner label is read from the file's own module-scope declaration, so the
|
|
1205
|
+
* edge points at the node that actually exists — `function Foo() {}` is a
|
|
1206
|
+
* `Function` node, `class Foo {}` is a `Class` node. When the file declares no
|
|
1207
|
+
* such name (the constructor lives in another module) no owner is claimed:
|
|
1208
|
+
* a HAS_METHOD edge to a fabricated node is worse than a top-level Method.
|
|
1209
|
+
*/
|
|
1210
|
+
export const findMemberAssignmentOwnerInfo = (node, filePath) => {
|
|
1211
|
+
const ownerName = prototypeAssignmentOwnerName(node) ?? thisAssignmentOwnerName(node);
|
|
1212
|
+
if (ownerName === null)
|
|
1213
|
+
return null;
|
|
1214
|
+
const root = node.tree?.rootNode;
|
|
1215
|
+
if (!root)
|
|
1216
|
+
return null;
|
|
1217
|
+
const ownerLabel = prototypeOwnerLabel(root, ownerName);
|
|
1218
|
+
if (ownerLabel === null)
|
|
1219
|
+
return null;
|
|
1220
|
+
return { ownerId: generateId(ownerLabel, `${filePath}:${ownerName}`), ownerName };
|
|
1221
|
+
};
|
|
1222
|
+
/** Right-hand-side node types that make an assignment a callable binding. */
|
|
1223
|
+
const CALLABLE_ASSIGNMENT_VALUE_TYPES = new Set([
|
|
1224
|
+
'arrow_function',
|
|
1225
|
+
'function_expression',
|
|
1226
|
+
'generator_function',
|
|
1227
|
+
]);
|
|
1228
|
+
/**
|
|
1229
|
+
* The receiver name of a `<Owner>.prototype.<member> = <function>` assignment,
|
|
1230
|
+
* or null when `assignment` is not that shape.
|
|
1231
|
+
*
|
|
1232
|
+
* Only a bare identifier owner is accepted. `a.b.prototype.c = …` and
|
|
1233
|
+
* `getClass().prototype.c = …` name an owner this layer cannot resolve to a
|
|
1234
|
+
* definition, so they are left alone rather than attributed to a guess.
|
|
1235
|
+
*/
|
|
1236
|
+
export const prototypeAssignmentOwnerName = (assignment) => {
|
|
1237
|
+
const left = callableAssignmentTarget(assignment);
|
|
1238
|
+
if (left === null)
|
|
1239
|
+
return null;
|
|
1240
|
+
const protoRef = left.childForFieldName('object');
|
|
1241
|
+
if (protoRef === null || protoRef.type !== 'member_expression')
|
|
1242
|
+
return null;
|
|
1243
|
+
if (protoRef.childForFieldName('property')?.text !== 'prototype')
|
|
1244
|
+
return null;
|
|
1245
|
+
const owner = protoRef.childForFieldName('object');
|
|
1246
|
+
if (owner === null || owner.type !== 'identifier')
|
|
1247
|
+
return null;
|
|
1248
|
+
return owner.text;
|
|
1249
|
+
};
|
|
1250
|
+
/** The `member_expression` being assigned a function value, or null. */
|
|
1251
|
+
const callableAssignmentTarget = (assignment) => {
|
|
1252
|
+
if (assignment.type !== 'assignment_expression')
|
|
1253
|
+
return null;
|
|
1254
|
+
const right = assignment.childForFieldName('right');
|
|
1255
|
+
if (right === null || !CALLABLE_ASSIGNMENT_VALUE_TYPES.has(right.type))
|
|
1256
|
+
return null;
|
|
1257
|
+
const left = assignment.childForFieldName('left');
|
|
1258
|
+
return left !== null && left.type === 'member_expression' ? left : null;
|
|
1259
|
+
};
|
|
1260
|
+
/**
|
|
1261
|
+
* The constructor function that owns a `this.member = <function>` assignment,
|
|
1262
|
+
* or null when there is none (module top level, or an owner this layer cannot
|
|
1263
|
+
* name).
|
|
1264
|
+
*
|
|
1265
|
+
* Only a `function_declaration` counts. An `arrow_function` does NOT bind its
|
|
1266
|
+
* own `this` (ECMA-262 gives it `[[ThisMode]] = lexical`), so the walk passes
|
|
1267
|
+
* through arrows to the function that actually binds the receiver — the same
|
|
1268
|
+
* rule `@receiver-owner.this` encodes in the scope queries (#2701). A class
|
|
1269
|
+
* method never reaches here: parse-worker resolves its owner from the
|
|
1270
|
+
* enclosing class container first.
|
|
1271
|
+
*/
|
|
1272
|
+
export const thisAssignmentOwnerName = (assignment) => {
|
|
1273
|
+
const left = callableAssignmentTarget(assignment);
|
|
1274
|
+
if (left === null)
|
|
1275
|
+
return null;
|
|
1276
|
+
if (left.childForFieldName('object')?.type !== 'this')
|
|
1277
|
+
return null;
|
|
1278
|
+
for (let anc = assignment.parent; anc !== null; anc = anc.parent) {
|
|
1279
|
+
if (anc.type === 'arrow_function')
|
|
1280
|
+
continue;
|
|
1281
|
+
if (anc.type === 'function_declaration') {
|
|
1282
|
+
const name = anc.childForFieldName('name');
|
|
1283
|
+
return name !== null && name.type === 'identifier' ? name.text : null;
|
|
1284
|
+
}
|
|
1285
|
+
// Any other receiver-binding form (function_expression, method_definition,
|
|
1286
|
+
// generator) owns the `this` but gives this layer no module-scope name to
|
|
1287
|
+
// point an owner edge at.
|
|
1288
|
+
if (FUNCTION_NODE_TYPES.has(anc.type) || CLASS_CONTAINER_TYPES.has(anc.type))
|
|
1289
|
+
return null;
|
|
1290
|
+
}
|
|
1291
|
+
return null;
|
|
1292
|
+
};
|
|
1293
|
+
/**
|
|
1294
|
+
* True when `node` is a `X.prototype.Y = <function>` or `this.Y = <function>`
|
|
1295
|
+
* assignment — i.e. a callable MEMBER rather than a free function.
|
|
1296
|
+
*
|
|
1297
|
+
* Takes the ASSIGNMENT node, because that is what the `@definition.function`
|
|
1298
|
+
* capture is anchored on and therefore what `provider.labelOverride` receives.
|
|
1299
|
+
*/
|
|
1300
|
+
export const isPrototypeMemberAssignmentNode = (node) => prototypeAssignmentOwnerName(node) !== null || isThisMemberAssignmentNode(node);
|
|
1301
|
+
/**
|
|
1302
|
+
* True when `node` is `module.exports = <anonymous function>` (#2723).
|
|
1303
|
+
*
|
|
1304
|
+
* The whole module IS the callable, so there is no property to take a name
|
|
1305
|
+
* from and the caller supplies a file-derived one. A NAMED function expression
|
|
1306
|
+
* is excluded — its own name is captured directly and is more informative.
|
|
1307
|
+
*/
|
|
1308
|
+
/**
|
|
1309
|
+
* True when `node` is `module.exports = <function>`, named or anonymous — the
|
|
1310
|
+
* CommonJS default export, where the whole module IS the callable.
|
|
1311
|
+
*
|
|
1312
|
+
* `exports = fn` is deliberately NOT this shape: reassigning the `exports`
|
|
1313
|
+
* binding does not export anything in CommonJS, it only breaks the alias to
|
|
1314
|
+
* `module.exports`.
|
|
1315
|
+
*/
|
|
1316
|
+
export const isCjsDefaultExportAssignment = (node) => {
|
|
1317
|
+
if (node.type !== 'assignment_expression')
|
|
1318
|
+
return false;
|
|
1319
|
+
const right = node.childForFieldName('right');
|
|
1320
|
+
if (right === null || !CALLABLE_ASSIGNMENT_VALUE_TYPES.has(right.type))
|
|
1321
|
+
return false;
|
|
1322
|
+
const left = node.childForFieldName('left');
|
|
1323
|
+
if (left === null || left.type !== 'member_expression')
|
|
1324
|
+
return false;
|
|
1325
|
+
return (left.childForFieldName('object')?.text === 'module' &&
|
|
1326
|
+
left.childForFieldName('property')?.text === 'exports');
|
|
1327
|
+
};
|
|
1328
|
+
/** True when `node` is a `this.Y = <function>` assignment, at any nesting. */
|
|
1329
|
+
export const isThisMemberAssignmentNode = (node) => {
|
|
1330
|
+
const left = callableAssignmentTarget(node);
|
|
1331
|
+
return left !== null && left.childForFieldName('object')?.type === 'this';
|
|
1332
|
+
};
|
|
1333
|
+
/**
|
|
1334
|
+
* The label the owner named by {@link prototypeAssignmentOwnerName} carries in
|
|
1335
|
+
* the graph, so the owner edge points at the node that actually exists.
|
|
1336
|
+
* Returns null when the file declares no such module-scope name.
|
|
1337
|
+
*/
|
|
1338
|
+
const prototypeOwnerLabel = (root, ownerName) => {
|
|
1339
|
+
for (const child of root.namedChildren) {
|
|
1340
|
+
const decl = child.type === 'export_statement' ? child.childForFieldName('declaration') : child;
|
|
1341
|
+
if (decl === null)
|
|
1342
|
+
continue;
|
|
1343
|
+
if (decl.childForFieldName('name')?.text === ownerName) {
|
|
1344
|
+
if (decl.type === 'class_declaration')
|
|
1345
|
+
return 'Class';
|
|
1346
|
+
if (decl.type === 'function_declaration' || decl.type === 'generator_function_declaration')
|
|
1347
|
+
return 'Function';
|
|
1348
|
+
}
|
|
1349
|
+
// `var Foo = function () {}` / `const Foo = () => {}` / `const Foo = class {}`.
|
|
1350
|
+
// The dominant pre-ES6 constructor form, and the population this whole
|
|
1351
|
+
// change targets. Without it `prototypeOwnerLabel` returned null, the
|
|
1352
|
+
// member fell back to an UNQUALIFIED `Method:<file>:<member>` id, and two
|
|
1353
|
+
// constructors defining the same member name in one file collapsed onto a
|
|
1354
|
+
// single node with no owner edges at all (#2729 review F6).
|
|
1355
|
+
if (!VARIABLE_DECLARATION_NODE_TYPES.has(decl.type))
|
|
1356
|
+
continue;
|
|
1357
|
+
for (const declarator of decl.namedChildren) {
|
|
1358
|
+
if (declarator.type !== 'variable_declarator')
|
|
1359
|
+
continue;
|
|
1360
|
+
if (declarator.childForFieldName('name')?.text !== ownerName)
|
|
1361
|
+
continue;
|
|
1362
|
+
const value = declarator.childForFieldName('value');
|
|
1363
|
+
if (value === null)
|
|
1364
|
+
continue;
|
|
1365
|
+
// Only a callable value is claimed. A closure binding reliably emits
|
|
1366
|
+
// `Function:<file>:<name>` (the #2687/#2693 convention), so the owner id
|
|
1367
|
+
// resolves to a node that exists. A class EXPRESSION or a require()-bound
|
|
1368
|
+
// value names an owner whose node label this layer cannot predict —
|
|
1369
|
+
// claim none rather than point an edge at a node that may not exist,
|
|
1370
|
+
// which is the same defect class this fix exists to remove.
|
|
1371
|
+
if (CALLABLE_ASSIGNMENT_VALUE_TYPES.has(value.type))
|
|
1372
|
+
return 'Function';
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
return null;
|
|
1376
|
+
};
|
|
1377
|
+
/** Declaration nodes carrying `variable_declarator` children (JS/TS). */
|
|
1378
|
+
const VARIABLE_DECLARATION_NODE_TYPES = new Set([
|
|
1379
|
+
'lexical_declaration',
|
|
1380
|
+
'variable_declaration',
|
|
1381
|
+
]);
|
|
817
1382
|
/** Convenience wrapper: returns just the class ID string (backward compat). */
|
|
818
1383
|
export const findEnclosingClassId = (node, filePath) => {
|
|
819
1384
|
return findEnclosingClassInfo(node, filePath)?.classId ?? null;
|
|
@@ -937,6 +1502,19 @@ export const LOCAL_SCOPE_BODY_NODE_TYPES = new Set([...FUNCTION_NODE_TYPES]
|
|
|
937
1502
|
'computed_setter', // Swift: set { }
|
|
938
1503
|
'computed_modify', // Swift: _modify { }
|
|
939
1504
|
]));
|
|
1505
|
+
/**
|
|
1506
|
+
* Callable node types whose grammar splits the body off into a SIBLING node, so
|
|
1507
|
+
* the callable is never an ancestor of the code inside it (Dart
|
|
1508
|
+
* `function_signature` / `method_signature`).
|
|
1509
|
+
*
|
|
1510
|
+
* Derived, not listed, so it cannot drift from the two sets that define it:
|
|
1511
|
+
* `LOCAL_SCOPE_BODY_NODE_TYPES` is `FUNCTION_NODE_TYPES` minus exactly the bare
|
|
1512
|
+
* signature types, so the difference IS the split-signature set.
|
|
1513
|
+
*
|
|
1514
|
+
* Must stay BELOW `LOCAL_SCOPE_BODY_NODE_TYPES` — reading it earlier hits the
|
|
1515
|
+
* temporal dead zone and throws at module load.
|
|
1516
|
+
*/
|
|
1517
|
+
export const SPLIT_SIGNATURE_NODE_TYPES = new Set([...FUNCTION_NODE_TYPES].filter((t) => !LOCAL_SCOPE_BODY_NODE_TYPES.has(t)));
|
|
940
1518
|
// ============================================================================
|
|
941
1519
|
// Generic AST traversal helpers (shared by parse-worker + php-helpers)
|
|
942
1520
|
// ============================================================================
|
|
@@ -975,12 +1553,11 @@ export function findChild(node, type) {
|
|
|
975
1553
|
}
|
|
976
1554
|
return null;
|
|
977
1555
|
}
|
|
978
|
-
/** Remove bidi-override and zero-width control characters
|
|
979
|
-
*
|
|
980
|
-
*
|
|
981
|
-
*
|
|
982
|
-
|
|
983
|
-
const stripBidiAndZeroWidth = (text) => Array.from(text)
|
|
1556
|
+
/** Remove bidi-override and zero-width control characters from attacker-
|
|
1557
|
+
* influenced repository text before it is exposed through graph descriptions
|
|
1558
|
+
* or MCP output (#2286). Global `sanitizeUTF8` intentionally remains focused
|
|
1559
|
+
* on encoding/control-character validity. */
|
|
1560
|
+
export const stripBidiAndZeroWidth = (text) => Array.from(text)
|
|
984
1561
|
.filter((ch) => {
|
|
985
1562
|
const c = ch.codePointAt(0) ?? 0;
|
|
986
1563
|
// Bidi overrides/isolates (U+202A–202E, U+2066–2069), zero-width
|