gitnexus 1.6.10-rc.99 → 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/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 +77 -32
- 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 +15 -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 +309 -15
- 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/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 +297 -15
- package/dist/core/ingestion/utils/ast-helpers.js +578 -46
- 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 -6
- package/dist/storage/parsedfile-store.js +76 -6
- package/dist/storage/repo-manager.d.ts +54 -441
- package/dist/storage/repo-manager.js +312 -221
- 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
|
@@ -19,7 +19,9 @@
|
|
|
19
19
|
* syntax). Languages with non-C-family syntax (Ruby blocks, COBOL)
|
|
20
20
|
* either don't trigger the call branch or skip this pass entirely.
|
|
21
21
|
*/
|
|
22
|
-
import {
|
|
22
|
+
import { erasedTypeApplication, matchingOpenParen, stripTemplateArguments, } from '../../utils/template-arguments.js';
|
|
23
|
+
import { decodeReceiverChain } from '../../utils/receiver-chain-codec.js';
|
|
24
|
+
import { findClassBindingInScope, resolveClassBindingForName, findEnclosingClassDef, findExportedDef, findExportedDefByName, findReceiverTypeBinding, isClassLike, isNamespaceNameShadowed, } from '../scope/walkers.js';
|
|
23
25
|
/** Max depth for compound-receiver chain resolution (`a().b().c().d()`).
|
|
24
26
|
* Practical code rarely exceeds 3-4 _syntactic_ hops, but languages
|
|
25
27
|
* with type-binding-mediated chains (Ruby's `x = obj.method()` binds
|
|
@@ -52,6 +54,440 @@ function parseMapTupleSentinel(text) {
|
|
|
52
54
|
return null;
|
|
53
55
|
return { tupleIdx: Number(idxStr), rhs };
|
|
54
56
|
}
|
|
57
|
+
/** Is this hop the language's construction selector applied to the class
|
|
58
|
+
* itself — `Factory.new` — rather than an ordinary member named `new` on a
|
|
59
|
+
* value? Both call sites ask the identical question, so it is asked in one
|
|
60
|
+
* place (#2708). `onClassConstant` is what separates `Factory.new` from
|
|
61
|
+
* `factory.new`; see the contract field for the known limitation around a
|
|
62
|
+
* class-level override of the selector. */
|
|
63
|
+
function isConstructionSelectorHop(memberName, receiverClass, onClassConstant, options) {
|
|
64
|
+
return (onClassConstant &&
|
|
65
|
+
options.constructionSyntax?.selector === memberName &&
|
|
66
|
+
isClassLike(receiverClass.type));
|
|
67
|
+
}
|
|
68
|
+
/** Escape a literal for embedding in a RegExp. The construction keyword comes
|
|
69
|
+
* from a language provider, so it is not user input, but a keyword containing
|
|
70
|
+
* a metacharacter would otherwise silently build a wrong pattern. */
|
|
71
|
+
function escapeForRegExp(literal) {
|
|
72
|
+
return literal.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Type of a construction expression's callee — the class it constructs.
|
|
76
|
+
*
|
|
77
|
+
* `Service` (bare, when the language constructs without a keyword) and
|
|
78
|
+
* `new Service` (keyword form) both name the class being built, so the
|
|
79
|
+
* expression's type is that class. Together with
|
|
80
|
+
* `isConstructionSelectorHop` (the `Class.new` spelling), this is where the
|
|
81
|
+
* rule "constructing a class yields an instance of it" lives; the
|
|
82
|
+
* per-language surface syntax arrives via `constructionSyntax` (#2708).
|
|
83
|
+
*
|
|
84
|
+
* Returns undefined when the language declares no construction syntax,
|
|
85
|
+
* when the callee names no class-like symbol reachable from `inScope`,
|
|
86
|
+
* or when the keyword is required but absent — never a guess.
|
|
87
|
+
*/
|
|
88
|
+
function resolveConstructionExpressionClass(fnExpr, inScope, scopes, index, options) {
|
|
89
|
+
const syntax = options.constructionSyntax;
|
|
90
|
+
if (syntax === undefined)
|
|
91
|
+
return undefined;
|
|
92
|
+
let calleeName;
|
|
93
|
+
// The keyword is separated from the type by whatever trivia the source
|
|
94
|
+
// used — `new Service`, `new\tService`, or a line break — so match the
|
|
95
|
+
// keyword as a whole token followed by at least one whitespace character
|
|
96
|
+
// rather than by exactly one space (#2708). `newService()` keeps failing
|
|
97
|
+
// the match, which is the point: it is an ordinary call.
|
|
98
|
+
const keywordMatch = syntax.keyword === undefined
|
|
99
|
+
? null
|
|
100
|
+
: new RegExp(`^${escapeForRegExp(syntax.keyword)}\\s+`).exec(fnExpr);
|
|
101
|
+
if (keywordMatch !== null) {
|
|
102
|
+
calleeName = fnExpr.slice(keywordMatch[0].length).trim();
|
|
103
|
+
}
|
|
104
|
+
else if (syntax.bare === true) {
|
|
105
|
+
calleeName = fnExpr;
|
|
106
|
+
}
|
|
107
|
+
// A `new`-keyword language reaching here without the keyword is an
|
|
108
|
+
// ordinary free call, not a construction — resolving it to the class
|
|
109
|
+
// would fabricate an edge (a factory function may share the class's
|
|
110
|
+
// name).
|
|
111
|
+
if (calleeName === undefined || calleeName.length === 0)
|
|
112
|
+
return undefined;
|
|
113
|
+
// Generic construction — `new Box<string>()` arrives here as `Box<string>`,
|
|
114
|
+
// which names no class binding. Retry on the base name, the same
|
|
115
|
+
// normalization `resolveClassBindingForName` (in `scope/walkers.ts`) already
|
|
116
|
+
// applies for typed receivers (#2708).
|
|
117
|
+
const baseName = stripTemplateArguments(calleeName).trim();
|
|
118
|
+
const lastDot = baseName.lastIndexOf('.');
|
|
119
|
+
if (lastDot !== -1) {
|
|
120
|
+
const namespaceName = baseName.slice(0, lastDot);
|
|
121
|
+
const exportedName = baseName.slice(lastDot + 1);
|
|
122
|
+
const namespaceFiles = options.namespaceTargets?.get(namespaceName) ?? [];
|
|
123
|
+
// A verified namespace is authoritative: do not fall through to the
|
|
124
|
+
// workspace-wide simple-name heuristics on either a miss or ambiguity.
|
|
125
|
+
if (namespaceFiles.length > 0) {
|
|
126
|
+
if (isNamespaceNameShadowed(namespaceName, inScope, scopes))
|
|
127
|
+
return undefined;
|
|
128
|
+
const namespaceMatches = namespaceFiles
|
|
129
|
+
.map((targetFile) => findExportedDef(targetFile, exportedName, index))
|
|
130
|
+
.filter((def) => def !== undefined && isClassLike(def.type));
|
|
131
|
+
return namespaceMatches.length === 1 ? namespaceMatches[0] : undefined;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const direct = findClassBindingInScope(inScope, calleeName, scopes);
|
|
135
|
+
if (direct !== undefined && isClassLike(direct.type))
|
|
136
|
+
return direct;
|
|
137
|
+
if (baseName.length > 0 && baseName !== calleeName) {
|
|
138
|
+
const viaBaseName = findClassBindingInScope(inScope, baseName, scopes);
|
|
139
|
+
if (viaBaseName !== undefined && isClassLike(viaBaseName.type))
|
|
140
|
+
return viaBaseName;
|
|
141
|
+
}
|
|
142
|
+
// Qualified callee — `new ns.Service()` / `new Outer.Inner()`. Prefer an
|
|
143
|
+
// unambiguous qualified-name match, then fall back to the trailing simple
|
|
144
|
+
// name the way receiver resolution does elsewhere (#2708).
|
|
145
|
+
if (lastDot === -1)
|
|
146
|
+
return undefined;
|
|
147
|
+
const qualifiedIds = scopes.qualifiedNames.get(baseName);
|
|
148
|
+
if (qualifiedIds.length === 1) {
|
|
149
|
+
const qualified = scopes.defs.get(qualifiedIds[0]);
|
|
150
|
+
if (qualified !== undefined && isClassLike(qualified.type))
|
|
151
|
+
return qualified;
|
|
152
|
+
}
|
|
153
|
+
const simpleName = baseName.slice(lastDot + 1);
|
|
154
|
+
if (simpleName.length === 0)
|
|
155
|
+
return undefined;
|
|
156
|
+
const viaSimpleName = findClassBindingInScope(inScope, simpleName, scopes);
|
|
157
|
+
return viaSimpleName !== undefined && isClassLike(viaSimpleName.type) ? viaSimpleName : undefined;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* The class a receiver position's DECLARED TYPE denotes — the one lookup every
|
|
161
|
+
* route in this file uses to turn a `TypeRef` into an owner to look the next
|
|
162
|
+
* member up on.
|
|
163
|
+
*
|
|
164
|
+
* ── WHY NOT `findClassBindingInScope(scope, typeRef.rawName)` ────────────────
|
|
165
|
+
*
|
|
166
|
+
* `rawName` is post-normalization, and several providers reduce a type
|
|
167
|
+
* APPLICATION to its base name at capture time (`Mapped[User]` → `Mapped`,
|
|
168
|
+
* `Repo<User>` → `Repo`). Handing that base name to the bare lookup takes its
|
|
169
|
+
* workspace-wide qualified-name fallback, which consults no scope, no import
|
|
170
|
+
* and no module: it binds whatever the workspace happens to declare under that
|
|
171
|
+
* name. A third-party `Mapped[User]` beside an unrelated workspace
|
|
172
|
+
* `class Mapped` then produces a confident WRONG edge — strictly worse than the
|
|
173
|
+
* missing one it replaced, and not recoverable downstream.
|
|
174
|
+
*
|
|
175
|
+
* `resolveClassBindingForName` owns the grounding rule for exactly this
|
|
176
|
+
* ({@link resolveErasedBaseName}: the scope chain binds the name, or the
|
|
177
|
+
* declaration is in the same file, or the index proves the name is a template
|
|
178
|
+
* family, or the file has no cross-file class channel to be absent from), but it
|
|
179
|
+
* is entered on the SPELLING — a name that already lost its arguments is
|
|
180
|
+
* indistinguishable from an ordinary class name. {@link erasedTypeApplication}
|
|
181
|
+
* restores the application from `declaredSpelling`, which is what puts a
|
|
182
|
+
* capture-time-erased receiver back on the grounded route.
|
|
183
|
+
*
|
|
184
|
+
* ── WHY IT IS ONE HELPER AND NOT FIVE CALL SITES ─────────────────────────────
|
|
185
|
+
*
|
|
186
|
+
* This file types a receiver position from a `TypeRef` in five places — the
|
|
187
|
+
* structural fold's member step and its module-hoist branch, the cascade's
|
|
188
|
+
* bare-identifier binding, the cascade's dotted-chain HEAD, and the cascade's
|
|
189
|
+
* per-segment member walk. They are five routes to ONE question, and only three
|
|
190
|
+
* were wired to the grounded lookup, which is what left the hole: a Python
|
|
191
|
+
* `self.m.save(u)` whose fold step correctly refused fell THROUGH to the
|
|
192
|
+
* cascade — a declined fold is documented as "no answer", never a veto — and
|
|
193
|
+
* the cascade's own ungrounded member walk re-minted the very edge the grounds
|
|
194
|
+
* had just rejected. One shared helper is what makes "the fold refused" and
|
|
195
|
+
* "the cascade refused" the same sentence, rather than two lookups that happen
|
|
196
|
+
* to agree until one of them is edited.
|
|
197
|
+
*
|
|
198
|
+
* `stripDecoration` stays a per-caller argument because it is a DIFFERENT
|
|
199
|
+
* normalization with its own risk — its own docstring records that turning a
|
|
200
|
+
* former `undefined` into a hit suppresses the `?? otherResolver(...)`
|
|
201
|
+
* fallbacks two dozen call sites rely on. The three fold/binding callers pass
|
|
202
|
+
* the provider's stripper as they always have; the two cascade callers pass
|
|
203
|
+
* nothing, as they always have. So the only behaviour this helper changes
|
|
204
|
+
* anywhere is the erasure grounding, and a `TypeRef` that was never reduced
|
|
205
|
+
* resolves through the identical `findClassBindingInScope` call it did before
|
|
206
|
+
* (`resolveClassBindingForName` tries that first, and a name with no `<`
|
|
207
|
+
* returns immediately after it).
|
|
208
|
+
*/
|
|
209
|
+
function classOfDeclaredType(typeRef, scopes, stripDecoration, recordReceiverType) {
|
|
210
|
+
// `declaredAtScope`, never a scope the caller chose: all five sites passed
|
|
211
|
+
// exactly this `TypeRef`'s own anchor, and taking it as a parameter is what
|
|
212
|
+
// would let a sixth quietly not — which is the hole this helper exists to
|
|
213
|
+
// close, one level up.
|
|
214
|
+
const spelling = erasedTypeApplication(typeRef) ?? typeRef.rawName;
|
|
215
|
+
const def = resolveClassBindingForName(typeRef.declaredAtScope, spelling, scopes, stripDecoration);
|
|
216
|
+
return noteReceiverType(recordReceiverType, spelling, def);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Report the SPELLING a receiver position was typed from, alongside the class
|
|
220
|
+
* it resolved to (#2912).
|
|
221
|
+
*
|
|
222
|
+
* The fold answers "which class", which is all dispatch needed until generic
|
|
223
|
+
* instantiation mattered: `IValidator<string>` and `IValidator<int>` fold to
|
|
224
|
+
* the same declaration. The spelling is the only place the arguments survive,
|
|
225
|
+
* and it exists at every one of these lookups already — reporting it costs a
|
|
226
|
+
* function call and changes no resolution.
|
|
227
|
+
*
|
|
228
|
+
* Pairing it with the def id is what makes it usable: the caller keeps the LAST
|
|
229
|
+
* report and uses it only if it names the class the fold ultimately returned,
|
|
230
|
+
* so a route that typed an intermediate position, or a later route that
|
|
231
|
+
* answered differently, cannot lend its arguments to another class.
|
|
232
|
+
*/
|
|
233
|
+
function noteReceiverType(record, spelling, def) {
|
|
234
|
+
if (def !== undefined)
|
|
235
|
+
record?.(spelling, def.nodeId);
|
|
236
|
+
return def;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* The class a CALL's return type names, reported to the receiver-type side
|
|
240
|
+
* channel — the return-type twin of {@link classOfDeclaredType}.
|
|
241
|
+
*
|
|
242
|
+
* The pairing it exists to keep in one place: the lookup goes through
|
|
243
|
+
* `rawName`, while the SPELLING reported alongside it is the erased type
|
|
244
|
+
* application, so an `IValidator<string>` return is reported with its
|
|
245
|
+
* arguments intact. The spelling is built only once the lookup has actually
|
|
246
|
+
* found a class, because it is discarded otherwise — and every fold hop
|
|
247
|
+
* through a call reaches this, generic or not.
|
|
248
|
+
*/
|
|
249
|
+
function classOfReturnType(retType, scopes, record) {
|
|
250
|
+
const def = findClassBindingInScope(retType.declaredAtScope, retType.rawName, scopes);
|
|
251
|
+
if (def === undefined || record === undefined)
|
|
252
|
+
return def;
|
|
253
|
+
return noteReceiverType(record, erasedTypeApplication(retType) ?? retType.rawName, def);
|
|
254
|
+
}
|
|
255
|
+
function typeOfMemberOnClass(owner, memberName, scopes, index, options) {
|
|
256
|
+
const classScopeByDefId = index.classScopeByDefId;
|
|
257
|
+
const ownerChain = [owner.nodeId, ...scopes.methodDispatch.mroFor(owner.nodeId)];
|
|
258
|
+
for (const ownerId of ownerChain) {
|
|
259
|
+
const classScope = classScopeByDefId.get(ownerId);
|
|
260
|
+
const memberType = classScope?.typeBindings.get(memberName);
|
|
261
|
+
if (memberType !== undefined) {
|
|
262
|
+
const def = classOfDeclaredType(memberType, scopes, options.stripTypePreservingDecoration, options.recordReceiverType);
|
|
263
|
+
// The declared type is reported even when it resolved to no class:
|
|
264
|
+
// `Promise<User>` and `[]Repo` name nothing in the workspace, and an
|
|
265
|
+
// await or index step unwrapping them is exactly how they become
|
|
266
|
+
// resolvable. Returning `undefined` here would strand those shapes. A
|
|
267
|
+
// `def` that stayed absent is reported as absent, NOT as the previous
|
|
268
|
+
// owner, so nothing may fold an ordinary member off this position.
|
|
269
|
+
return {
|
|
270
|
+
def,
|
|
271
|
+
declaredType: memberType.declaredSpelling ?? memberType.rawName,
|
|
272
|
+
declaredAtScope: memberType.declaredAtScope,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
// Languages whose binding-scope hook hoists a method's return-type binding
|
|
276
|
+
// out of the class body and onto an ancestor (Module) scope keep NOTHING in
|
|
277
|
+
// the class scope to find — TypeScript is one, via `tsBindingScopeFor`, so
|
|
278
|
+
// without this walk the fold cannot type a single step in the first
|
|
279
|
+
// language it ships for. Gated on the same contract flag
|
|
280
|
+
// `resolveCompoundReceiverClass` uses, so a language that does not hoist
|
|
281
|
+
// cannot pick up an unrelated module-level binding of the same name.
|
|
282
|
+
if (classScope !== undefined && options.hoistTypeBindingsToModule === true) {
|
|
283
|
+
let curId = classScope.parent;
|
|
284
|
+
while (curId !== null) {
|
|
285
|
+
const curScope = scopes.scopeTree.getScope(curId);
|
|
286
|
+
if (curScope === undefined)
|
|
287
|
+
break;
|
|
288
|
+
const hoisted = curScope.typeBindings.get(memberName);
|
|
289
|
+
if (hoisted !== undefined) {
|
|
290
|
+
// Same stripper the primary branch above passes. Omitting it here
|
|
291
|
+
// meant a decorated declared type (`*Host`) resolved on one branch and
|
|
292
|
+
// not the other, for the same member of the same class.
|
|
293
|
+
const def = classOfDeclaredType(hoisted, scopes, options.stripTypePreservingDecoration, options.recordReceiverType);
|
|
294
|
+
// Identical to the primary branch: a declared type that named no
|
|
295
|
+
// class is still a usable position when the next step unwraps it.
|
|
296
|
+
// Returning `undefined` here made `svc.getMap()['k'].run()` decline
|
|
297
|
+
// while byte-identical `byId['k'].run()` resolved, purely because ten
|
|
298
|
+
// languages route return-type bindings through this hoisted branch
|
|
299
|
+
// and the other through the class scope.
|
|
300
|
+
return {
|
|
301
|
+
def,
|
|
302
|
+
declaredType: hoisted.declaredSpelling ?? hoisted.rawName,
|
|
303
|
+
declaredAtScope: hoisted.declaredAtScope,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
curId = curScope.parent;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return undefined;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Type a receiver from its decoded structure instead of from its source text.
|
|
314
|
+
*
|
|
315
|
+
* Resolves the base, then folds the steps base-first, each step typed against
|
|
316
|
+
* the class the previous step produced. Returns `undefined` the moment any step
|
|
317
|
+
* fails to type, so the caller falls back to the existing text cascade rather
|
|
318
|
+
* than receiving a partially-folded guess — a missing edge is recoverable, a
|
|
319
|
+
* confidently wrong one is not.
|
|
320
|
+
*
|
|
321
|
+
* The base is resolved by handing it to `resolveCompoundReceiverClass`, which
|
|
322
|
+
* already owns the bare-identifier path in full: type binding, static
|
|
323
|
+
* class-name receivers, map-tuple sentinels, member aliases and call-result
|
|
324
|
+
* aliases. A second implementation of that would drift from it.
|
|
325
|
+
*
|
|
326
|
+
* Called from `resolveCompoundReceiverClass` ahead of the text cascade, and only
|
|
327
|
+
* when the site carries a `receiverChain` (see the `depth === 0` gate below).
|
|
328
|
+
*/
|
|
329
|
+
export function foldReceiverChain(chain, inScope, scopes, index, options = {}) {
|
|
330
|
+
// A truncated chain is missing the head that decides the final type. The
|
|
331
|
+
// producer refuses to mint one, so this is defence in depth against a
|
|
332
|
+
// future producer that does.
|
|
333
|
+
if (chain.truncated)
|
|
334
|
+
return undefined;
|
|
335
|
+
if (chain.steps.length === 0)
|
|
336
|
+
return undefined;
|
|
337
|
+
// `receiverChain` is dropped before resolving the base: it describes the
|
|
338
|
+
// whole receiver, and handing it back to the resolver would re-enter this
|
|
339
|
+
// fold on the base and never terminate.
|
|
340
|
+
const baseDef = resolveCompoundReceiverClass(chain.baseReceiverName, inScope, scopes, index, {
|
|
341
|
+
...options,
|
|
342
|
+
fieldFallback: false,
|
|
343
|
+
receiverChain: undefined,
|
|
344
|
+
strictBaseBinding: true,
|
|
345
|
+
});
|
|
346
|
+
// The base's own declared type is carried too, so a chain whose FIRST step is
|
|
347
|
+
// an unwrap (`repos[0].save()` — index applied directly to the base) has the
|
|
348
|
+
// container spelling available. Without it that shape declines at step 1.
|
|
349
|
+
// Looked up ONLY when something will read it: the base failed to resolve (so
|
|
350
|
+
// an unwrap step is the last chance), or an index step will unwrap the
|
|
351
|
+
// container. `resolveCompoundReceiverClass` already walked the scope chain for
|
|
352
|
+
// this same name above, so doing it unconditionally duplicated that walk on
|
|
353
|
+
// every fold — and the U10 census says 86% of chains are pure field/call and
|
|
354
|
+
// never read it.
|
|
355
|
+
const needsBaseDeclaredType = baseDef === undefined || chain.steps.some((step) => step.kind === 'index');
|
|
356
|
+
const baseBinding = needsBaseDeclaredType
|
|
357
|
+
? findReceiverTypeBinding(inScope, chain.baseReceiverName, scopes)
|
|
358
|
+
: undefined;
|
|
359
|
+
// A base whose declared type names no class is NOT automatically a dead end:
|
|
360
|
+
// `repos: User[]` binds to the literal `User[]`, which matches no class
|
|
361
|
+
// because a container is not one. That position is still usable IF the next
|
|
362
|
+
// step unwraps it — which is exactly what an index step does. Carrying it
|
|
363
|
+
// forward with the marker lets that step recover; every other step kind
|
|
364
|
+
// declines on the marker, so nothing folds against a phantom owner.
|
|
365
|
+
if (baseDef === undefined && baseBinding === undefined)
|
|
366
|
+
return undefined;
|
|
367
|
+
let current = {
|
|
368
|
+
def: baseDef,
|
|
369
|
+
declaredType: baseBinding?.declaredSpelling ?? baseBinding?.rawName,
|
|
370
|
+
declaredAtScope: baseBinding?.declaredAtScope,
|
|
371
|
+
};
|
|
372
|
+
for (const step of chain.steps) {
|
|
373
|
+
// A position whose declared type named no class can only be advanced by an
|
|
374
|
+
// unwrapping step. Folding an ordinary member off it would look the member
|
|
375
|
+
// up on the PREVIOUS class — a wrong owner, silently.
|
|
376
|
+
//
|
|
377
|
+
// `await` IS identity, and soundly so: every language whose capture layer
|
|
378
|
+
// reduces the wrapper has ALREADY done it by the time a binding reaches the
|
|
379
|
+
// fold (TypeScript strips `Promise<X>`, C# strips `Task<X>`), and awaiting a
|
|
380
|
+
// value that is NOT a thenable yields that same value — so both regimes land
|
|
381
|
+
// on the identical answer and there is nothing to distinguish.
|
|
382
|
+
if (step.kind === 'await')
|
|
383
|
+
continue;
|
|
384
|
+
if (step.kind === 'index') {
|
|
385
|
+
// An index step is NOT identity, and that asymmetry with `await` above is
|
|
386
|
+
// the whole point. `await` on a non-promise is a no-op; a subscript on a
|
|
387
|
+
// non-container is not — it yields the element of an indexer whose type
|
|
388
|
+
// is a different class entirely.
|
|
389
|
+
//
|
|
390
|
+
// The NORMALIZED type name cannot tell the two regimes apart: capture
|
|
391
|
+
// reduces `repos: User[]` to `User`, so a reduced container and a class
|
|
392
|
+
// the source merely subscripted (`grid: Grid` where `Grid` declares an
|
|
393
|
+
// index signature) both arrive as a bare, resolvable class name. Falling
|
|
394
|
+
// back to identity there kept `current` on the CONTAINER and looked the
|
|
395
|
+
// next member up on it — `grid[0].run()` → `Grid.run`, `t[0].Render()` →
|
|
396
|
+
// `Table.Render`. A confidently wrong owner, which is strictly worse than
|
|
397
|
+
// no edge and invisible to a bench that scores edge PRESENCE.
|
|
398
|
+
//
|
|
399
|
+
// So the step demands positive evidence instead: `declaredType`, the
|
|
400
|
+
// AS-WRITTEN spelling (`TypeRef.declaredSpelling`, preserved precisely
|
|
401
|
+
// because `rawName` threw it away), handed to the language's
|
|
402
|
+
// `elementTypeOf`. A provider that does not recognize the spelling as a
|
|
403
|
+
// container is answering "not a container", and the only sound move is to
|
|
404
|
+
// decline — a language must therefore answer the `index` route to get
|
|
405
|
+
// index folding at all.
|
|
406
|
+
const declared = current.declaredType;
|
|
407
|
+
const element = declared === undefined ? undefined : options.elementTypeOf?.(declared, { kind: 'index' });
|
|
408
|
+
if (element === undefined)
|
|
409
|
+
return undefined;
|
|
410
|
+
const scopeForLookup = current.declaredAtScope ?? inScope;
|
|
411
|
+
const elementClass = findClassBindingInScope(scopeForLookup, element, scopes, options.stripTypePreservingDecoration);
|
|
412
|
+
if (elementClass === undefined)
|
|
413
|
+
return undefined;
|
|
414
|
+
current = {
|
|
415
|
+
def: elementClass,
|
|
416
|
+
declaredType: element,
|
|
417
|
+
declaredAtScope: scopeForLookup,
|
|
418
|
+
};
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
// Construction is NOT an ordinary member lookup. `Factory.new` on a class
|
|
422
|
+
// constant denotes an instance of Factory, and the cascade already encodes
|
|
423
|
+
// that (`isConstructionSelectorHop`) along with the class-constant test that
|
|
424
|
+
// separates it from an instance method genuinely named `new`. The fold
|
|
425
|
+
// carries no such distinction — a chain step records a name, not whether its
|
|
426
|
+
// base was a class reference or a value — so folding one would resolve
|
|
427
|
+
// `Factory.new.run` against whatever member named `new` the lookup reaches
|
|
428
|
+
// first. That turned a correct edge into a WRONG one (Ruby
|
|
429
|
+
// `Factory.new.run` → `Product.run`), which is the failure mode this whole
|
|
430
|
+
// line of work exists to avoid. Decline and let the cascade answer.
|
|
431
|
+
//
|
|
432
|
+
// Placed AFTER the name-free continues above, deliberately. When it sat
|
|
433
|
+
// first, `options.constructionSyntax?.selector === step.name` compared
|
|
434
|
+
// `undefined === undefined` for every await/index step in a language with no
|
|
435
|
+
// construction selector, vetoing the entire fold before it ran — which is
|
|
436
|
+
// why those receivers minted a chain, fired the gate, and produced no edge.
|
|
437
|
+
// Position, not a guard, is what makes that unreachable: only named steps
|
|
438
|
+
// get here.
|
|
439
|
+
if (options.constructionSyntax?.selector === step.name)
|
|
440
|
+
return undefined;
|
|
441
|
+
if (current.def === undefined)
|
|
442
|
+
return undefined;
|
|
443
|
+
const next = typeOfMemberOnClass(current.def, step.name, scopes, index, options);
|
|
444
|
+
if (next === undefined)
|
|
445
|
+
return undefined;
|
|
446
|
+
current = next;
|
|
447
|
+
}
|
|
448
|
+
// A chain that ended without a class returns undefined naturally — no
|
|
449
|
+
// separate guard, because `def` IS the signal.
|
|
450
|
+
//
|
|
451
|
+
// The receiver-type report is made HERE, from the final `FoldState`, because
|
|
452
|
+
// that record pairs the class with the spelling that produced it BY
|
|
453
|
+
// CONSTRUCTION — same step, same lookup. The individual `classOfDeclaredType`
|
|
454
|
+
// calls inside the fold also report, including from steps that were later
|
|
455
|
+
// folded past, so the last of those is not reliably about the class the fold
|
|
456
|
+
// returns. Reporting the final state last makes it the one that stands.
|
|
457
|
+
if (current.def !== undefined && current.declaredType !== undefined) {
|
|
458
|
+
options.recordReceiverType?.(current.declaredType, current.def.nodeId);
|
|
459
|
+
}
|
|
460
|
+
return current.def;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* {@link resolveCompoundReceiverClass}, paired with the spelling that typed the
|
|
464
|
+
* position (#2912).
|
|
465
|
+
*
|
|
466
|
+
* The sink is created and read HERE, per call, which is the whole point: a
|
|
467
|
+
* recorder that outlives one resolution has to be reset by hand before every
|
|
468
|
+
* call, and the retry shapes in this pass make two calls in a row — a reset
|
|
469
|
+
* missed at one of them silently attributes the previous receiver's spelling to
|
|
470
|
+
* this one. A local cannot be forgotten.
|
|
471
|
+
*
|
|
472
|
+
* The def-id guard is the second half. Lookups that lost — an MRO walk that
|
|
473
|
+
* moved on, a fold step later folded past — report too, so a report counts only
|
|
474
|
+
* when it names the class actually returned. `foldReceiverChain` reports its
|
|
475
|
+
* final state last for exactly this reason, so the structural route wins.
|
|
476
|
+
*/
|
|
477
|
+
export function resolveCompoundReceiverTyped(receiverText, inScope, scopes, index, options = {}) {
|
|
478
|
+
let spelling;
|
|
479
|
+
let spellingDefId;
|
|
480
|
+
const def = resolveCompoundReceiverClass(receiverText, inScope, scopes, index, {
|
|
481
|
+
...options,
|
|
482
|
+
recordReceiverType: (reported, defId) => {
|
|
483
|
+
spelling = reported;
|
|
484
|
+
spellingDefId = defId;
|
|
485
|
+
},
|
|
486
|
+
});
|
|
487
|
+
if (def === undefined)
|
|
488
|
+
return undefined;
|
|
489
|
+
return { def, declaredSpelling: spellingDefId === def.nodeId ? spelling : undefined };
|
|
490
|
+
}
|
|
55
491
|
export function resolveCompoundReceiverClass(receiverText, inScope, scopes, index, options = {}, depth = 0) {
|
|
56
492
|
const classScopeByDefId = index.classScopeByDefId;
|
|
57
493
|
if (depth > COMPOUND_RECEIVER_MAX_DEPTH)
|
|
@@ -60,6 +496,26 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
|
|
|
60
496
|
if (text.length === 0)
|
|
61
497
|
return undefined;
|
|
62
498
|
const fieldFallback = options.fieldFallback ?? true;
|
|
499
|
+
// ── Structural fold, ahead of the text cascade ───────────────────
|
|
500
|
+
// When the capture layer produced a chain for this site, type the receiver
|
|
501
|
+
// from that structure. The cascade below dispatches on enumerated textual
|
|
502
|
+
// shapes, so every new spelling (`?.`, `!`, `<T>`, `->`) needs another branch;
|
|
503
|
+
// the AST already knew the answer and the chain carries it.
|
|
504
|
+
//
|
|
505
|
+
// Only at depth 0 — the chain describes THIS site's receiver, not the inner
|
|
506
|
+
// expressions the cascade recurses into.
|
|
507
|
+
//
|
|
508
|
+
// A failed fold falls through rather than returning: structure is an
|
|
509
|
+
// additional route to an answer, never a veto on the existing one, so a site
|
|
510
|
+
// the cascade could already resolve keeps resolving.
|
|
511
|
+
if (depth === 0 && options.receiverChain !== undefined) {
|
|
512
|
+
const decoded = decodeReceiverChain(options.receiverChain);
|
|
513
|
+
if (decoded !== undefined) {
|
|
514
|
+
const folded = foldReceiverChain(decoded, inScope, scopes, index, options);
|
|
515
|
+
if (folded !== undefined)
|
|
516
|
+
return folded;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
63
519
|
// ── Pre-processing: strip C-style cast expressions (opt-in) ──────
|
|
64
520
|
// Cast-wrapped receivers like ((Type)((Object)this.field)).method()
|
|
65
521
|
// produce parenthesized-expression receiver text. For languages that
|
|
@@ -103,6 +559,20 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
|
|
|
103
559
|
return undefined;
|
|
104
560
|
return findClassBindingInScope(rhsTb.declaredAtScope, arg, scopes);
|
|
105
561
|
}
|
|
562
|
+
// A language may declare that `this` IS the enclosing class rather than a
|
|
563
|
+
// per-function-scope binding (`ScopeResolver.resolveThisViaEnclosingClass`,
|
|
564
|
+
// the same flag Case 0.5 in `receiver-bound-calls` uses for a BARE `this`
|
|
565
|
+
// receiver). Such a language synthesizes no `this` typeBinding anywhere, so
|
|
566
|
+
// a chain whose BASE is `this` — `this->repo.save(u)`, `this.repo.save(u)` —
|
|
567
|
+
// had no way to seed its head and folded to nothing. Measured for the
|
|
568
|
+
// NON-generic control too, so it was never a generics gap.
|
|
569
|
+
// Placed before the typeBinding read: a language that DOES bind `this` per
|
|
570
|
+
// function scope never sets the flag, so nothing else can reach this.
|
|
571
|
+
if (workingText === 'this' && options.resolveThisViaEnclosingClass === true) {
|
|
572
|
+
const enclosing = findEnclosingClassDef(inScope, scopes);
|
|
573
|
+
if (enclosing !== undefined)
|
|
574
|
+
return enclosing;
|
|
575
|
+
}
|
|
106
576
|
const tb = findReceiverTypeBinding(inScope, workingText, scopes);
|
|
107
577
|
if (tb !== undefined) {
|
|
108
578
|
// Map for-of: binding name is `user` but rawType is
|
|
@@ -118,7 +588,7 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
|
|
|
118
588
|
return undefined;
|
|
119
589
|
return findClassBindingInScope(rhsTb.declaredAtScope, arg, scopes);
|
|
120
590
|
}
|
|
121
|
-
const viaTb =
|
|
591
|
+
const viaTb = classOfDeclaredType(tb, scopes, options.stripTypePreservingDecoration, options.recordReceiverType);
|
|
122
592
|
if (viaTb !== undefined)
|
|
123
593
|
return viaTb;
|
|
124
594
|
// Member-alias / call-result shapes store the RHS path on rawName
|
|
@@ -148,6 +618,12 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
|
|
|
148
618
|
return compound;
|
|
149
619
|
}
|
|
150
620
|
}
|
|
621
|
+
// Mirror the dotted-chain head rule below (`headType ? … : …`): a binding
|
|
622
|
+
// that EXISTS but resolves to no class means "not a typed receiver", not
|
|
623
|
+
// "try the class namespace instead". Only the structural fold opts in; the
|
|
624
|
+
// cascade keeps its historical fallthrough so no existing edge moves.
|
|
625
|
+
if (tb !== undefined && options.strictBaseBinding === true)
|
|
626
|
+
return undefined;
|
|
151
627
|
return findClassBindingInScope(inScope, workingText, scopes);
|
|
152
628
|
}
|
|
153
629
|
// Trailing `()` — call expression. Strip it and resolve the function
|
|
@@ -161,26 +637,66 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
|
|
|
161
637
|
const fnExpr = workingText.slice(0, openIdx).trim();
|
|
162
638
|
if (fnExpr.length === 0)
|
|
163
639
|
return undefined;
|
|
640
|
+
// A keyword-marked construction is never an `obj.method()` call, even when
|
|
641
|
+
// the type is qualified (`new ns.Service()`), so it must be resolved before
|
|
642
|
+
// the dot-split below routes it into member resolution (#2708).
|
|
643
|
+
const keyword = options.constructionSyntax?.keyword;
|
|
644
|
+
if (keyword !== undefined && new RegExp(`^${escapeForRegExp(keyword)}\\s`).test(fnExpr)) {
|
|
645
|
+
return resolveConstructionExpressionClass(fnExpr, inScope, scopes, index, options);
|
|
646
|
+
}
|
|
164
647
|
const lastDot = fnExpr.lastIndexOf('.');
|
|
165
648
|
if (lastDot === -1) {
|
|
166
649
|
// Free call `name()`. Look up function in scope, then its
|
|
167
650
|
// return-type typeBinding (which lives in the function's
|
|
168
651
|
// enclosing scope per the language's return-type hoist rule).
|
|
169
652
|
const fnDef = findExportedDefByName(fnExpr, inScope, scopes, index);
|
|
170
|
-
if (fnDef
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
653
|
+
if (fnDef !== undefined) {
|
|
654
|
+
const retType = findReceiverTypeBinding(inScope, fnExpr, scopes);
|
|
655
|
+
const viaReturn = retType === undefined
|
|
656
|
+
? undefined
|
|
657
|
+
: classOfReturnType(retType, scopes, options.recordReceiverType);
|
|
658
|
+
if (viaReturn !== undefined)
|
|
659
|
+
return viaReturn;
|
|
660
|
+
}
|
|
661
|
+
// Inline construction — `Service(db).m()` / `new Service(db).m()`.
|
|
662
|
+
// The constructed value IS the receiver, so there is no binding to
|
|
663
|
+
// read a type off; the return-type path above cannot help either,
|
|
664
|
+
// because a class has no return-type binding. Type it from the
|
|
665
|
+
// class the callee names (#2708).
|
|
666
|
+
return resolveConstructionExpressionClass(fnExpr, inScope, scopes, index, options);
|
|
176
667
|
}
|
|
177
668
|
// `obj.method()` — resolve obj's class, look up method's return
|
|
178
669
|
// type on that class scope (or the MRO).
|
|
179
670
|
const objExpr = fnExpr.slice(0, lastDot);
|
|
180
671
|
const methodName = fnExpr.slice(lastDot + 1);
|
|
181
672
|
const objClass = resolveCompoundReceiverClass(objExpr, inScope, scopes, index, options, depth + 1);
|
|
182
|
-
if (objClass === undefined)
|
|
673
|
+
if (objClass === undefined) {
|
|
674
|
+
// A verified namespace-qualified bare constructor is syntactically
|
|
675
|
+
// indistinguishable from an untyped member call here. Only the namespace
|
|
676
|
+
// map makes the constructor interpretation safe.
|
|
677
|
+
if (options.namespaceTargets?.has(objExpr) === true) {
|
|
678
|
+
return resolveConstructionExpressionClass(fnExpr, inScope, scopes, index, options);
|
|
679
|
+
}
|
|
183
680
|
return undefined;
|
|
681
|
+
}
|
|
682
|
+
// Does `objExpr` name the CLASS ITSELF (`Factory.new`) rather than a
|
|
683
|
+
// value whose type is that class (`factory.new`)? Only the former is
|
|
684
|
+
// a construction — see the selector fallback below. A bare identifier
|
|
685
|
+
// that resolves straight to the class binding is the class constant;
|
|
686
|
+
// anything reached through a typeBinding is an instance.
|
|
687
|
+
const objIsClassConstant = !objExpr.includes('(') &&
|
|
688
|
+
!objExpr.includes('.') &&
|
|
689
|
+
findClassBindingInScope(inScope, objExpr, scopes)?.nodeId === objClass.nodeId;
|
|
690
|
+
// Selector-form construction — `Factory.new.do_work` (#2708). Gated on the
|
|
691
|
+
// receiver naming the CLASS: `factory.new` is an ordinary call to a member
|
|
692
|
+
// named `new` on an instance, and reading that as construction replaced a
|
|
693
|
+
// correct edge with a wrong one. For the class constant, construction wins
|
|
694
|
+
// over any recorded binding for the selector, because a member named `new`
|
|
695
|
+
// on a class is an instance method Ruby never reaches through the constant
|
|
696
|
+
// (see the contract's KNOWN LIMITATION note for the `def self.new` case).
|
|
697
|
+
if (isConstructionSelectorHop(methodName, objClass, objIsClassConstant, options)) {
|
|
698
|
+
return objClass;
|
|
699
|
+
}
|
|
184
700
|
let retType;
|
|
185
701
|
const ownerChain = [objClass.nodeId, ...scopes.methodDispatch.mroFor(objClass.nodeId)];
|
|
186
702
|
for (const ownerId of ownerChain) {
|
|
@@ -246,7 +762,7 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
|
|
|
246
762
|
}
|
|
247
763
|
if (retType === undefined)
|
|
248
764
|
return undefined;
|
|
249
|
-
return
|
|
765
|
+
return classOfReturnType(retType, scopes, options.recordReceiverType);
|
|
250
766
|
}
|
|
251
767
|
// Mixed dotted + call chain: `obj.field.method().field.method()…`.
|
|
252
768
|
// Split at top-level `.` (those NOT inside balanced `(...)`) so a
|
|
@@ -263,7 +779,7 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
|
|
|
263
779
|
// the final segment and unwraps the receiver's generic, return
|
|
264
780
|
// the element class directly. Resolved before the field-walk
|
|
265
781
|
// because Dictionary-family types aren't local class defs.
|
|
266
|
-
if (options.
|
|
782
|
+
if (options.elementTypeOf !== undefined && parts.length >= 2) {
|
|
267
783
|
const last = parts[parts.length - 1];
|
|
268
784
|
const headInner = parts[0];
|
|
269
785
|
if (last === undefined || headInner === undefined)
|
|
@@ -294,7 +810,12 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
|
|
|
294
810
|
prefixType = cur;
|
|
295
811
|
}
|
|
296
812
|
if (prefixType !== undefined) {
|
|
297
|
-
|
|
813
|
+
// `rawName`, not `declaredSpelling`, and deliberately: the accessor route
|
|
814
|
+
// only fires on a multi-arg container (`Dictionary<K,V>`), which every
|
|
815
|
+
// provider's capture-time normalization leaves ALONE — so the two are the
|
|
816
|
+
// same string here, and reading the spelling would change nothing except
|
|
817
|
+
// to widen an unmeasured surface.
|
|
818
|
+
const elemName = options.elementTypeOf(prefixType.rawName, { kind: 'accessor', name: last });
|
|
298
819
|
if (elemName !== undefined) {
|
|
299
820
|
return findClassBindingInScope(prefixType.declaredAtScope, elemName, scopes);
|
|
300
821
|
}
|
|
@@ -305,9 +826,27 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
|
|
|
305
826
|
return undefined;
|
|
306
827
|
const headMemberName = stripCallParens(head);
|
|
307
828
|
const headType = findReceiverTypeBinding(inScope, headMemberName, scopes);
|
|
829
|
+
// The typed arm reads a DECLARED TYPE and so goes through the grounded lookup
|
|
830
|
+
// (see {@link classOfDeclaredType}); the untyped arm resolves the head NAME as
|
|
831
|
+
// the source WROTE it — a static class receiver — which was never erased and
|
|
832
|
+
// keeps the bare lookup.
|
|
833
|
+
//
|
|
834
|
+
// NO MEASURED CASE OF ITS OWN, and that is worth saying plainly: every fixture
|
|
835
|
+
// reaching here has an un-erased head (`self`, `this`, a local), for which the
|
|
836
|
+
// two lookups are the same call. It is changed because leaving one of five
|
|
837
|
+
// sibling reads of a `TypeRef` on the ungrounded lookup is precisely how the
|
|
838
|
+
// hole below survived — three were wired, two were not, and only one of the
|
|
839
|
+
// two had a fixture. See `classOfDeclaredType` for why this cannot change a
|
|
840
|
+
// `TypeRef` that was never reduced.
|
|
308
841
|
let currentClass = headType
|
|
309
|
-
?
|
|
842
|
+
? classOfDeclaredType(headType, scopes, undefined, options.recordReceiverType)
|
|
310
843
|
: findClassBindingInScope(inScope, headMemberName, scopes);
|
|
844
|
+
// Whether the walk currently sits on the CLASS ITSELF rather than on a
|
|
845
|
+
// value of that class. Seeded true only when the head resolved straight to
|
|
846
|
+
// a class binding (`Factory.new…`); a head reached through a typeBinding
|
|
847
|
+
// (`factory = Factory.new` then `factory.new…`) is already an instance.
|
|
848
|
+
// Every hop past the head yields a value, so it clears below (#2708).
|
|
849
|
+
let currentIsClassConstant = headType === undefined && currentClass !== undefined;
|
|
311
850
|
// Head seed for a literal `this` head with no receiver typeBinding in
|
|
312
851
|
// scope: languages synthesize `this` typeBindings per function scope,
|
|
313
852
|
// so a chain site outside any function scope (a field initializer or
|
|
@@ -320,10 +859,20 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
|
|
|
320
859
|
// lexically enclosing class would fabricate edges. Head resolution
|
|
321
860
|
// only; the per-segment walk below is shared with every other
|
|
322
861
|
// chain shape.
|
|
862
|
+
//
|
|
863
|
+
// A language may ALSO declare that `this` is always the enclosing class —
|
|
864
|
+
// `ScopeResolver.resolveThisViaEnclosingClass`, the same flag Case 0.5 in
|
|
865
|
+
// `receiver-bound-calls` already uses for a bare `this` receiver. Such a
|
|
866
|
+
// language deliberately synthesizes no `this` typeBinding anywhere, so the
|
|
867
|
+
// initializer-context test above can never be true inside a method body and
|
|
868
|
+
// every `this->field.m()` / `this.field.m()` chain folded to nothing —
|
|
869
|
+
// measured for the NON-generic control too, so it was never a generics gap.
|
|
870
|
+
// Reading the provider flag keeps the rule language-free: a language that
|
|
871
|
+
// does bind `this` per function scope does not set it, and is unaffected.
|
|
323
872
|
if (currentClass === undefined &&
|
|
324
873
|
headType === undefined &&
|
|
325
874
|
headMemberName === 'this' &&
|
|
326
|
-
isInitializerContext(inScope, scopes)) {
|
|
875
|
+
(isInitializerContext(inScope, scopes) || options.resolveThisViaEnclosingClass === true)) {
|
|
327
876
|
currentClass = findEnclosingClassDef(inScope, scopes);
|
|
328
877
|
}
|
|
329
878
|
// `const user = getUser(); user.address` — the typeBinding for `user`
|
|
@@ -336,11 +885,30 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
|
|
|
336
885
|
!headType.rawName.includes('(')) {
|
|
337
886
|
currentClass = resolveCompoundReceiverClass(`${headType.rawName}()`, inScope, scopes, index, options, depth + 1);
|
|
338
887
|
}
|
|
888
|
+
// Construction in the chain HEAD — `new Service().inner.doWork()` (#2708).
|
|
889
|
+
// The head arrives as `new Service()`, which `stripCallParens` reduces to
|
|
890
|
+
// `new Service`: no binding and no class of that name, so the walk was never
|
|
891
|
+
// seeded and the whole chain resolved to nothing. A constructed value is an
|
|
892
|
+
// instance, so `currentIsClassConstant` correctly stays false here.
|
|
893
|
+
if (currentClass === undefined) {
|
|
894
|
+
currentClass = resolveConstructionExpressionClass(headMemberName, inScope, scopes, index, options);
|
|
895
|
+
}
|
|
339
896
|
for (let i = 1; i < parts.length && currentClass !== undefined; i++) {
|
|
340
897
|
const segment = parts[i];
|
|
341
898
|
if (segment === undefined)
|
|
342
899
|
break;
|
|
343
900
|
const memberName = stripCallParens(segment);
|
|
901
|
+
// Selector-form construction mid-chain — `Factory.new.do_work`, including
|
|
902
|
+
// the parenthesis-less spelling that never reaches the call branch above
|
|
903
|
+
// (#2708). Gated on the walk sitting on the CLASS itself: after
|
|
904
|
+
// `factory = Factory.new`, `factory.new` is an ordinary instance-member
|
|
905
|
+
// call and must keep normal resolution.
|
|
906
|
+
if (isConstructionSelectorHop(memberName, currentClass, currentIsClassConstant, options)) {
|
|
907
|
+
// Constructing yields an INSTANCE of the same class: the walk stays on
|
|
908
|
+
// `currentClass` but no longer sits on the class constant.
|
|
909
|
+
currentIsClassConstant = false;
|
|
910
|
+
continue;
|
|
911
|
+
}
|
|
344
912
|
const cs = classScopeByDefId.get(currentClass.nodeId);
|
|
345
913
|
let memberType = cs?.typeBindings.get(memberName);
|
|
346
914
|
if (memberType === undefined &&
|
|
@@ -371,13 +939,20 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
|
|
|
371
939
|
}
|
|
372
940
|
return undefined;
|
|
373
941
|
}
|
|
374
|
-
|
|
942
|
+
// THE MEASURED HOLE (#2833 follow-up). This is the cascade's copy of the
|
|
943
|
+
// fold's member step, and it read the possibly-erased `rawName` directly.
|
|
944
|
+
// A Python `self.m.save(u)` whose fold step refused `Mapped[User]` on
|
|
945
|
+
// grounds fell through here — a declined fold is documented as "no answer",
|
|
946
|
+
// never a veto — and this walk re-minted `other.py:Mapped` from the
|
|
947
|
+
// workspace index. Same rule, same lookup, so the two routes now agree.
|
|
948
|
+
let nextClass = classOfDeclaredType(memberType, scopes, undefined, options.recordReceiverType);
|
|
375
949
|
if (nextClass === undefined) {
|
|
376
950
|
const fromMap = unwrapMapValueToClass(memberType, scopes);
|
|
377
951
|
if (fromMap !== undefined)
|
|
378
952
|
nextClass = fromMap;
|
|
379
953
|
}
|
|
380
954
|
currentClass = nextClass;
|
|
955
|
+
currentIsClassConstant = false;
|
|
381
956
|
}
|
|
382
957
|
return currentClass;
|
|
383
958
|
}
|
|
@@ -445,24 +1020,6 @@ function isInitializerContext(startScope, scopes) {
|
|
|
445
1020
|
}
|
|
446
1021
|
return false;
|
|
447
1022
|
}
|
|
448
|
-
/** Find the index of the `(` that matches the trailing `)` of a
|
|
449
|
-
* call-expression text. Returns -1 if unbalanced. */
|
|
450
|
-
function matchingOpenParen(text) {
|
|
451
|
-
if (!text.endsWith(')'))
|
|
452
|
-
return -1;
|
|
453
|
-
let depth = 0;
|
|
454
|
-
for (let i = text.length - 1; i >= 0; i--) {
|
|
455
|
-
const ch = text[i];
|
|
456
|
-
if (ch === ')')
|
|
457
|
-
depth++;
|
|
458
|
-
else if (ch === '(') {
|
|
459
|
-
depth--;
|
|
460
|
-
if (depth === 0)
|
|
461
|
-
return i;
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
return -1;
|
|
465
|
-
}
|
|
466
1023
|
/** Max peel iterations for `stripCastWrappers`. Real cast nesting —
|
|
467
1024
|
* including decompiler output like `((Target)((Object)expr))` —
|
|
468
1025
|
* is a handful of levels, and each cast level costs at most two
|