cgraphx 2.0.1 → 2.0.3
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/dist/.claude-template/FLOW-MAP.md +7 -5
- package/dist/.claude-template/commands/end.md +1 -1
- package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +2 -1
- package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +4 -2
- package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +5 -2
- package/dist/.claude-template/skills/iboc-check/SKILL.md +116 -0
- package/dist/.claude-template/skills/iboc-check/filler-prompt.md +75 -0
- package/dist/.claude-template/skills/implementation/SKILL.md +7 -0
- package/dist/.claude-template/skills/init-project-guides/SKILL.md +1 -1
- package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
- package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
- package/dist/.claude-template/skills/write-api/assets/template-request.bru +3 -3
- package/dist/.claude-template/skills/write-api/references/bru-format.md +6 -6
- package/dist/.claude-template/skills/write-delivery-guide/SKILL.md +97 -0
- package/dist/.claude-template/skills/write-delivery-guide/template-change-type.md +120 -0
- package/dist/.claude-template/skills/write-delivery-guide/template-multi-role-flow.md +148 -0
- package/dist/.claude-template/skills/write-unit-test-code/SKILL.md +23 -6
- package/dist/core/code/engine/cli/analyze-config.js +320 -0
- package/dist/core/code/engine/cli/analyze.js +1086 -0
- package/dist/core/code/engine/cli/cli-message.js +83 -0
- package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
- package/dist/core/code/engine/cli/embedding-dims.js +43 -0
- package/dist/core/code/engine/cli/format-elapsed.js +12 -0
- package/dist/core/code/engine/cli/help-i18n.js +144 -0
- package/dist/core/code/engine/cli/i18n/en.js +110 -0
- package/dist/core/code/engine/cli/i18n/index.js +47 -0
- package/dist/core/code/engine/cli/i18n/resources.js +9 -0
- package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
- package/dist/core/code/engine/cli/lazy-action.js +67 -0
- package/dist/core/code/engine/cli/optional-grammars.js +136 -0
- package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
- package/dist/core/code/engine/cli/status.js +156 -0
- package/dist/core/code/engine/cli/tool.js +384 -0
- package/dist/core/code/engine/config/ignore-service.js +511 -0
- package/dist/core/code/engine/config/supported-languages.js +17 -0
- package/dist/core/code/engine/core/analysis-features.js +64 -0
- package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
- package/dist/core/code/engine/core/git-staleness.js +180 -0
- package/dist/core/code/engine/core/graph/graph.js +180 -0
- package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
- package/dist/core/code/engine/core/graph/types.js +2 -0
- package/dist/core/code/engine/core/index-freshness.js +12 -0
- package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
- package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
- package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
- package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
- package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
- package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
- package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
- package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
- package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
- package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
- package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
- package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
- package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
- package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
- package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
- package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
- package/dist/core/code/engine/core/ingestion/constants.js +26 -0
- package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
- package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
- package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
- package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
- package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
- package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
- package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
- package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
- package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
- package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
- package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
- package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
- package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
- package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
- package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
- package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
- package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
- package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
- package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
- package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
- package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
- package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
- package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
- package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
- package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
- package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
- package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
- package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
- package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
- package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
- package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
- package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
- package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
- package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
- package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
- package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
- package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
- package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
- package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
- package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
- package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
- package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
- package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
- package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
- package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
- package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
- package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
- package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
- package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
- package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
- package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
- package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
- package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
- package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
- package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
- package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
- package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
- package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
- package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
- package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
- package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
- package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
- package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
- package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
- package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
- package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
- package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
- package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
- package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
- package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
- package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
- package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
- package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
- package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
- package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
- package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
- package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
- package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
- package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
- package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
- package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
- package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
- package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
- package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
- package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
- package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
- package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
- package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
- package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
- package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
- package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
- package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
- package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
- package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
- package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
- package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
- package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
- package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
- package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
- package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
- package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
- package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
- package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
- package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
- package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
- package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
- package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
- package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
- package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
- package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
- package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
- package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
- package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
- package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
- package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
- package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
- package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
- package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
- package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
- package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
- package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
- package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
- package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
- package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
- package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
- package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
- package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
- package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
- package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
- package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
- package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
- package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
- package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
- package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
- package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
- package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
- package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
- package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
- package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
- package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
- package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
- package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
- package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
- package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
- package/dist/core/code/engine/core/lbug/native-check.js +435 -0
- package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
- package/dist/core/code/engine/core/lbug/query-params.js +25 -0
- package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
- package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
- package/dist/core/code/engine/core/lbug/schema.js +771 -0
- package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
- package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
- package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
- package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
- package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
- package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
- package/dist/core/code/engine/core/logger.js +339 -0
- package/dist/core/code/engine/core/platform/capabilities.js +91 -0
- package/dist/core/code/engine/core/run-analyze.js +1098 -0
- package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
- package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
- package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
- package/dist/core/code/engine/lib/utils.js +121 -0
- package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
- package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
- package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
- package/dist/core/code/engine/mcp/local/limits.js +15 -0
- package/dist/core/code/engine/mcp/local/line-display.js +6 -0
- package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
- package/dist/core/code/engine/storage/branch-index.js +72 -0
- package/dist/core/code/engine/storage/file-hash.js +95 -0
- package/dist/core/code/engine/storage/fs-atomic.js +34 -0
- package/dist/core/code/engine/storage/git.js +555 -0
- package/dist/core/code/engine/storage/index-lock.js +664 -0
- package/dist/core/code/engine/storage/parse-cache.js +650 -0
- package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
- package/dist/core/code/engine/storage/repo-manager.js +1061 -0
- package/dist/core/code/engine/storage/scope-index-store.js +247 -0
- package/dist/core/code/engine/types/pipeline.js +2 -0
- package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
- package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
- package/dist/core/code/shared/graph/types.js +8 -0
- package/dist/core/code/shared/index.js +105 -0
- package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
- package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
- package/dist/core/code/shared/integrations/retry.js +70 -0
- package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
- package/dist/core/code/shared/language-detection.js +162 -0
- package/dist/core/code/shared/languages.js +27 -0
- package/dist/core/code/shared/lbug/schema-constants.js +98 -0
- package/dist/core/code/shared/mro-strategy.js +2 -0
- package/dist/core/code/shared/pipeline.js +5 -0
- package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
- package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
- package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
- package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
- package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
- package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
- package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
- package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
- package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
- package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
- package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
- package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
- package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
- package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
- package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
- package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
- package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
- package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
- package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
- package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
- package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
- package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
- package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
- package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
- package/dist/core/code/shared/scope-resolution/types.js +25 -0
- package/dist/core/code/shared/test-helpers.js +17 -0
- package/dist/core/code/vendor/leiden/index.cjs +355 -0
- package/dist/core/code/vendor/leiden/utils.cjs +419 -0
- package/dist/core/features/scanner.d.ts +2 -0
- package/dist/core/features/scanner.d.ts.map +1 -1
- package/dist/core/features/scanner.js +27 -6
- package/dist/core/features/scanner.js.map +1 -1
- package/dist/core/timeline/cli.d.ts.map +1 -1
- package/dist/core/timeline/cli.js +13 -6
- package/dist/core/timeline/cli.js.map +1 -1
- package/dist/core/timeline/debris.d.ts +20 -0
- package/dist/core/timeline/debris.d.ts.map +1 -0
- package/dist/core/timeline/debris.js +124 -0
- package/dist/core/timeline/debris.js.map +1 -0
- package/dist/core/timeline/hook-runner.d.ts.map +1 -1
- package/dist/core/timeline/hook-runner.js +3 -1
- package/dist/core/timeline/hook-runner.js.map +1 -1
- package/dist/core/timeline/hooks.d.ts.map +1 -1
- package/dist/core/timeline/hooks.js +13 -5
- package/dist/core/timeline/hooks.js.map +1 -1
- package/dist/core/timeline/installer.d.ts +2 -0
- package/dist/core/timeline/installer.d.ts.map +1 -1
- package/dist/core/timeline/installer.js +12 -0
- package/dist/core/timeline/installer.js.map +1 -1
- package/dist/core/timeline/project-root.d.ts +21 -0
- package/dist/core/timeline/project-root.d.ts.map +1 -0
- package/dist/core/timeline/project-root.js +83 -0
- package/dist/core/timeline/project-root.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,873 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Emit CALLS edges for free-call reference sites whose target is
|
|
4
|
+
* imported (or otherwise visible only via post-finalize scope.bindings).
|
|
5
|
+
*
|
|
6
|
+
* The shared `MethodRegistry.lookup` only consults `scope.bindings`
|
|
7
|
+
* (pre-finalize / local-only) for free calls. Cross-file imports land
|
|
8
|
+
* in `indexes.bindings` (post-finalize). Without this fallback, every
|
|
9
|
+
* `from x import f; f()` resolves to "unresolved".
|
|
10
|
+
*
|
|
11
|
+
* **Free-call dedup contract (Contract Invariant I2):** free calls
|
|
12
|
+
* collapse to one CALLS edge per (caller, target) pair regardless of
|
|
13
|
+
* how many call sites the caller contains. Mirrors the legacy DAG's
|
|
14
|
+
* dedup semantics (what the `default-params` / `variadic` / `overload`
|
|
15
|
+
* fixtures expect). Member calls keep position-based dedup elsewhere.
|
|
16
|
+
*
|
|
17
|
+
* Generic; promoted from `languages/python/scope-resolver.ts` per the scope-resolution
|
|
18
|
+
* generalization plan.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.emitFreeCallFallback = emitFreeCallFallback;
|
|
22
|
+
exports.buildGlobalCallableIndex = buildGlobalCallableIndex;
|
|
23
|
+
exports.buildGlobalClassIndex = buildGlobalClassIndex;
|
|
24
|
+
exports.pickUniqueGlobalCallable = pickUniqueGlobalCallable;
|
|
25
|
+
exports.pickUniqueGlobalClass = pickUniqueGlobalClass;
|
|
26
|
+
exports.pickImplicitThisOverload = pickImplicitThisOverload;
|
|
27
|
+
const ids_js_1 = require("../graph-bridge/ids.js");
|
|
28
|
+
const walkers_js_1 = require("../scope/walkers.js");
|
|
29
|
+
const overload_narrowing_js_1 = require("./overload-narrowing.js");
|
|
30
|
+
function emitFreeCallFallback(graph, scopes, parsedFiles, nodeLookup, _referenceIndex, handledSites, model, workspaceIndex, options = {}) {
|
|
31
|
+
let emitted = 0;
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
// Build an O(1) simple-name -> callable defs index over scopes.defs once
|
|
34
|
+
// per pass so pickUniqueGlobalCallable doesn't re-scan defs.byId.values()
|
|
35
|
+
// per call site. Same name + callable-kind filter that the previous scan
|
|
36
|
+
// applied (see pickUniqueGlobalCallable JSDoc). Cost: O(|defs|) once.
|
|
37
|
+
const globalCallablesBySimpleName = buildGlobalCallableIndex(scopes);
|
|
38
|
+
// Sibling index for constructor-form class fallback. Built once here so
|
|
39
|
+
// pickUniqueGlobalClass is O(1)-per-site rather than re-scanning
|
|
40
|
+
// defs.byId.values() at every constructor call. Same simple-name keying
|
|
41
|
+
// and class-like kind filter the previous per-site scan applied.
|
|
42
|
+
const globalClassesBySimpleName = buildGlobalClassIndex(scopes);
|
|
43
|
+
// Workspace file-path set for `resolveQualifiedFreeCall` (a module path maps
|
|
44
|
+
// to a file by language convention). Built lazily and once: languages without
|
|
45
|
+
// the hook never pay for it.
|
|
46
|
+
let allFilePathsMemo;
|
|
47
|
+
const allFilePaths = () => (allFilePathsMemo ??= new Set(parsedFiles.map((p) => p.filePath)));
|
|
48
|
+
// Per-pass memo of pickUniqueGlobalCallable's post-filter candidate list,
|
|
49
|
+
// keyed (simpleName, callerFilePath). Only created when no per-caller
|
|
50
|
+
// visibility filter applies (the list is then a pure function of name+file —
|
|
51
|
+
// see pickUniqueGlobalCallable). Lets repeated free calls of the same name
|
|
52
|
+
// from one file reuse the same-name-bucket scan instead of re-walking it.
|
|
53
|
+
const scopeDefsCache = options.isCallableVisibleFromCaller === undefined
|
|
54
|
+
? new Map()
|
|
55
|
+
: undefined;
|
|
56
|
+
const enclosingInstanceOwnerByScope = options.freeCallsRequireInstanceOwnership === true
|
|
57
|
+
? new Map()
|
|
58
|
+
: undefined;
|
|
59
|
+
const reachableInstanceOwnersByOwner = options.freeCallsRequireInstanceOwnership === true
|
|
60
|
+
? new Map()
|
|
61
|
+
: undefined;
|
|
62
|
+
const instanceOwnerKey = (ownerId) => {
|
|
63
|
+
const owner = scopes.defs.get(ownerId);
|
|
64
|
+
const qualifiedName = owner?.qualifiedName;
|
|
65
|
+
if (qualifiedName === undefined || qualifiedName === '')
|
|
66
|
+
return ownerId;
|
|
67
|
+
const namespacePrefix = owner.namespacePrefix ?? '';
|
|
68
|
+
return `${namespacePrefix.length}:${namespacePrefix}:${qualifiedName}`;
|
|
69
|
+
};
|
|
70
|
+
const isReachableInstanceOwner = (scopeId, ownerId) => {
|
|
71
|
+
let enclosing = enclosingInstanceOwnerByScope?.get(scopeId);
|
|
72
|
+
if (enclosing === undefined) {
|
|
73
|
+
enclosing = (0, walkers_js_1.findEnclosingClassDef)(scopeId, scopes) ?? null;
|
|
74
|
+
enclosingInstanceOwnerByScope?.set(scopeId, enclosing);
|
|
75
|
+
}
|
|
76
|
+
if (enclosing === null)
|
|
77
|
+
return false;
|
|
78
|
+
let owners = reachableInstanceOwnersByOwner?.get(enclosing.nodeId);
|
|
79
|
+
if (owners === undefined) {
|
|
80
|
+
const mutableOwners = new Set([instanceOwnerKey(enclosing.nodeId)]);
|
|
81
|
+
for (const inheritedOwnerId of scopes.methodDispatch.mroFor(enclosing.nodeId)) {
|
|
82
|
+
mutableOwners.add(instanceOwnerKey(inheritedOwnerId));
|
|
83
|
+
}
|
|
84
|
+
owners = mutableOwners;
|
|
85
|
+
reachableInstanceOwnersByOwner?.set(enclosing.nodeId, owners);
|
|
86
|
+
}
|
|
87
|
+
return owners.has(instanceOwnerKey(ownerId));
|
|
88
|
+
};
|
|
89
|
+
for (const parsed of parsedFiles) {
|
|
90
|
+
const bindingCandidatesByScope = options.freeCallsRequireInstanceOwnership === true
|
|
91
|
+
? new Map()
|
|
92
|
+
: undefined;
|
|
93
|
+
for (const site of parsed.referenceSites) {
|
|
94
|
+
if (site.kind !== 'call')
|
|
95
|
+
continue;
|
|
96
|
+
if (site.explicitReceiver !== undefined)
|
|
97
|
+
continue;
|
|
98
|
+
if (options.skipSites?.has(siteKey(parsed.filePath, site)) === true)
|
|
99
|
+
continue;
|
|
100
|
+
// Constructor form (`new User(...)`): resolve the class, then
|
|
101
|
+
// emit CALLS to its explicit Constructor def (when present) or
|
|
102
|
+
// to the Class node itself (implicit constructor). Legacy emits
|
|
103
|
+
// the same two targets; see test expectations.
|
|
104
|
+
let fnDef;
|
|
105
|
+
if (site.callForm === 'constructor') {
|
|
106
|
+
const classDef = (0, walkers_js_1.resolveInheritanceBaseInScope)(site.inScope, site.name, scopes, site.rawQualifiedName);
|
|
107
|
+
if (classDef !== undefined && classDef.type !== 'Interface') {
|
|
108
|
+
// Most languages link `Type(...)` to the explicit Constructor def
|
|
109
|
+
// when one exists (else the Class). Languages that model the call
|
|
110
|
+
// as a reference to the type itself opt into
|
|
111
|
+
// `constructorCallTargetsClass` and always link to the Class.
|
|
112
|
+
fnDef =
|
|
113
|
+
options.constructorCallTargetsClass === true
|
|
114
|
+
? classDef
|
|
115
|
+
: pickConstructorOrClass(classDef, workspaceIndex, scopes, site.arity);
|
|
116
|
+
}
|
|
117
|
+
else if (options.allowGlobalFallback === true) {
|
|
118
|
+
// The constructed type may live in a sibling/imported file that is
|
|
119
|
+
// not in the call-site's lexical scope-chain bindings. Fall back to
|
|
120
|
+
// a unique workspace-wide Class def by simple name (gated on the
|
|
121
|
+
// same global-fallback opt-in as free calls). Then target the
|
|
122
|
+
// Class or its Constructor per the language's preference.
|
|
123
|
+
const globalClass = pickUniqueGlobalClass(site.name, globalClassesBySimpleName);
|
|
124
|
+
if (globalClass !== undefined) {
|
|
125
|
+
fnDef =
|
|
126
|
+
globalClass.type === 'Interface'
|
|
127
|
+
? undefined
|
|
128
|
+
: options.constructorCallTargetsClass === true
|
|
129
|
+
? globalClass
|
|
130
|
+
: pickConstructorOrClass(globalClass, workspaceIndex, scopes, site.arity);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Module-qualified free call (`mod::fn()`): the source named the module
|
|
135
|
+
// explicitly, so that path outranks every lexical tier below — otherwise
|
|
136
|
+
// the scope-chain walk binds the bare tail to a same-named definition in
|
|
137
|
+
// the caller's own file and emits a self-loop instead of the real
|
|
138
|
+
// cross-module edge (#2730). Only fires when the language populated
|
|
139
|
+
// `rawQualifiedName` AND provides the hook; `undefined` falls through to
|
|
140
|
+
// the unchanged chain, so this tier is strictly additive.
|
|
141
|
+
if (fnDef === undefined &&
|
|
142
|
+
options.resolveQualifiedFreeCall !== undefined &&
|
|
143
|
+
site.rawQualifiedName !== undefined) {
|
|
144
|
+
fnDef = options.resolveQualifiedFreeCall(site, parsed, scopes, workspaceIndex, allFilePaths());
|
|
145
|
+
}
|
|
146
|
+
// Implicit-this overload narrowing: an unqualified call inside
|
|
147
|
+
// a method body might be calling a sibling overload on the
|
|
148
|
+
// enclosing class. When the workspace has multiple methods of
|
|
149
|
+
// the same name in a single class, choose the best match by
|
|
150
|
+
// arity + argument types.
|
|
151
|
+
let fnDefFromImplicitThis = false;
|
|
152
|
+
if (fnDef === undefined) {
|
|
153
|
+
fnDef = pickImplicitThisOverload(site, scopes, workspaceIndex, model, {
|
|
154
|
+
conversionRankFn: options.conversionRankFn,
|
|
155
|
+
conversionOnlyArgTypePrefixes: options.conversionOnlyArgTypePrefixes,
|
|
156
|
+
constraintCompatibility: options.constraintCompatibility,
|
|
157
|
+
});
|
|
158
|
+
fnDefFromImplicitThis = fnDef !== undefined;
|
|
159
|
+
}
|
|
160
|
+
// Scope-chain callable lookup. First-match preserves scope-chain
|
|
161
|
+
// precedence (local shadows import). When a conversion-rank function
|
|
162
|
+
// is available AND the binding scope contains multiple overloads,
|
|
163
|
+
// refine with `narrowOverloadCandidates` to pick the best overload
|
|
164
|
+
// by argument types (#1578). The first-match result is kept as a
|
|
165
|
+
// fallback when narrowing is indeterminate.
|
|
166
|
+
if (fnDef === undefined) {
|
|
167
|
+
if (options.resolveAdlCandidates === undefined) {
|
|
168
|
+
// Non-ADL path: first-match preserves scope-chain precedence
|
|
169
|
+
// (local shadows import). When a conversion-rank function is
|
|
170
|
+
// available AND the binding scope contains multiple overloads,
|
|
171
|
+
// refine with narrowOverloadCandidates (#1578).
|
|
172
|
+
let bindingCandidates;
|
|
173
|
+
if (bindingCandidatesByScope !== undefined) {
|
|
174
|
+
let byName = bindingCandidatesByScope.get(site.inScope);
|
|
175
|
+
if (byName === undefined) {
|
|
176
|
+
byName = new Map();
|
|
177
|
+
bindingCandidatesByScope.set(site.inScope, byName);
|
|
178
|
+
}
|
|
179
|
+
bindingCandidates = byName.get(site.name);
|
|
180
|
+
if (bindingCandidates === undefined) {
|
|
181
|
+
bindingCandidates = (0, walkers_js_1.findAllCallableBindingCandidatesInScope)(site.inScope, site.name, scopes);
|
|
182
|
+
byName.set(site.name, bindingCandidates);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
let eligibleBindingCandidates;
|
|
186
|
+
if (bindingCandidates === undefined) {
|
|
187
|
+
fnDef = (0, walkers_js_1.findCallableBindingInScope)(site.inScope, site.name, scopes);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
eligibleBindingCandidates = bindingCandidates.filter((candidate) => {
|
|
191
|
+
const def = candidate.def;
|
|
192
|
+
if (def.type !== 'Method' ||
|
|
193
|
+
def.ownerId === undefined ||
|
|
194
|
+
def.filePath !== parsed.filePath) {
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
const ownerReachable = isReachableInstanceOwner(site.inScope, def.ownerId);
|
|
198
|
+
const staticallyImported = candidate.bindings.some((binding) => binding.visibility === 'static-member-import');
|
|
199
|
+
return ownerReachable || staticallyImported;
|
|
200
|
+
});
|
|
201
|
+
fnDef = eligibleBindingCandidates[0]?.def;
|
|
202
|
+
if (fnDef === undefined && bindingCandidates.length > 0) {
|
|
203
|
+
recordSuppressedOutcome(options.recordResolutionOutcome, {
|
|
204
|
+
phase: 'free-call-fallback',
|
|
205
|
+
filePath: parsed.filePath,
|
|
206
|
+
name: site.name,
|
|
207
|
+
range: site.atRange,
|
|
208
|
+
reason: 'free-call-instance-ownership',
|
|
209
|
+
candidates: bindingCandidates.map((candidate) => candidate.def),
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (fnDef !== undefined &&
|
|
214
|
+
options.isBuiltInName?.(site.name) === true &&
|
|
215
|
+
fnDef.filePath === parsed.filePath &&
|
|
216
|
+
eligibleBindingCandidates?.some((candidate) => candidate.bindings.some((binding) => binding.visibility === 'static-member-import')) !== true &&
|
|
217
|
+
!hasGenuineLexicalBinding(site.inScope, site.name, scopes)) {
|
|
218
|
+
// A platform/language built-in (e.g. `fetch`, `setTimeout`)
|
|
219
|
+
// with no binding reachable via the TRUE lexical scope chain
|
|
220
|
+
// (Scope.bindings only) -- the match came solely from
|
|
221
|
+
// finalize's per-file "local + imports + wildcards" bucket,
|
|
222
|
+
// which flattens every declaration in the file onto the
|
|
223
|
+
// module scope regardless of true nesting depth
|
|
224
|
+
// (cgraph-shared's `materializeBindings`). That flattening
|
|
225
|
+
// is correct for its purpose (cross-file import targets) but
|
|
226
|
+
// over-matches same-file built-in-shadowing declarations that
|
|
227
|
+
// were never really module-scope-visible -- e.g. a Cloudflare
|
|
228
|
+
// Worker's `export default { fetch(req) {} }` handler (#2545).
|
|
229
|
+
// Leave the call unresolved rather than emit a false edge.
|
|
230
|
+
//
|
|
231
|
+
// `fnDef.filePath === parsed.filePath` is the load-bearing
|
|
232
|
+
// guard against a real regression: `materializeBindings`'s
|
|
233
|
+
// flat bucket is per-file, so the leak this guard targets is
|
|
234
|
+
// ALWAYS same-file. A cross-file match at this point can only
|
|
235
|
+
// come from a genuine import/namespace/workspace-FQN channel
|
|
236
|
+
// (the separate, gated `pickUniqueGlobalCallable` global
|
|
237
|
+
// fallback runs later and isn't what populated `fnDef` here)
|
|
238
|
+
// -- e.g. `import { fetch } from './fetch-polyfill'` must
|
|
239
|
+
// keep resolving. Without this check, that import silently
|
|
240
|
+
// stopped resolving (verified via a scratch probe fixture).
|
|
241
|
+
fnDef = undefined;
|
|
242
|
+
}
|
|
243
|
+
if (fnDef !== undefined &&
|
|
244
|
+
(options.conversionRankFn !== undefined || bindingCandidates !== undefined)) {
|
|
245
|
+
const allCallables = eligibleBindingCandidates === undefined
|
|
246
|
+
? (0, walkers_js_1.findAllCallableBindingsInScope)(site.inScope, site.name, scopes)
|
|
247
|
+
: eligibleBindingCandidates.map((candidate) => candidate.def);
|
|
248
|
+
if (allCallables.length > 1) {
|
|
249
|
+
const narrowed = (0, overload_narrowing_js_1.narrowOverloadCandidates)(allCallables, site.arity, site.argumentTypes, {
|
|
250
|
+
argumentTypeClasses: site.argumentTypeClasses,
|
|
251
|
+
conversionRankFn: options.conversionRankFn,
|
|
252
|
+
conversionOnlyArgTypePrefixes: options.conversionOnlyArgTypePrefixes,
|
|
253
|
+
constraintCompatibility: options.constraintCompatibility,
|
|
254
|
+
});
|
|
255
|
+
if (narrowed.length === 1) {
|
|
256
|
+
fnDef = narrowed[0];
|
|
257
|
+
}
|
|
258
|
+
else if (narrowed.length > 1) {
|
|
259
|
+
// Multiple survivors after conversion-rank scoring.
|
|
260
|
+
// Suppress when all candidates share the same file (true
|
|
261
|
+
// overloads) — mirrors ADL merged-candidate path behavior.
|
|
262
|
+
// Cross-file candidates are shadowing; keep first-match.
|
|
263
|
+
const sameFile = narrowed.every((d) => d.filePath === narrowed[0].filePath);
|
|
264
|
+
if (sameFile) {
|
|
265
|
+
recordSuppressedOutcome(options.recordResolutionOutcome, {
|
|
266
|
+
phase: 'free-call-fallback',
|
|
267
|
+
filePath: parsed.filePath,
|
|
268
|
+
name: site.name,
|
|
269
|
+
range: site.atRange,
|
|
270
|
+
reason: suppressionReasonForOverload(narrowed, site.arity, {
|
|
271
|
+
conversionRankFn: options.conversionRankFn,
|
|
272
|
+
argumentTypes: site.argumentTypes,
|
|
273
|
+
}),
|
|
274
|
+
candidates: narrowed,
|
|
275
|
+
});
|
|
276
|
+
handledSites.add(siteKey(parsed.filePath, site));
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// narrowed.length === 0: keep the first-match fnDef —
|
|
281
|
+
// preserves local-shadows-import.
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
// ADL path: ISO C++ `[basic.lookup.unqual]` §7 — ADL is suppressed
|
|
287
|
+
// when ordinary lookup finds a non-function name or a block-scope
|
|
288
|
+
// function declaration.
|
|
289
|
+
const { callables: ordinary, nonCallableFound, blockScopeDeclFound, } = (0, walkers_js_1.findCallableBindingsAndAdlBlocker)(site.inScope, site.name, scopes);
|
|
290
|
+
const adlSuppressed = nonCallableFound || blockScopeDeclFound;
|
|
291
|
+
const adl = adlSuppressed
|
|
292
|
+
? undefined
|
|
293
|
+
: options.resolveAdlCandidates({
|
|
294
|
+
name: site.name,
|
|
295
|
+
arity: site.arity,
|
|
296
|
+
argumentTypes: site.argumentTypes,
|
|
297
|
+
atRange: { startLine: site.atRange.startLine, startCol: site.atRange.startCol },
|
|
298
|
+
}, parsed, scopes, parsedFiles);
|
|
299
|
+
const key = siteKey(parsed.filePath, site);
|
|
300
|
+
if (adlSuppressed && ordinary.length === 0) {
|
|
301
|
+
recordSuppressedOutcome(options.recordResolutionOutcome, {
|
|
302
|
+
phase: 'free-call-fallback',
|
|
303
|
+
filePath: parsed.filePath,
|
|
304
|
+
name: site.name,
|
|
305
|
+
range: site.atRange,
|
|
306
|
+
reason: 'adl-ordinary-lookup-blocked',
|
|
307
|
+
candidates: ordinary,
|
|
308
|
+
});
|
|
309
|
+
handledSites.add(key);
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
if (adl === undefined || adl.length === 0) {
|
|
313
|
+
// No ADL contribution. Default behavior: `ordinary[0]` —
|
|
314
|
+
// scope-chain walk preserves local-shadows-import precedence.
|
|
315
|
+
//
|
|
316
|
+
// Narrowing kicks in when either disambiguation signal is
|
|
317
|
+
// present: any candidate carries `templateConstraints`
|
|
318
|
+
// (SFINAE / `requires`-clause guarded templates, #1579), OR
|
|
319
|
+
// a conversion-rank function is provided (#1606 / #1578).
|
|
320
|
+
// Both hooks are threaded into `narrowOverloadCandidates`
|
|
321
|
+
// via the unified `OverloadNarrowingHookCtx`.
|
|
322
|
+
const hasConstraints = ordinary.some((d) => d.templateConstraints !== undefined);
|
|
323
|
+
const canNarrow = hasConstraints || options.conversionRankFn !== undefined;
|
|
324
|
+
if (ordinary.length <= 1 || !canNarrow) {
|
|
325
|
+
fnDef = ordinary[0];
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
const narrowed = (0, overload_narrowing_js_1.narrowOverloadCandidates)(ordinary, site.arity, site.argumentTypes, {
|
|
329
|
+
argumentTypeClasses: site.argumentTypeClasses,
|
|
330
|
+
conversionRankFn: options.conversionRankFn,
|
|
331
|
+
conversionOnlyArgTypePrefixes: options.conversionOnlyArgTypePrefixes,
|
|
332
|
+
constraintCompatibility: options.constraintCompatibility,
|
|
333
|
+
});
|
|
334
|
+
if (narrowed.length === 1) {
|
|
335
|
+
fnDef = narrowed[0];
|
|
336
|
+
}
|
|
337
|
+
else if (narrowed.length === 0) {
|
|
338
|
+
handledSites.add(key);
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
// >1 survivors: same-file → suppress (true overloads,
|
|
343
|
+
// "degrade not lie" — no edge beats a wrong one, and
|
|
344
|
+
// SFINAE-ambiguous calls land here). Cross-file →
|
|
345
|
+
// first-match (shadowing semantics).
|
|
346
|
+
const sameFile = narrowed.every((d) => d.filePath === narrowed[0].filePath);
|
|
347
|
+
if (sameFile) {
|
|
348
|
+
recordSuppressedOutcome(options.recordResolutionOutcome, {
|
|
349
|
+
phase: 'free-call-fallback',
|
|
350
|
+
filePath: parsed.filePath,
|
|
351
|
+
name: site.name,
|
|
352
|
+
range: site.atRange,
|
|
353
|
+
reason: suppressionReasonForOverload(narrowed, site.arity, {
|
|
354
|
+
conversionRankFn: options.conversionRankFn,
|
|
355
|
+
argumentTypes: site.argumentTypes,
|
|
356
|
+
}),
|
|
357
|
+
candidates: narrowed,
|
|
358
|
+
});
|
|
359
|
+
handledSites.add(key);
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
fnDef = ordinary[0];
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
const merged = [];
|
|
368
|
+
const seenMerge = new Set();
|
|
369
|
+
const push = (defs) => {
|
|
370
|
+
for (const d of defs) {
|
|
371
|
+
if (seenMerge.has(d.nodeId))
|
|
372
|
+
continue;
|
|
373
|
+
seenMerge.add(d.nodeId);
|
|
374
|
+
merged.push(d);
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
push(ordinary);
|
|
378
|
+
push(adl);
|
|
379
|
+
const narrowed = (0, overload_narrowing_js_1.narrowOverloadCandidates)(merged, site.arity, site.argumentTypes, {
|
|
380
|
+
argumentTypeClasses: site.argumentTypeClasses,
|
|
381
|
+
conversionRankFn: options.conversionRankFn,
|
|
382
|
+
conversionOnlyArgTypePrefixes: options.conversionOnlyArgTypePrefixes,
|
|
383
|
+
constraintCompatibility: options.constraintCompatibility,
|
|
384
|
+
});
|
|
385
|
+
if (narrowed.length === 1) {
|
|
386
|
+
fnDef = narrowed[0];
|
|
387
|
+
}
|
|
388
|
+
else if (narrowed.length === 0) {
|
|
389
|
+
handledSites.add(key);
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
else if (narrowed.length > 1) {
|
|
393
|
+
recordSuppressedOutcome(options.recordResolutionOutcome, {
|
|
394
|
+
phase: 'free-call-fallback',
|
|
395
|
+
filePath: parsed.filePath,
|
|
396
|
+
name: site.name,
|
|
397
|
+
range: site.atRange,
|
|
398
|
+
reason: suppressionReasonForOverload(narrowed, site.arity, {
|
|
399
|
+
conversionRankFn: options.conversionRankFn,
|
|
400
|
+
argumentTypes: site.argumentTypes,
|
|
401
|
+
}),
|
|
402
|
+
candidates: narrowed,
|
|
403
|
+
});
|
|
404
|
+
if ((0, overload_narrowing_js_1.isOverloadAmbiguousAfterNormalization)(narrowed, site.arity)) {
|
|
405
|
+
handledSites.add(key);
|
|
406
|
+
continue;
|
|
407
|
+
}
|
|
408
|
+
// Multiple survivors remain after conversion-rank scoring;
|
|
409
|
+
// suppress instead of picking arbitrarily.
|
|
410
|
+
handledSites.add(key);
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
// V1: pickUniqueGlobalCallable ignores import context — resolves to any
|
|
417
|
+
// globally-unique callable. False cross-package edges are possible when
|
|
418
|
+
// the caller does not import the target package. Same-package calls are
|
|
419
|
+
// usually caught by nearest-scope lookup before reaching here.
|
|
420
|
+
if (fnDef === undefined && options.allowGlobalFallback === true) {
|
|
421
|
+
fnDef = pickUniqueGlobalCallable(site.name, model, globalCallablesBySimpleName, parsed.filePath, options.isFileLocalDef, site.arity, options.isCallableVisibleFromCaller !== undefined
|
|
422
|
+
? (candidate) => options.isCallableVisibleFromCaller({
|
|
423
|
+
callerParsed: parsed,
|
|
424
|
+
candidate,
|
|
425
|
+
callerScope: site.inScope,
|
|
426
|
+
scopes,
|
|
427
|
+
})
|
|
428
|
+
: undefined, site.argumentTypes, site.argumentTypeClasses, options.conversionRankFn, scopeDefsCache, options.conversionOnlyArgTypePrefixes);
|
|
429
|
+
}
|
|
430
|
+
if (fnDef === undefined)
|
|
431
|
+
continue;
|
|
432
|
+
if (fnDef.isDeleted === true) {
|
|
433
|
+
recordSuppressedOutcome(options.recordResolutionOutcome, {
|
|
434
|
+
phase: 'free-call-fallback',
|
|
435
|
+
filePath: parsed.filePath,
|
|
436
|
+
name: site.name,
|
|
437
|
+
range: site.atRange,
|
|
438
|
+
reason: 'selected-callable-deleted',
|
|
439
|
+
candidates: [fnDef],
|
|
440
|
+
});
|
|
441
|
+
handledSites.add(siteKey(parsed.filePath, site));
|
|
442
|
+
continue;
|
|
443
|
+
}
|
|
444
|
+
if ((fnDefFromImplicitThis || fnDef.type === 'Method' || fnDef.type === 'Constructor') &&
|
|
445
|
+
options.isCallableVisibleFromCaller !== undefined &&
|
|
446
|
+
!options.isCallableVisibleFromCaller({
|
|
447
|
+
callerParsed: parsed,
|
|
448
|
+
candidate: fnDef,
|
|
449
|
+
callerScope: site.inScope,
|
|
450
|
+
scopes,
|
|
451
|
+
})) {
|
|
452
|
+
handledSites.add(siteKey(parsed.filePath, site));
|
|
453
|
+
continue;
|
|
454
|
+
}
|
|
455
|
+
const callerGraphId = (0, ids_js_1.resolveCallerGraphId)(site.inScope, scopes, nodeLookup, site.atRange);
|
|
456
|
+
if (callerGraphId === undefined)
|
|
457
|
+
continue;
|
|
458
|
+
const tgtGraphId = (0, ids_js_1.resolveDefGraphId)(fnDef.filePath, fnDef, nodeLookup);
|
|
459
|
+
if (tgtGraphId === undefined)
|
|
460
|
+
continue;
|
|
461
|
+
// Always mark the site as handled — even when the dedup-collapse
|
|
462
|
+
// means we don't add a new edge — so `emit-references` skips its
|
|
463
|
+
// potentially-wrong fallback for the same site.
|
|
464
|
+
handledSites.add(siteKey(parsed.filePath, site));
|
|
465
|
+
// Resolved-callee-id capture (#2227 U2/KTD6/R8): record this CALLS site's
|
|
466
|
+
// resolved target BEFORE the collapsed `seen` dedup. The free-call dedup
|
|
467
|
+
// key drops the line (one edge per caller→target), so capturing after
|
|
468
|
+
// `seen.has` would lose every same-target call past the first — capture
|
|
469
|
+
// here, per site, keyed on `site.atRange` (byte-equal to U1's
|
|
470
|
+
// SiteRecord.at: 1-based line / 0-based col).
|
|
471
|
+
options.calleeIdSink?.add(parsed.filePath, site.atRange.startLine, site.atRange.startCol, tgtGraphId);
|
|
472
|
+
const relId = `rel:CALLS:${callerGraphId}->${tgtGraphId}`;
|
|
473
|
+
if (seen.has(relId))
|
|
474
|
+
continue;
|
|
475
|
+
seen.add(relId);
|
|
476
|
+
graph.addRelationship({
|
|
477
|
+
id: relId,
|
|
478
|
+
sourceId: callerGraphId,
|
|
479
|
+
targetId: tgtGraphId,
|
|
480
|
+
type: 'CALLS',
|
|
481
|
+
confidence: 0.85,
|
|
482
|
+
// Match legacy DAG's reason convention so consumers that
|
|
483
|
+
// assert `reason === 'import-resolved'` keep working.
|
|
484
|
+
reason: fnDef.filePath !== parsed.filePath ? 'import-resolved' : 'local-call',
|
|
485
|
+
});
|
|
486
|
+
emitted++;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
return emitted;
|
|
490
|
+
}
|
|
491
|
+
function siteKey(filePath, site) {
|
|
492
|
+
return `${filePath}:${site.atRange.startLine}:${site.atRange.startCol}`;
|
|
493
|
+
}
|
|
494
|
+
function suppressionReasonForOverload(candidates, arity, ctx) {
|
|
495
|
+
if ((0, overload_narrowing_js_1.isOverloadAmbiguousAfterNormalization)(candidates, arity)) {
|
|
496
|
+
return 'overload-ambiguous-normalization';
|
|
497
|
+
}
|
|
498
|
+
if (ctx.conversionRankFn !== undefined &&
|
|
499
|
+
ctx.argumentTypes !== undefined &&
|
|
500
|
+
ctx.argumentTypes.length > 0) {
|
|
501
|
+
return 'conversion-rank-tied';
|
|
502
|
+
}
|
|
503
|
+
return 'overload-ambiguous';
|
|
504
|
+
}
|
|
505
|
+
function recordSuppressedOutcome(record, input) {
|
|
506
|
+
record?.({
|
|
507
|
+
kind: 'suppressed',
|
|
508
|
+
phase: input.phase,
|
|
509
|
+
filePath: input.filePath,
|
|
510
|
+
name: input.name,
|
|
511
|
+
range: input.range,
|
|
512
|
+
reason: input.reason,
|
|
513
|
+
candidateIds: input.candidates.map((d) => d.nodeId),
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Build a `simpleName -> callable defs` index from `scopes.defs` once per
|
|
518
|
+
* pass. Mirrors the filter the old per-site scan applied: Function /
|
|
519
|
+
* Method / Constructor, keyed by the last `.`-segment of `qualifiedName`
|
|
520
|
+
* (falling back to the qualifiedName itself when undotted). Used by
|
|
521
|
+
* `pickUniqueGlobalCallable` so every free-call fallback site is O(1)
|
|
522
|
+
* instead of O(|defs|).
|
|
523
|
+
*
|
|
524
|
+
* Exported for unit testing — language-agnostic logic, exercised via synthetic
|
|
525
|
+
* stubs in `pick-unique-global-callable.test.ts`.
|
|
526
|
+
*/
|
|
527
|
+
function buildGlobalCallableIndex(scopes) {
|
|
528
|
+
const out = new Map();
|
|
529
|
+
for (const def of scopes.defs.byId.values()) {
|
|
530
|
+
if (def.type !== 'Function' && def.type !== 'Method' && def.type !== 'Constructor')
|
|
531
|
+
continue;
|
|
532
|
+
const qualified = def.qualifiedName;
|
|
533
|
+
if (qualified === undefined || qualified.length === 0)
|
|
534
|
+
continue;
|
|
535
|
+
const dot = qualified.lastIndexOf('.');
|
|
536
|
+
const simple = dot === -1 ? qualified : qualified.slice(dot + 1);
|
|
537
|
+
const bucket = out.get(simple);
|
|
538
|
+
if (bucket)
|
|
539
|
+
bucket.push(def);
|
|
540
|
+
else
|
|
541
|
+
out.set(simple, [def]);
|
|
542
|
+
}
|
|
543
|
+
return out;
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* Build a `simpleName -> class-like defs` index from `scopes.defs` once per
|
|
547
|
+
* pass — the structural sibling of `buildGlobalCallableIndex`, consumed by
|
|
548
|
+
* `pickUniqueGlobalClass` so constructor-form fallback is O(1)-per-site
|
|
549
|
+
* instead of O(|defs|).
|
|
550
|
+
*
|
|
551
|
+
* **Kind filter (KTD5 — KEEP `'Interface'`):** the set is
|
|
552
|
+
* `Class | Struct | Interface`, matching the idiomatic class-like set used
|
|
553
|
+
* elsewhere in the scope-resolution bridge (`graph-bridge/ids.ts`,
|
|
554
|
+
* `node-lookup.ts`). This is a behavior-PRESERVING perf refactor for all 8
|
|
555
|
+
* `allowGlobalFreeCallFallback` languages — the previous per-site scan used
|
|
556
|
+
* exactly this filter. Excluding Swift `protocol` (`Interface`) defs because
|
|
557
|
+
* protocols aren't instantiable is a *separate* Swift-semantics question with
|
|
558
|
+
* its own test; dropping `Interface` here would be a deliberate
|
|
559
|
+
* behavior-changing edit, not part of U5.
|
|
560
|
+
*
|
|
561
|
+
* Bucket insertion order follows `defs.byId.values()` iteration order, so the
|
|
562
|
+
* downstream "keep first" / ambiguity ordering in `pickUniqueGlobalClass` is
|
|
563
|
+
* byte-identical to the old linear scan (equivalence verified).
|
|
564
|
+
*
|
|
565
|
+
* Exported for unit testing — language-agnostic logic, exercised via synthetic
|
|
566
|
+
* stubs in `pick-unique-global-class.test.ts`.
|
|
567
|
+
*/
|
|
568
|
+
function buildGlobalClassIndex(scopes) {
|
|
569
|
+
const out = new Map();
|
|
570
|
+
for (const def of scopes.defs.byId.values()) {
|
|
571
|
+
if (def.type !== 'Class' && def.type !== 'Struct' && def.type !== 'Interface')
|
|
572
|
+
continue;
|
|
573
|
+
const qualified = def.qualifiedName;
|
|
574
|
+
if (qualified === undefined || qualified.length === 0)
|
|
575
|
+
continue;
|
|
576
|
+
const dot = qualified.lastIndexOf('.');
|
|
577
|
+
const simple = dot === -1 ? qualified : qualified.slice(dot + 1);
|
|
578
|
+
const bucket = out.get(simple);
|
|
579
|
+
if (bucket)
|
|
580
|
+
bucket.push(def);
|
|
581
|
+
else
|
|
582
|
+
out.set(simple, [def]);
|
|
583
|
+
}
|
|
584
|
+
return out;
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* Resolve a free (unqualified, receiver-less) call to a globally-unique
|
|
588
|
+
* callable def by simple name. See the in-body comments for the narrowing
|
|
589
|
+
* order. Exported for unit testing — the `scopeDefsCache` equivalence is
|
|
590
|
+
* exercised via synthetic stubs in `pick-unique-global-callable.test.ts`.
|
|
591
|
+
*/
|
|
592
|
+
function pickUniqueGlobalCallable(name, model, globalCallablesBySimpleName, callerFilePath, isFileLocalDef, callArity, isCallerVisible, callArgTypes, callArgTypeClasses, conversionRankFn, scopeDefsCache, conversionOnlyArgTypePrefixes) {
|
|
593
|
+
// The scope-index candidate list is a pure function of (name, callerFilePath):
|
|
594
|
+
// the same-name bucket is fixed for the pass, the file-local filter depends
|
|
595
|
+
// only on the candidate + callerFilePath, and the logical-key dedup is
|
|
596
|
+
// deterministic. When no per-caller visibility filter applies, memoize it so
|
|
597
|
+
// repeated free calls of the same name from one file — the kernel's hot
|
|
598
|
+
// pattern (e.g. `kmalloc` across hundreds of `drivers/` sites, where the
|
|
599
|
+
// same-name bucket has thousands of defs) — reuse the bucket scan instead of
|
|
600
|
+
// re-walking it per site. The cached array is only ever READ by the arity /
|
|
601
|
+
// overload narrowers below (both `.filter()`-based — they never mutate it),
|
|
602
|
+
// so one shared instance across call sites is safe. The cache is bypassed
|
|
603
|
+
// when a visibility filter is present (`isCallerVisible !== undefined`),
|
|
604
|
+
// because the list would then depend on the caller's scope, not just its file.
|
|
605
|
+
const cacheKey = scopeDefsCache !== undefined && isCallerVisible === undefined
|
|
606
|
+
? `${name}${callerFilePath}`
|
|
607
|
+
: undefined;
|
|
608
|
+
let scopeDefs = cacheKey !== undefined ? scopeDefsCache.get(cacheKey) : undefined;
|
|
609
|
+
if (scopeDefs === undefined) {
|
|
610
|
+
const built = [];
|
|
611
|
+
const scopeSeen = new Set();
|
|
612
|
+
for (const def of globalCallablesBySimpleName.get(name) ?? []) {
|
|
613
|
+
// Skip file-local defs (e.g. C `static` functions) that live in a
|
|
614
|
+
// different file from the caller — they are logically invisible.
|
|
615
|
+
if (isFileLocalDef !== undefined && def.filePath !== callerFilePath && isFileLocalDef(def)) {
|
|
616
|
+
continue;
|
|
617
|
+
}
|
|
618
|
+
// Caller-side visibility filter (e.g., PHP namespace + use-function
|
|
619
|
+
// import gating). When defined, blocks candidates the caller cannot
|
|
620
|
+
// legally reach. Languages without namespace-scoped function resolution
|
|
621
|
+
// leave this undefined → no filtering.
|
|
622
|
+
if (isCallerVisible !== undefined && !isCallerVisible(def)) {
|
|
623
|
+
continue;
|
|
624
|
+
}
|
|
625
|
+
const key = logicalCallableKey(def);
|
|
626
|
+
if (scopeSeen.has(key))
|
|
627
|
+
continue;
|
|
628
|
+
scopeSeen.add(key);
|
|
629
|
+
built.push(def);
|
|
630
|
+
}
|
|
631
|
+
scopeDefs = built;
|
|
632
|
+
if (cacheKey !== undefined)
|
|
633
|
+
scopeDefsCache.set(cacheKey, built);
|
|
634
|
+
}
|
|
635
|
+
if (scopeDefs.length === 1)
|
|
636
|
+
return scopeDefs[0];
|
|
637
|
+
// When multiple scope-index candidates exist, attempt arity narrowing
|
|
638
|
+
// before falling back to the semantic-model lookup. This handles
|
|
639
|
+
// registry-primary languages where the model is not populated for the
|
|
640
|
+
// migrated language's files (call-processor skips them).
|
|
641
|
+
if (scopeDefs.length > 1 && callArity !== undefined) {
|
|
642
|
+
const arityMatch = narrowByArity(scopeDefs, callArity);
|
|
643
|
+
if (arityMatch !== undefined)
|
|
644
|
+
return arityMatch;
|
|
645
|
+
}
|
|
646
|
+
// When arity narrowing left >1 candidate, try overload narrowing with
|
|
647
|
+
// argument types + conversion ranking (#1578). This picks the unique
|
|
648
|
+
// best-rank candidate when exact-type or conversion-rank scoring can
|
|
649
|
+
// disambiguate (e.g., `f(int)` vs `f(double)` called with `f(2.5)`).
|
|
650
|
+
if (scopeDefs.length > 1) {
|
|
651
|
+
const narrowed = (0, overload_narrowing_js_1.narrowOverloadCandidates)(scopeDefs, callArity, callArgTypes, {
|
|
652
|
+
argumentTypeClasses: callArgTypeClasses,
|
|
653
|
+
conversionRankFn,
|
|
654
|
+
conversionOnlyArgTypePrefixes,
|
|
655
|
+
});
|
|
656
|
+
if (narrowed.length === 1)
|
|
657
|
+
return narrowed[0];
|
|
658
|
+
}
|
|
659
|
+
const defs = [];
|
|
660
|
+
const seen = new Set();
|
|
661
|
+
const push = (pool) => {
|
|
662
|
+
for (const def of pool) {
|
|
663
|
+
// Apply the same file-local linkage filter as Phase 1 —
|
|
664
|
+
// cross-file static defs must never leak through the
|
|
665
|
+
// SemanticModel fallback path.
|
|
666
|
+
if (isFileLocalDef !== undefined && def.filePath !== callerFilePath && isFileLocalDef(def)) {
|
|
667
|
+
continue;
|
|
668
|
+
}
|
|
669
|
+
// Same caller-visibility filter applied to the model-side pool.
|
|
670
|
+
if (isCallerVisible !== undefined && !isCallerVisible(def)) {
|
|
671
|
+
continue;
|
|
672
|
+
}
|
|
673
|
+
const key = logicalCallableKey(def);
|
|
674
|
+
if (seen.has(key))
|
|
675
|
+
continue;
|
|
676
|
+
seen.add(key);
|
|
677
|
+
defs.push(def);
|
|
678
|
+
}
|
|
679
|
+
};
|
|
680
|
+
push(model.symbols.lookupCallableByName(name));
|
|
681
|
+
push(model.methods.lookupMethodByName(name));
|
|
682
|
+
if (defs.length === 1)
|
|
683
|
+
return defs[0];
|
|
684
|
+
// When multiple candidates exist and the call site has a known arity,
|
|
685
|
+
// narrow by parameter count.
|
|
686
|
+
if (defs.length > 1 && callArity !== undefined) {
|
|
687
|
+
const arityMatch = narrowByArity(defs, callArity);
|
|
688
|
+
if (arityMatch !== undefined)
|
|
689
|
+
return arityMatch;
|
|
690
|
+
}
|
|
691
|
+
// Same argument-type + conversion-rank narrowing for the model pool.
|
|
692
|
+
if (defs.length > 1) {
|
|
693
|
+
const narrowed = (0, overload_narrowing_js_1.narrowOverloadCandidates)(defs, callArity, callArgTypes, {
|
|
694
|
+
argumentTypeClasses: callArgTypeClasses,
|
|
695
|
+
conversionRankFn,
|
|
696
|
+
conversionOnlyArgTypePrefixes,
|
|
697
|
+
});
|
|
698
|
+
if (narrowed.length === 1)
|
|
699
|
+
return narrowed[0];
|
|
700
|
+
}
|
|
701
|
+
return undefined;
|
|
702
|
+
}
|
|
703
|
+
/**
|
|
704
|
+
* Narrow a list of callable candidates by call-site arity.
|
|
705
|
+
* A def is compatible when `requiredParameterCount <= arity <= parameterCount`.
|
|
706
|
+
* Defs with `parameterCount === undefined` (variadic/unknown) are always kept.
|
|
707
|
+
* Returns the single compatible def, or `undefined` when zero or multiple match.
|
|
708
|
+
*/
|
|
709
|
+
function narrowByArity(defs, callArity) {
|
|
710
|
+
const compatible = defs.filter((d) => {
|
|
711
|
+
const total = d.parameterCount;
|
|
712
|
+
if (total === undefined)
|
|
713
|
+
return true; // unknown arity — keep
|
|
714
|
+
const required = d.requiredParameterCount ?? total;
|
|
715
|
+
return required <= callArity && callArity <= total;
|
|
716
|
+
});
|
|
717
|
+
return compatible.length === 1 ? compatible[0] : undefined;
|
|
718
|
+
}
|
|
719
|
+
function logicalCallableKey(def) {
|
|
720
|
+
return [
|
|
721
|
+
def.filePath,
|
|
722
|
+
def.qualifiedName ?? '',
|
|
723
|
+
def.type,
|
|
724
|
+
def.parameterCount ?? '',
|
|
725
|
+
def.parameterTypes?.join(',') ?? '',
|
|
726
|
+
].join('\0');
|
|
727
|
+
}
|
|
728
|
+
/** For a constructor call `new X(...)`, return the X class's explicit
|
|
729
|
+
* Constructor def (by walking the class scope's ownedDefs) or the
|
|
730
|
+
* Class def itself when no explicit Constructor exists. Matches
|
|
731
|
+
* legacy behavior — tests assert targetLabel === 'Class' for implicit
|
|
732
|
+
* ctors and targetLabel === 'Constructor' for explicit ones. */
|
|
733
|
+
function pickConstructorOrClass(classDef, workspaceIndex, scopes, callArity) {
|
|
734
|
+
const classScope = workspaceIndex.classScopeByDefId.get(classDef.nodeId);
|
|
735
|
+
if (classScope === undefined)
|
|
736
|
+
return classDef;
|
|
737
|
+
const ctors = [];
|
|
738
|
+
for (const def of classScope.ownedDefs) {
|
|
739
|
+
if (def.type === 'Constructor')
|
|
740
|
+
ctors.push(def);
|
|
741
|
+
}
|
|
742
|
+
if (scopes !== undefined) {
|
|
743
|
+
for (const childId of scopes.scopeTree.getChildren(classScope.id)) {
|
|
744
|
+
const childScope = scopes.scopeTree.getScope(childId);
|
|
745
|
+
if (childScope === undefined || childScope.kind === 'Class')
|
|
746
|
+
continue;
|
|
747
|
+
for (const def of childScope.ownedDefs) {
|
|
748
|
+
if (def.type === 'Constructor')
|
|
749
|
+
ctors.push(def);
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
if (ctors.length === 0)
|
|
754
|
+
return classDef;
|
|
755
|
+
if (callArity !== undefined) {
|
|
756
|
+
const narrowed = narrowByArity(ctors, callArity);
|
|
757
|
+
if (narrowed !== undefined)
|
|
758
|
+
return narrowed;
|
|
759
|
+
}
|
|
760
|
+
return ctors[0];
|
|
761
|
+
}
|
|
762
|
+
/** Find a unique workspace-wide class-like def by simple name, for a
|
|
763
|
+
* constructor-form call `Type(...)` whose type lives outside the call
|
|
764
|
+
* site's lexical bindings (a sibling/imported file). Returns the def
|
|
765
|
+
* only when all matches share ONE qualified name — i.e. they are
|
|
766
|
+
* fragments of a single logical type (partial classes / extensions
|
|
767
|
+
* that re-key onto the same type), which resolve to the same graph
|
|
768
|
+
* node. Genuinely distinct types with the same simple name are
|
|
769
|
+
* ambiguous and leave the call unresolved rather than guessing. Gated
|
|
770
|
+
* by the caller on `allowGlobalFallback`, mirroring
|
|
771
|
+
* `pickUniqueGlobalCallable`.
|
|
772
|
+
*
|
|
773
|
+
* Consumes the once-built `buildGlobalClassIndex` (`simpleName ->
|
|
774
|
+
* class-like defs`) so each call site is O(1) rather than O(|defs|).
|
|
775
|
+
* The index's `Class | Struct | Interface` kind filter is intentionally
|
|
776
|
+
* KEPT (KTD5) — see `buildGlobalClassIndex` for why dropping `Interface`
|
|
777
|
+
* would be a separate, behavior-changing Swift-semantics edit.
|
|
778
|
+
*
|
|
779
|
+
* Exported for unit testing — language-agnostic logic, exercised via
|
|
780
|
+
* synthetic stubs in `pick-unique-global-class.test.ts`. The production
|
|
781
|
+
* call site is the constructor-form fallback in `emitFreeCallFallback`. */
|
|
782
|
+
function pickUniqueGlobalClass(name, index) {
|
|
783
|
+
let found;
|
|
784
|
+
for (const def of index.get(name) ?? []) {
|
|
785
|
+
// Same qualified name = same logical type (extension / partial-class
|
|
786
|
+
// fragment); keep the first and don't treat it as ambiguous.
|
|
787
|
+
if (found !== undefined && found.qualifiedName !== def.qualifiedName)
|
|
788
|
+
return undefined;
|
|
789
|
+
if (found === undefined)
|
|
790
|
+
found = def;
|
|
791
|
+
}
|
|
792
|
+
return found;
|
|
793
|
+
}
|
|
794
|
+
/** Walk up from the call-site scope to the enclosing class scope,
|
|
795
|
+
* pick a method member by name with overload narrowing on arity +
|
|
796
|
+
* argument types. Returns undefined if there's no enclosing class,
|
|
797
|
+
* no matching method, OR narrowing leaves multiple compatible
|
|
798
|
+
* candidates — in the multi-candidate case, picking
|
|
799
|
+
* `candidates[0]` would emit a high-confidence CALLS edge whose
|
|
800
|
+
* target depends on registration order rather than a defensible
|
|
801
|
+
* resolution. Mirrors `pickUniqueGlobalCallable`'s uniqueness check
|
|
802
|
+
* in the same file (Codex PR #1497 review, finding 2).
|
|
803
|
+
*
|
|
804
|
+
* Exported for unit testing — language-agnostic logic, exercised
|
|
805
|
+
* via synthetic stubs in `pick-implicit-this-overload.test.ts`. The
|
|
806
|
+
* production call site is `applyFreeCallFallback` immediately above. */
|
|
807
|
+
function pickImplicitThisOverload(site, scopes, workspaceIndex, model, hookCtx) {
|
|
808
|
+
// Find the enclosing Class scope by walking parents.
|
|
809
|
+
let curId = site.inScope;
|
|
810
|
+
let classScopeId;
|
|
811
|
+
while (curId !== null) {
|
|
812
|
+
const sc = scopes.scopeTree.getScope(curId);
|
|
813
|
+
if (sc === undefined)
|
|
814
|
+
break;
|
|
815
|
+
if (sc.kind === 'Class') {
|
|
816
|
+
classScopeId = sc.id;
|
|
817
|
+
break;
|
|
818
|
+
}
|
|
819
|
+
curId = sc.parent;
|
|
820
|
+
}
|
|
821
|
+
if (classScopeId === undefined)
|
|
822
|
+
return undefined;
|
|
823
|
+
// O(1) reverse-lookup via inverse map on WorkspaceResolutionIndex.
|
|
824
|
+
const classDefId = workspaceIndex.classScopeIdToDefId.get(classScopeId);
|
|
825
|
+
if (classDefId === undefined)
|
|
826
|
+
return undefined;
|
|
827
|
+
const overloads = model.methods.lookupAllByOwner(classDefId, site.name);
|
|
828
|
+
if (overloads.length === 0)
|
|
829
|
+
return undefined;
|
|
830
|
+
if (overloads.length === 1)
|
|
831
|
+
return overloads[0];
|
|
832
|
+
// Narrow on arity + argument types. Require a UNIQUE survivor —
|
|
833
|
+
// ambiguous narrowing (multiple compatible candidates with no
|
|
834
|
+
// disambiguating signal) leaves the call unresolved rather than
|
|
835
|
+
// routing to an arbitrary first overload by registration order.
|
|
836
|
+
const candidates = (0, overload_narrowing_js_1.narrowOverloadCandidates)(overloads, site.arity, site.argumentTypes, {
|
|
837
|
+
argumentTypeClasses: site.argumentTypeClasses,
|
|
838
|
+
conversionRankFn: hookCtx?.conversionRankFn,
|
|
839
|
+
conversionOnlyArgTypePrefixes: hookCtx?.conversionOnlyArgTypePrefixes,
|
|
840
|
+
constraintCompatibility: hookCtx?.constraintCompatibility,
|
|
841
|
+
});
|
|
842
|
+
if (candidates.length !== 1)
|
|
843
|
+
return undefined;
|
|
844
|
+
return candidates[0];
|
|
845
|
+
}
|
|
846
|
+
/**
|
|
847
|
+
* True when `name` is bound somewhere along the TRUE lexical scope
|
|
848
|
+
* chain from `startScope` -- i.e. via `Scope.bindings` (the raw,
|
|
849
|
+
* nesting-aware per-scope map built during extraction), NOT via
|
|
850
|
+
* finalize's `indexes.bindings` module-scope bucket (which flattens
|
|
851
|
+
* every declaration in the file onto the module scope regardless of
|
|
852
|
+
* true nesting -- see `hasGenuineLexicalBinding`'s caller for why that
|
|
853
|
+
* distinction matters, #2545).
|
|
854
|
+
*/
|
|
855
|
+
function hasGenuineLexicalBinding(startScope, name, scopes) {
|
|
856
|
+
let currentId = startScope;
|
|
857
|
+
const visited = new Set();
|
|
858
|
+
while (currentId !== null) {
|
|
859
|
+
if (visited.has(currentId))
|
|
860
|
+
return false;
|
|
861
|
+
visited.add(currentId);
|
|
862
|
+
const scope = scopes.scopeTree.getScope(currentId);
|
|
863
|
+
if (scope === undefined)
|
|
864
|
+
return false;
|
|
865
|
+
// `Object` scopes (object/record literal bodies) are a hoist
|
|
866
|
+
// boundary only -- never a genuine lexical binding, not even to
|
|
867
|
+
// their own nested children (#2551, mirrors scope/walkers.ts).
|
|
868
|
+
if (scope.kind !== 'Object' && scope.bindings.get(name) !== undefined)
|
|
869
|
+
return true;
|
|
870
|
+
currentId = scope.parent;
|
|
871
|
+
}
|
|
872
|
+
return false;
|
|
873
|
+
}
|