cgraphx 2.0.2 → 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/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/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,779 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractCallArgTypes = exports.extractReceiverNode = exports.extractReceiverName = exports.inferCallForm = exports.countCallArguments = exports.MAX_CHAIN_DEPTH = exports.CALL_EXPRESSION_TYPES = void 0;
|
|
4
|
+
exports.extractCallChain = extractCallChain;
|
|
5
|
+
exports.extractMixedChain = extractMixedChain;
|
|
6
|
+
const ast_helpers_js_1 = require("./ast-helpers.js");
|
|
7
|
+
const callable_flow_captures_js_1 = require("./callable-flow-captures.js");
|
|
8
|
+
/** Node types representing call expressions across supported languages. */
|
|
9
|
+
exports.CALL_EXPRESSION_TYPES = new Set([
|
|
10
|
+
'call_expression', // TS/JS/C/C++/Go/Rust
|
|
11
|
+
'method_invocation', // Java
|
|
12
|
+
'member_call_expression', // PHP
|
|
13
|
+
'nullsafe_member_call_expression', // PHP ?.
|
|
14
|
+
'call', // Python/Ruby
|
|
15
|
+
'invocation_expression', // C#
|
|
16
|
+
]);
|
|
17
|
+
/**
|
|
18
|
+
* Hard limit on chain depth to prevent runaway recursion.
|
|
19
|
+
* For `a.b().c().d()`, the chain has depth 2 (b and c before d).
|
|
20
|
+
*
|
|
21
|
+
* A chain deeper than this is DISCARDED WHOLE, not truncated:
|
|
22
|
+
* `extractMixedChain` returns an undefined base and the encoder refuses to mint
|
|
23
|
+
* a partial chain, because a base-side prefix decodes cleanly as a shorter,
|
|
24
|
+
* complete-looking chain and would type the receiver against the wrong member.
|
|
25
|
+
* Correct, but it means a builder chain one hop too long contributes nothing at
|
|
26
|
+
* all rather than degrading.
|
|
27
|
+
*
|
|
28
|
+
* DELIBERATELY NOT RAISED. Measured (see bench/receiver-resolution/BASELINE.md,
|
|
29
|
+
* `fourHopChain`): a 4-step chain mints NOTHING at this cap — confirmed by
|
|
30
|
+
* probing the emitter directly — and the site still RESOLVES, because the text
|
|
31
|
+
* cascade that owns the fallback path runs to `COMPOUND_RECEIVER_MAX_DEPTH` (8)
|
|
32
|
+
* and answers where the structural fold declined.
|
|
33
|
+
*
|
|
34
|
+
* So the cap bounds which chains are typed STRUCTURALLY, not which calls
|
|
35
|
+
* resolve. Raising it moves work from the cascade to the fold without changing
|
|
36
|
+
* any edge, and the fixture that proves it is committed so the next person to
|
|
37
|
+
* reach for this number has the measurement rather than the intuition.
|
|
38
|
+
*/
|
|
39
|
+
exports.MAX_CHAIN_DEPTH = 3;
|
|
40
|
+
/**
|
|
41
|
+
* Count direct arguments for a call expression across common tree-sitter grammars.
|
|
42
|
+
* Returns undefined when the argument container cannot be located cheaply.
|
|
43
|
+
*/
|
|
44
|
+
const countCallArguments = (callNode) => {
|
|
45
|
+
if (!callNode)
|
|
46
|
+
return undefined;
|
|
47
|
+
// Direct field or direct child (most languages)
|
|
48
|
+
let argsNode = callNode.childForFieldName('arguments') ??
|
|
49
|
+
callNode.children.find((child) => ast_helpers_js_1.CALL_ARGUMENT_LIST_TYPES.has(child.type));
|
|
50
|
+
// Kotlin/Swift: call_expression → call_suffix → value_arguments
|
|
51
|
+
// Search one level deeper for languages that wrap arguments in a suffix node
|
|
52
|
+
if (!argsNode) {
|
|
53
|
+
for (const child of callNode.children) {
|
|
54
|
+
if (!child.isNamed)
|
|
55
|
+
continue;
|
|
56
|
+
const nested = child.children.find((gc) => ast_helpers_js_1.CALL_ARGUMENT_LIST_TYPES.has(gc.type));
|
|
57
|
+
if (nested) {
|
|
58
|
+
argsNode = nested;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (!argsNode)
|
|
64
|
+
return undefined;
|
|
65
|
+
let count = 0;
|
|
66
|
+
for (const child of argsNode.children) {
|
|
67
|
+
if (!child.isNamed)
|
|
68
|
+
continue;
|
|
69
|
+
if (child.type === 'comment')
|
|
70
|
+
continue;
|
|
71
|
+
count++;
|
|
72
|
+
}
|
|
73
|
+
return count;
|
|
74
|
+
};
|
|
75
|
+
exports.countCallArguments = countCallArguments;
|
|
76
|
+
// ── Call-form discrimination (Phase 1, Step D) ─────────────────────────
|
|
77
|
+
/**
|
|
78
|
+
* AST node types that indicate a member-access wrapper around the callee name.
|
|
79
|
+
* When nameNode.parent.type is one of these, the call is a member call.
|
|
80
|
+
*/
|
|
81
|
+
const MEMBER_ACCESS_NODE_TYPES = new Set([
|
|
82
|
+
'member_expression', // TS/JS: obj.method()
|
|
83
|
+
'attribute', // Python: obj.method()
|
|
84
|
+
'member_access_expression', // C#: obj.Method()
|
|
85
|
+
'field_expression', // Rust/C++: obj.method() / ptr->method()
|
|
86
|
+
'selector_expression', // Go: obj.Method()
|
|
87
|
+
'navigation_suffix', // Kotlin/Swift: obj.method() — nameNode sits inside navigation_suffix
|
|
88
|
+
'member_binding_expression', // C#: user?.Method() — null-conditional access
|
|
89
|
+
'unconditional_assignable_selector', // Dart: obj.method() — nameNode inside selector > unconditional_assignable_selector
|
|
90
|
+
]);
|
|
91
|
+
/**
|
|
92
|
+
* Call node types that are inherently constructor invocations.
|
|
93
|
+
* Only includes patterns that the tree-sitter queries already capture as @call.
|
|
94
|
+
*/
|
|
95
|
+
const CONSTRUCTOR_CALL_NODE_TYPES = new Set([
|
|
96
|
+
'constructor_invocation', // Kotlin: Foo()
|
|
97
|
+
'new_expression', // TS/JS/C++: new Foo()
|
|
98
|
+
'object_creation_expression', // Java/C#/PHP: new Foo()
|
|
99
|
+
'implicit_object_creation_expression', // C# 9: User u = new(...)
|
|
100
|
+
'composite_literal', // Go: User{...}
|
|
101
|
+
'struct_expression', // Rust: User { ... }
|
|
102
|
+
]);
|
|
103
|
+
/**
|
|
104
|
+
* AST node types for scoped/qualified calls (e.g., Foo::new() in Rust, Foo::bar() in C++).
|
|
105
|
+
*/
|
|
106
|
+
const SCOPED_CALL_NODE_TYPES = new Set([
|
|
107
|
+
'scoped_identifier', // Rust: Foo::new()
|
|
108
|
+
'qualified_identifier', // C++: ns::func()
|
|
109
|
+
]);
|
|
110
|
+
/**
|
|
111
|
+
* Infer whether a captured call site is a free call, member call, or constructor.
|
|
112
|
+
* Returns undefined if the form cannot be determined.
|
|
113
|
+
*
|
|
114
|
+
* Works by inspecting the AST structure between callNode (@call) and nameNode (@call.name).
|
|
115
|
+
* No tree-sitter query changes needed — the distinction is in the node types.
|
|
116
|
+
*/
|
|
117
|
+
const inferCallForm = (callNode, nameNode) => {
|
|
118
|
+
// 1. Constructor: callNode itself is a constructor invocation (Kotlin)
|
|
119
|
+
if (CONSTRUCTOR_CALL_NODE_TYPES.has(callNode.type)) {
|
|
120
|
+
return 'constructor';
|
|
121
|
+
}
|
|
122
|
+
// 2. Member call: nameNode's parent is a member-access wrapper
|
|
123
|
+
const nameParent = nameNode.parent;
|
|
124
|
+
if (nameParent && MEMBER_ACCESS_NODE_TYPES.has(nameParent.type)) {
|
|
125
|
+
return 'member';
|
|
126
|
+
}
|
|
127
|
+
// 3. PHP: the callNode itself distinguishes member vs free calls
|
|
128
|
+
if (callNode.type === 'member_call_expression' ||
|
|
129
|
+
callNode.type === 'nullsafe_member_call_expression') {
|
|
130
|
+
return 'member';
|
|
131
|
+
}
|
|
132
|
+
if (callNode.type === 'scoped_call_expression') {
|
|
133
|
+
return 'member'; // static call Foo::bar()
|
|
134
|
+
}
|
|
135
|
+
// 4. Java method_invocation: member if it has an 'object' field
|
|
136
|
+
if (callNode.type === 'method_invocation' && callNode.childForFieldName('object')) {
|
|
137
|
+
return 'member';
|
|
138
|
+
}
|
|
139
|
+
// 4b. Ruby call with receiver: obj.method
|
|
140
|
+
if (callNode.type === 'call' && callNode.childForFieldName('receiver')) {
|
|
141
|
+
return 'member';
|
|
142
|
+
}
|
|
143
|
+
// 5. Scoped calls (Rust Foo::new(), C++ ns::func()): treat as free
|
|
144
|
+
// The receiver is a type, not an instance — handled differently in Phase 3
|
|
145
|
+
if (nameParent && SCOPED_CALL_NODE_TYPES.has(nameParent.type)) {
|
|
146
|
+
return 'free';
|
|
147
|
+
}
|
|
148
|
+
// 6. Default: if nameNode is a direct child of callNode, it's a free call
|
|
149
|
+
if (nameNode.parent === callNode || nameParent?.parent === callNode) {
|
|
150
|
+
return 'free';
|
|
151
|
+
}
|
|
152
|
+
return undefined;
|
|
153
|
+
};
|
|
154
|
+
exports.inferCallForm = inferCallForm;
|
|
155
|
+
/**
|
|
156
|
+
* Extract the receiver identifier for member calls.
|
|
157
|
+
* Only captures simple identifiers — returns undefined for complex expressions
|
|
158
|
+
* like getUser().save() or arr[0].method().
|
|
159
|
+
*/
|
|
160
|
+
const SIMPLE_RECEIVER_TYPES = new Set([
|
|
161
|
+
'identifier',
|
|
162
|
+
'simple_identifier',
|
|
163
|
+
'variable_name', // PHP $variable (tree-sitter-php)
|
|
164
|
+
'name', // PHP name node
|
|
165
|
+
'this', // TS/JS/Java/C# this.method()
|
|
166
|
+
'self', // Rust/Python self.method()
|
|
167
|
+
'super', // TS/JS/Java/Kotlin/Ruby super.method()
|
|
168
|
+
'super_expression', // Kotlin wraps super in super_expression
|
|
169
|
+
'base', // C# base.Method()
|
|
170
|
+
'parent', // PHP parent::method()
|
|
171
|
+
'constant', // Ruby CONSTANT.method() (uppercase identifiers)
|
|
172
|
+
]);
|
|
173
|
+
const extractReceiverName = (nameNode) => {
|
|
174
|
+
const parent = nameNode.parent;
|
|
175
|
+
if (!parent)
|
|
176
|
+
return undefined;
|
|
177
|
+
// PHP: member_call_expression / nullsafe_member_call_expression — receiver is on the callNode
|
|
178
|
+
// Java: method_invocation — receiver is the 'object' field on callNode
|
|
179
|
+
// For these, parent of nameNode is the call itself, so check the call's object field
|
|
180
|
+
const callNode = parent.parent ?? parent;
|
|
181
|
+
let receiver = null;
|
|
182
|
+
// Try standard field names used across grammars
|
|
183
|
+
receiver =
|
|
184
|
+
parent.childForFieldName('object') ?? // TS/JS member_expression, Python attribute, PHP, Java
|
|
185
|
+
parent.childForFieldName('value') ?? // Rust field_expression
|
|
186
|
+
parent.childForFieldName('operand') ?? // Go selector_expression
|
|
187
|
+
parent.childForFieldName('expression') ?? // C# member_access_expression
|
|
188
|
+
parent.childForFieldName('argument'); // C++ field_expression
|
|
189
|
+
// Java method_invocation: 'object' field is on the callNode, not on nameNode's parent
|
|
190
|
+
if (!receiver && callNode.type === 'method_invocation') {
|
|
191
|
+
receiver = callNode.childForFieldName('object');
|
|
192
|
+
}
|
|
193
|
+
// PHP: member_call_expression has 'object' on the call node
|
|
194
|
+
if (!receiver &&
|
|
195
|
+
(callNode.type === 'member_call_expression' ||
|
|
196
|
+
callNode.type === 'nullsafe_member_call_expression')) {
|
|
197
|
+
receiver = callNode.childForFieldName('object');
|
|
198
|
+
}
|
|
199
|
+
// Ruby: call node has 'receiver' field
|
|
200
|
+
if (!receiver && parent.type === 'call') {
|
|
201
|
+
receiver = parent.childForFieldName('receiver');
|
|
202
|
+
}
|
|
203
|
+
// PHP scoped_call_expression (parent::method(), self::method()):
|
|
204
|
+
// nameNode's direct parent IS the scoped_call_expression (name is a direct child)
|
|
205
|
+
if (!receiver &&
|
|
206
|
+
(parent.type === 'scoped_call_expression' || callNode.type === 'scoped_call_expression')) {
|
|
207
|
+
const scopedCall = parent.type === 'scoped_call_expression' ? parent : callNode;
|
|
208
|
+
receiver = scopedCall.childForFieldName('scope');
|
|
209
|
+
// relative_scope wraps 'parent'/'self'/'static' — unwrap to get the keyword
|
|
210
|
+
if (receiver?.type === 'relative_scope') {
|
|
211
|
+
receiver = receiver.firstChild;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Dart: unconditional_assignable_selector is inside a `selector`, which is a sibling
|
|
215
|
+
// of the receiver in the expression_statement. For `user.save()`, the previous named
|
|
216
|
+
// sibling of the `selector` is `identifier [user]`.
|
|
217
|
+
if (!receiver && parent.type === 'unconditional_assignable_selector') {
|
|
218
|
+
const selectorNode = parent.parent; // selector [.save]
|
|
219
|
+
if (selectorNode) {
|
|
220
|
+
receiver = selectorNode.previousNamedSibling;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// C# null-conditional: user?.Save() → conditional_access_expression wraps member_binding_expression
|
|
224
|
+
if (!receiver && parent.type === 'member_binding_expression') {
|
|
225
|
+
const condAccess = parent.parent;
|
|
226
|
+
if (condAccess?.type === 'conditional_access_expression') {
|
|
227
|
+
receiver = condAccess.firstNamedChild;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Kotlin/Swift: navigation_expression target is the first child
|
|
231
|
+
if (!receiver && parent.type === 'navigation_suffix') {
|
|
232
|
+
const navExpr = parent.parent;
|
|
233
|
+
if (navExpr?.type === 'navigation_expression') {
|
|
234
|
+
// First named child is the target (receiver)
|
|
235
|
+
for (const child of navExpr.children) {
|
|
236
|
+
if (child.isNamed && child !== parent) {
|
|
237
|
+
receiver = child;
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (!receiver)
|
|
244
|
+
return undefined;
|
|
245
|
+
// Only capture simple identifiers — refuse complex expressions
|
|
246
|
+
if (SIMPLE_RECEIVER_TYPES.has(receiver.type)) {
|
|
247
|
+
return receiver.text;
|
|
248
|
+
}
|
|
249
|
+
// Python super().method(): receiver is a call node `super()` — extract the function name
|
|
250
|
+
if (receiver.type === 'call') {
|
|
251
|
+
const func = receiver.childForFieldName('function');
|
|
252
|
+
if (func?.text === 'super')
|
|
253
|
+
return 'super';
|
|
254
|
+
}
|
|
255
|
+
return undefined;
|
|
256
|
+
};
|
|
257
|
+
exports.extractReceiverName = extractReceiverName;
|
|
258
|
+
/**
|
|
259
|
+
* Extract the raw receiver AST node for a member call.
|
|
260
|
+
* Unlike extractReceiverName, this returns the receiver node regardless of its type —
|
|
261
|
+
* including call_expression / method_invocation nodes that appear in chained calls
|
|
262
|
+
* like `svc.getUser().save()`.
|
|
263
|
+
*
|
|
264
|
+
* Returns undefined when the call is not a member call or when no receiver node
|
|
265
|
+
* can be found (e.g. top-level free calls).
|
|
266
|
+
*/
|
|
267
|
+
const extractReceiverNode = (nameNode) => {
|
|
268
|
+
const parent = nameNode.parent;
|
|
269
|
+
if (!parent)
|
|
270
|
+
return undefined;
|
|
271
|
+
const callNode = parent.parent ?? parent;
|
|
272
|
+
let receiver = null;
|
|
273
|
+
receiver =
|
|
274
|
+
parent.childForFieldName('object') ??
|
|
275
|
+
parent.childForFieldName('value') ??
|
|
276
|
+
parent.childForFieldName('operand') ??
|
|
277
|
+
parent.childForFieldName('expression') ??
|
|
278
|
+
parent.childForFieldName('argument');
|
|
279
|
+
if (!receiver && callNode.type === 'method_invocation') {
|
|
280
|
+
receiver = callNode.childForFieldName('object');
|
|
281
|
+
}
|
|
282
|
+
if (!receiver &&
|
|
283
|
+
(callNode.type === 'member_call_expression' ||
|
|
284
|
+
callNode.type === 'nullsafe_member_call_expression')) {
|
|
285
|
+
receiver = callNode.childForFieldName('object');
|
|
286
|
+
}
|
|
287
|
+
if (!receiver && parent.type === 'call') {
|
|
288
|
+
receiver = parent.childForFieldName('receiver');
|
|
289
|
+
}
|
|
290
|
+
if (!receiver &&
|
|
291
|
+
(parent.type === 'scoped_call_expression' || callNode.type === 'scoped_call_expression')) {
|
|
292
|
+
const scopedCall = parent.type === 'scoped_call_expression' ? parent : callNode;
|
|
293
|
+
receiver = scopedCall.childForFieldName('scope');
|
|
294
|
+
if (receiver?.type === 'relative_scope') {
|
|
295
|
+
receiver = receiver.firstChild;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// Dart: unconditional_assignable_selector — receiver is previous sibling of the selector
|
|
299
|
+
if (!receiver && parent.type === 'unconditional_assignable_selector') {
|
|
300
|
+
const selectorNode = parent.parent;
|
|
301
|
+
if (selectorNode) {
|
|
302
|
+
receiver = selectorNode.previousNamedSibling;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
if (!receiver && parent.type === 'member_binding_expression') {
|
|
306
|
+
const condAccess = parent.parent;
|
|
307
|
+
if (condAccess?.type === 'conditional_access_expression') {
|
|
308
|
+
receiver = condAccess.firstNamedChild;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (!receiver && parent.type === 'navigation_suffix') {
|
|
312
|
+
const navExpr = parent.parent;
|
|
313
|
+
if (navExpr?.type === 'navigation_expression') {
|
|
314
|
+
for (const child of navExpr.children) {
|
|
315
|
+
if (child.isNamed && child !== parent) {
|
|
316
|
+
receiver = child;
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return receiver ?? undefined;
|
|
323
|
+
};
|
|
324
|
+
exports.extractReceiverNode = extractReceiverNode;
|
|
325
|
+
// ── Chained-call extraction ───────────────────────────────────────────────
|
|
326
|
+
/** Node types representing member/field access across languages. */
|
|
327
|
+
/**
|
|
328
|
+
* Await expressions, per grammar. The walk previously stopped here — an await
|
|
329
|
+
* node is neither a call nor a field access — so `(await svc.getUserAsync()).save()`
|
|
330
|
+
* minted NO chain at all and the receiver fell to the text cascade.
|
|
331
|
+
*/
|
|
332
|
+
const AWAIT_EXPRESSION_NODE_TYPES = new Set([
|
|
333
|
+
'await_expression', // TS/JS/C#/Rust
|
|
334
|
+
'await', // Python
|
|
335
|
+
]);
|
|
336
|
+
/**
|
|
337
|
+
* Subscript / index expressions, per grammar. Same story as await: the walk
|
|
338
|
+
* stopped, so `repos[0].save()` minted no chain — which is why `indexElement`
|
|
339
|
+
* is an INVISIBLE-GAP (no edge AND no recorded drop) in all 14 languages, the
|
|
340
|
+
* most uniform cell in the matrix.
|
|
341
|
+
*/
|
|
342
|
+
const SUBSCRIPT_NODE_TYPES = new Set([
|
|
343
|
+
'subscript_expression', // TS/JS/PHP/C/C++
|
|
344
|
+
'subscript', // Python
|
|
345
|
+
'index_expression', // Go/Rust
|
|
346
|
+
'element_access_expression', // C#
|
|
347
|
+
'array_access', // Java
|
|
348
|
+
'indexing_expression', // Kotlin
|
|
349
|
+
]);
|
|
350
|
+
/**
|
|
351
|
+
* Can the chain walk descend into this node, or is it the base?
|
|
352
|
+
*
|
|
353
|
+
* ONE predicate for all four branches. The call and field branches previously
|
|
354
|
+
* tested only the call/field sets, so a receiver like `x[0].f().g()` stopped at
|
|
355
|
+
* the subscript and returned the literal text `x[0]` as the base — which
|
|
356
|
+
* `isEncodableSegment` accepts, minting a chain whose base binds to nothing. And
|
|
357
|
+
* `(await f()).g.h()` returned `await f()`, rejected on whitespace, minting no
|
|
358
|
+
* chain at all. Adding a fifth step kind must not require remembering four
|
|
359
|
+
* separate call sites.
|
|
360
|
+
*/
|
|
361
|
+
function isChainableReceiverNode(node) {
|
|
362
|
+
return (exports.CALL_EXPRESSION_TYPES.has(node.type) ||
|
|
363
|
+
FIELD_ACCESS_NODE_TYPES.has(node.type) ||
|
|
364
|
+
AWAIT_EXPRESSION_NODE_TYPES.has(node.type) ||
|
|
365
|
+
SUBSCRIPT_NODE_TYPES.has(node.type));
|
|
366
|
+
}
|
|
367
|
+
const FIELD_ACCESS_NODE_TYPES = new Set([
|
|
368
|
+
'member_expression', // TS/JS
|
|
369
|
+
'member_access_expression', // C#
|
|
370
|
+
'selector_expression', // Go
|
|
371
|
+
'field_expression', // Rust/C++
|
|
372
|
+
'field_access', // Java
|
|
373
|
+
'attribute', // Python
|
|
374
|
+
'navigation_expression', // Kotlin/Swift
|
|
375
|
+
'member_binding_expression', // C# null-conditional (user?.Address)
|
|
376
|
+
]);
|
|
377
|
+
/**
|
|
378
|
+
* Walk a receiver AST node that is itself a call expression, accumulating the
|
|
379
|
+
* chain of intermediate method names up to MAX_CHAIN_DEPTH.
|
|
380
|
+
*
|
|
381
|
+
* For `svc.getUser().save()`, called with the receiver of `save` (getUser() call):
|
|
382
|
+
* returns { chain: ['getUser'], baseReceiverName: 'svc' }
|
|
383
|
+
*
|
|
384
|
+
* For `a.b().c().d()`, called with the receiver of `d` (c() call):
|
|
385
|
+
* returns { chain: ['b', 'c'], baseReceiverName: 'a' }
|
|
386
|
+
*/
|
|
387
|
+
function extractCallChain(receiverCallNode) {
|
|
388
|
+
const chain = [];
|
|
389
|
+
let current = receiverCallNode;
|
|
390
|
+
while (exports.CALL_EXPRESSION_TYPES.has(current.type) && chain.length < exports.MAX_CHAIN_DEPTH) {
|
|
391
|
+
// Extract the method name from this call node.
|
|
392
|
+
const funcNode = current.childForFieldName?.('function') ??
|
|
393
|
+
current.childForFieldName?.('name') ??
|
|
394
|
+
current.childForFieldName?.('method'); // Ruby `call` node
|
|
395
|
+
let methodName;
|
|
396
|
+
let innerReceiver = null;
|
|
397
|
+
if (funcNode) {
|
|
398
|
+
// member_expression / attribute: last named child is the method identifier
|
|
399
|
+
methodName = funcNode.lastNamedChild?.text ?? funcNode.text;
|
|
400
|
+
}
|
|
401
|
+
// Kotlin/Swift: call_expression exposes callee as firstNamedChild, not a field.
|
|
402
|
+
// navigation_expression: method name is in navigation_suffix → simple_identifier.
|
|
403
|
+
if (!funcNode && current.type === 'call_expression') {
|
|
404
|
+
const callee = current.firstNamedChild;
|
|
405
|
+
if (callee?.type === 'navigation_expression') {
|
|
406
|
+
const suffix = callee.lastNamedChild;
|
|
407
|
+
if (suffix?.type === 'navigation_suffix') {
|
|
408
|
+
methodName = suffix.lastNamedChild?.text;
|
|
409
|
+
// The receiver is the part of navigation_expression before the suffix
|
|
410
|
+
for (let i = 0; i < callee.namedChildCount; i++) {
|
|
411
|
+
const child = callee.namedChild(i);
|
|
412
|
+
if (child && child.type !== 'navigation_suffix') {
|
|
413
|
+
innerReceiver = child;
|
|
414
|
+
break;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
if (!methodName)
|
|
421
|
+
break;
|
|
422
|
+
chain.unshift(methodName); // build chain outermost-last
|
|
423
|
+
// Walk into the receiver of this call to continue the chain
|
|
424
|
+
if (!innerReceiver && funcNode) {
|
|
425
|
+
innerReceiver =
|
|
426
|
+
funcNode.childForFieldName?.('object') ??
|
|
427
|
+
funcNode.childForFieldName?.('value') ??
|
|
428
|
+
funcNode.childForFieldName?.('operand') ??
|
|
429
|
+
funcNode.childForFieldName?.('expression');
|
|
430
|
+
}
|
|
431
|
+
// Java method_invocation: object field is on the call node
|
|
432
|
+
if (!innerReceiver && current.type === 'method_invocation') {
|
|
433
|
+
innerReceiver = current.childForFieldName?.('object');
|
|
434
|
+
}
|
|
435
|
+
// PHP member_call_expression
|
|
436
|
+
if (!innerReceiver &&
|
|
437
|
+
(current.type === 'member_call_expression' ||
|
|
438
|
+
current.type === 'nullsafe_member_call_expression')) {
|
|
439
|
+
innerReceiver = current.childForFieldName?.('object');
|
|
440
|
+
}
|
|
441
|
+
// Ruby `call` node: receiver field is on the call node itself
|
|
442
|
+
if (!innerReceiver && current.type === 'call') {
|
|
443
|
+
innerReceiver = current.childForFieldName?.('receiver');
|
|
444
|
+
}
|
|
445
|
+
if (!innerReceiver)
|
|
446
|
+
break;
|
|
447
|
+
if (exports.CALL_EXPRESSION_TYPES.has(innerReceiver.type)) {
|
|
448
|
+
current = innerReceiver; // continue walking
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
// Reached a simple identifier — the base receiver
|
|
452
|
+
return {
|
|
453
|
+
chain,
|
|
454
|
+
baseReceiverName: unwrapTransparentReceiver(innerReceiver).text || undefined,
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
return chain.length > 0 ? { chain, baseReceiverName: undefined } : undefined;
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Walk a receiver AST node that may interleave field accesses and method calls,
|
|
462
|
+
* building a unified chain of steps up to MAX_CHAIN_DEPTH.
|
|
463
|
+
*
|
|
464
|
+
* For `svc.getUser().address.save()`, called with the receiver of `save`
|
|
465
|
+
* (`svc.getUser().address`, a field access node):
|
|
466
|
+
* returns { chain: [{ kind:'call', name:'getUser' }, { kind:'field', name:'address' }],
|
|
467
|
+
* baseReceiverName: 'svc' }
|
|
468
|
+
*
|
|
469
|
+
* For `user.getAddress().city.getName()`, called with receiver of `getName`
|
|
470
|
+
* (`user.getAddress().city`):
|
|
471
|
+
* returns { chain: [{ kind:'call', name:'getAddress' }, { kind:'field', name:'city' }],
|
|
472
|
+
* baseReceiverName: 'user' }
|
|
473
|
+
*
|
|
474
|
+
* Pure field chains and pure call chains are special cases (all steps same kind).
|
|
475
|
+
*/
|
|
476
|
+
/**
|
|
477
|
+
* Node types that wrap an expression without changing what it denotes, so a
|
|
478
|
+
* receiver chain's BASE can be read through them.
|
|
479
|
+
*
|
|
480
|
+
* `svc!` (TS non-null assertion) and `(svc)` denote exactly `svc`; taking the
|
|
481
|
+
* wrapper's own text instead yields `svc!` / `(svc)`, which matches no binding
|
|
482
|
+
* and silently costs the chain its base.
|
|
483
|
+
*
|
|
484
|
+
* Deliberately EXCLUDES a cast (`x as T`, `(T)x`): a cast changes the type an
|
|
485
|
+
* expression denotes, so reading through one would type the receiver as the
|
|
486
|
+
* operand rather than as the cast target.
|
|
487
|
+
*
|
|
488
|
+
* Keyed by node type; the value is the operator text that has to TERMINATE the
|
|
489
|
+
* node for the peel to apply, or `null` for a node type that is transparent
|
|
490
|
+
* unconditionally.
|
|
491
|
+
*
|
|
492
|
+
* The gated entry exists because Swift force-unwrap (`self.a!`) is the exact
|
|
493
|
+
* semantic of TypeScript's `non_null_expression` — it yields the wrapped type —
|
|
494
|
+
* but Swift parses it as the general `postfix_expression`, which ALSO carries
|
|
495
|
+
* user-defined postfix operators. Those can return anything, so peeling that
|
|
496
|
+
* node type unconditionally would type the receiver as the operand and could
|
|
497
|
+
* produce a confidently wrong owner. Reading the operator keeps the peel to the
|
|
498
|
+
* case that is provably type-preserving.
|
|
499
|
+
*/
|
|
500
|
+
const TRANSPARENT_RECEIVER_WRAPPERS = new Map([
|
|
501
|
+
['non_null_expression', null], // TypeScript `svc!`
|
|
502
|
+
['parenthesized_expression', null], // `(svc)`
|
|
503
|
+
// NOT Swift-only: Kotlin's `!!` non-null assertion parses as the same node type
|
|
504
|
+
// and is equally type-preserving, so it is peeled too. Measured — the
|
|
505
|
+
// receiver-resolution bench moved `kotlin.nonNullAssert` VISIBLE-GAP ->
|
|
506
|
+
// RESOLVES when this landed, which is how the Kotlin effect was discovered
|
|
507
|
+
// rather than assumed. Any other grammar emitting `postfix_expression` is
|
|
508
|
+
// affected as well; the `!` gate, not the language, is what bounds this.
|
|
509
|
+
['postfix_expression', '!'], // Swift `self.a!`, Kotlin `a!!`
|
|
510
|
+
]);
|
|
511
|
+
/** Is `node` a wrapper that denotes exactly what its operand denotes? */
|
|
512
|
+
function isTransparentReceiverWrapper(node) {
|
|
513
|
+
// `node.type` is a native getter, and this predicate runs on every receiver
|
|
514
|
+
// node. Crossing it twice for two separate table lookups measured 376 ns/check
|
|
515
|
+
// against 188 ns for the single read below.
|
|
516
|
+
const operator = TRANSPARENT_RECEIVER_WRAPPERS.get(node.type);
|
|
517
|
+
// `undefined` is "not in the table"; `null` is "in the table, ungated". The
|
|
518
|
+
// two are distinguishable, so one `get` answers both questions — no separate
|
|
519
|
+
// `has` probe, and one crossing of the native `node.type` getter.
|
|
520
|
+
if (operator === undefined)
|
|
521
|
+
return false;
|
|
522
|
+
if (operator === null)
|
|
523
|
+
return true;
|
|
524
|
+
// The operator is an anonymous token, so it is not in `namedChildren`; the
|
|
525
|
+
// node's own text is the reliable place to read it. Deliberately NOT
|
|
526
|
+
// `node.lastChild` — measured 3x SLOWER (the child wrapper allocation
|
|
527
|
+
// dominates), and the token surfaces with type `bang`, not `!`.
|
|
528
|
+
return node.text.trimEnd().endsWith(operator);
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Iteration bound for the wrapper peel. Its OWN constant, not `MAX_CHAIN_DEPTH`.
|
|
532
|
+
*
|
|
533
|
+
* The two answer unrelated questions — "how many chain hops do we type?" versus
|
|
534
|
+
* "how many redundant parens might someone write?" — and sharing one number
|
|
535
|
+
* meant raising the chain cap silently widened this loop as a side effect. That
|
|
536
|
+
* coupling is easy to miss precisely because the shared name reads as
|
|
537
|
+
* intentional. `((x))` nests twice; nothing real nests deeply.
|
|
538
|
+
*/
|
|
539
|
+
const MAX_TRANSPARENT_WRAPPER_DEPTH = 3;
|
|
540
|
+
/** Peel transparent wrappers off a base receiver node. */
|
|
541
|
+
function unwrapTransparentReceiver(node) {
|
|
542
|
+
let current = node;
|
|
543
|
+
for (let i = 0; i < MAX_TRANSPARENT_WRAPPER_DEPTH && isTransparentReceiverWrapper(current); i++) {
|
|
544
|
+
const inner = current.namedChildren?.find((c) => c !== null);
|
|
545
|
+
if (inner === undefined || inner === null)
|
|
546
|
+
break;
|
|
547
|
+
current = inner;
|
|
548
|
+
}
|
|
549
|
+
return current;
|
|
550
|
+
}
|
|
551
|
+
function extractMixedChain(receiverNode) {
|
|
552
|
+
const chain = [];
|
|
553
|
+
let current = receiverNode;
|
|
554
|
+
while (chain.length < exports.MAX_CHAIN_DEPTH) {
|
|
555
|
+
// Peel transparent wrappers at LOOP ENTRY, not only where a base is
|
|
556
|
+
// returned. `(await svc.getUserAsync()).save()` hands this walk a
|
|
557
|
+
// `parenthesized_expression`, which matches no branch below, so the walk
|
|
558
|
+
// fell straight through to the base case with an empty chain and minted
|
|
559
|
+
// nothing — the await step could never be reached.
|
|
560
|
+
current = unwrapTransparentReceiver(current);
|
|
561
|
+
if (exports.CALL_EXPRESSION_TYPES.has(current.type)) {
|
|
562
|
+
// ── Call expression: extract method name + inner receiver ────────────
|
|
563
|
+
const funcNode = current.childForFieldName?.('function') ??
|
|
564
|
+
current.childForFieldName?.('name') ??
|
|
565
|
+
current.childForFieldName?.('method');
|
|
566
|
+
let methodName;
|
|
567
|
+
let innerReceiver = null;
|
|
568
|
+
if (funcNode) {
|
|
569
|
+
methodName = funcNode.lastNamedChild?.text ?? funcNode.text;
|
|
570
|
+
}
|
|
571
|
+
// Kotlin/Swift: call_expression → navigation_expression
|
|
572
|
+
if (!funcNode && current.type === 'call_expression') {
|
|
573
|
+
const callee = current.firstNamedChild;
|
|
574
|
+
if (callee?.type === 'navigation_expression') {
|
|
575
|
+
const suffix = callee.lastNamedChild;
|
|
576
|
+
if (suffix?.type === 'navigation_suffix') {
|
|
577
|
+
methodName = suffix.lastNamedChild?.text;
|
|
578
|
+
for (let i = 0; i < callee.namedChildCount; i++) {
|
|
579
|
+
const child = callee.namedChild(i);
|
|
580
|
+
if (child && child.type !== 'navigation_suffix') {
|
|
581
|
+
innerReceiver = child;
|
|
582
|
+
break;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
if (!methodName)
|
|
589
|
+
break;
|
|
590
|
+
chain.unshift({ kind: 'call', name: methodName });
|
|
591
|
+
if (!innerReceiver && funcNode) {
|
|
592
|
+
innerReceiver =
|
|
593
|
+
funcNode.childForFieldName?.('object') ??
|
|
594
|
+
funcNode.childForFieldName?.('value') ??
|
|
595
|
+
funcNode.childForFieldName?.('operand') ??
|
|
596
|
+
funcNode.childForFieldName?.('argument') ?? // C/C++ field_expression
|
|
597
|
+
funcNode.childForFieldName?.('expression') ??
|
|
598
|
+
null;
|
|
599
|
+
}
|
|
600
|
+
if (!innerReceiver && current.type === 'method_invocation') {
|
|
601
|
+
innerReceiver = current.childForFieldName?.('object') ?? null;
|
|
602
|
+
}
|
|
603
|
+
if (!innerReceiver &&
|
|
604
|
+
(current.type === 'member_call_expression' ||
|
|
605
|
+
current.type === 'nullsafe_member_call_expression')) {
|
|
606
|
+
innerReceiver = current.childForFieldName?.('object') ?? null;
|
|
607
|
+
}
|
|
608
|
+
if (!innerReceiver && current.type === 'call') {
|
|
609
|
+
innerReceiver = current.childForFieldName?.('receiver') ?? null;
|
|
610
|
+
}
|
|
611
|
+
if (!innerReceiver)
|
|
612
|
+
break;
|
|
613
|
+
if (isChainableReceiverNode(innerReceiver)) {
|
|
614
|
+
current = innerReceiver;
|
|
615
|
+
}
|
|
616
|
+
else {
|
|
617
|
+
return {
|
|
618
|
+
chain,
|
|
619
|
+
baseReceiverName: unwrapTransparentReceiver(innerReceiver).text || undefined,
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
else if (FIELD_ACCESS_NODE_TYPES.has(current.type)) {
|
|
624
|
+
// ── Field/member access: extract property name + inner object ─────────
|
|
625
|
+
let propertyName;
|
|
626
|
+
let innerObject = null;
|
|
627
|
+
if (current.type === 'navigation_expression') {
|
|
628
|
+
for (const child of current.children ?? []) {
|
|
629
|
+
if (child.type === 'navigation_suffix') {
|
|
630
|
+
for (const sc of child.children ?? []) {
|
|
631
|
+
if (sc.isNamed && sc.type !== '.') {
|
|
632
|
+
propertyName = sc.text;
|
|
633
|
+
break;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
else if (child.isNamed && !innerObject) {
|
|
638
|
+
innerObject = child;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
else if (current.type === 'attribute') {
|
|
643
|
+
innerObject = current.childForFieldName?.('object') ?? null;
|
|
644
|
+
propertyName = current.childForFieldName?.('attribute')?.text;
|
|
645
|
+
}
|
|
646
|
+
else {
|
|
647
|
+
innerObject =
|
|
648
|
+
current.childForFieldName?.('object') ??
|
|
649
|
+
current.childForFieldName?.('value') ??
|
|
650
|
+
current.childForFieldName?.('operand') ??
|
|
651
|
+
current.childForFieldName?.('argument') ?? // C/C++ field_expression
|
|
652
|
+
current.childForFieldName?.('expression') ??
|
|
653
|
+
null;
|
|
654
|
+
propertyName = (current.childForFieldName?.('property') ??
|
|
655
|
+
current.childForFieldName?.('field') ??
|
|
656
|
+
current.childForFieldName?.('name'))?.text;
|
|
657
|
+
}
|
|
658
|
+
if (!propertyName)
|
|
659
|
+
break;
|
|
660
|
+
chain.unshift({ kind: 'field', name: propertyName });
|
|
661
|
+
if (!innerObject)
|
|
662
|
+
break;
|
|
663
|
+
if (isChainableReceiverNode(innerObject)) {
|
|
664
|
+
current = innerObject;
|
|
665
|
+
}
|
|
666
|
+
else {
|
|
667
|
+
return {
|
|
668
|
+
chain,
|
|
669
|
+
baseReceiverName: unwrapTransparentReceiver(innerObject).text || undefined,
|
|
670
|
+
};
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
else if (AWAIT_EXPRESSION_NODE_TYPES.has(current.type)) {
|
|
674
|
+
// Name-free: the awaited call's method name already lives on its own
|
|
675
|
+
// `call` step, so this records only that an await happened.
|
|
676
|
+
chain.unshift({ kind: 'await' });
|
|
677
|
+
const inner = current.childForFieldName?.('argument') ??
|
|
678
|
+
current.childForFieldName?.('expression') ??
|
|
679
|
+
current.namedChildren?.find((c) => c !== null) ??
|
|
680
|
+
null;
|
|
681
|
+
if (!inner)
|
|
682
|
+
break;
|
|
683
|
+
if (isChainableReceiverNode(inner)) {
|
|
684
|
+
current = inner;
|
|
685
|
+
}
|
|
686
|
+
else {
|
|
687
|
+
return {
|
|
688
|
+
chain,
|
|
689
|
+
baseReceiverName: unwrapTransparentReceiver(inner).text || undefined,
|
|
690
|
+
};
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
else if (SUBSCRIPT_NODE_TYPES.has(current.type)) {
|
|
694
|
+
// Name-free: a subscript key is a VALUE, not an identifier the resolver
|
|
695
|
+
// could look up, so there is no member name to record.
|
|
696
|
+
chain.unshift({ kind: 'index' });
|
|
697
|
+
// Shared per-grammar table — it knows Python's `value` and Java's `array`,
|
|
698
|
+
// which a locally-written ladder omitted (they worked only because the
|
|
699
|
+
// container happened to be the first named child, an ordering coincidence
|
|
700
|
+
// rather than a contract). Falls back for grammars whose subscript node
|
|
701
|
+
// carries no `index` field.
|
|
702
|
+
const obj = (0, callable_flow_captures_js_1.subscriptBase)(current) ??
|
|
703
|
+
current.childForFieldName?.('object') ??
|
|
704
|
+
current.childForFieldName?.('argument') ??
|
|
705
|
+
current.childForFieldName?.('operand') ??
|
|
706
|
+
current.childForFieldName?.('expression') ??
|
|
707
|
+
current.namedChildren?.find((c) => c !== null) ??
|
|
708
|
+
null;
|
|
709
|
+
if (!obj)
|
|
710
|
+
break;
|
|
711
|
+
if (isChainableReceiverNode(obj)) {
|
|
712
|
+
current = obj;
|
|
713
|
+
}
|
|
714
|
+
else {
|
|
715
|
+
return {
|
|
716
|
+
chain,
|
|
717
|
+
baseReceiverName: unwrapTransparentReceiver(obj).text || undefined,
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
else if (current.type === 'selector') {
|
|
722
|
+
// ── Dart: flat selector siblings (user.address.save() uses selector nodes) ──
|
|
723
|
+
// Extract field name from unconditional_assignable_selector child
|
|
724
|
+
const uas = current.namedChildren?.find((c) => c.type === 'unconditional_assignable_selector');
|
|
725
|
+
const propertyName = uas?.namedChildren?.find((c) => c.type === 'identifier')?.text;
|
|
726
|
+
if (!propertyName)
|
|
727
|
+
break;
|
|
728
|
+
chain.unshift({ kind: 'field', name: propertyName });
|
|
729
|
+
// Walk to previous sibling for the next step in the chain
|
|
730
|
+
const prev = current.previousNamedSibling;
|
|
731
|
+
if (!prev)
|
|
732
|
+
break;
|
|
733
|
+
if (prev.type === 'selector') {
|
|
734
|
+
current = prev;
|
|
735
|
+
}
|
|
736
|
+
else {
|
|
737
|
+
// Base receiver (identifier or other terminal)
|
|
738
|
+
return { chain, baseReceiverName: prev.text || undefined };
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
else {
|
|
742
|
+
// Simple identifier — this is the base receiver
|
|
743
|
+
return chain.length > 0 ? { chain, baseReceiverName: current.text || undefined } : undefined;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
return chain.length > 0 ? { chain, baseReceiverName: undefined } : undefined;
|
|
747
|
+
}
|
|
748
|
+
/** Arg types per call position (literals + optional TypeEnv for ids); undefined if unusable */
|
|
749
|
+
const extractCallArgTypes = (callNode, inferLiteralType, typeEnvLookup) => {
|
|
750
|
+
let argList = callNode.childForFieldName?.('arguments') ??
|
|
751
|
+
callNode.children.find((c) => c.type === 'arguments' || c.type === 'argument_list' || c.type === 'value_arguments');
|
|
752
|
+
if (!argList) {
|
|
753
|
+
const callSuffix = callNode.children.find((c) => c.type === 'call_suffix');
|
|
754
|
+
if (callSuffix) {
|
|
755
|
+
argList = callSuffix.children.find((c) => c.type === 'value_arguments');
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
if (!argList)
|
|
759
|
+
return undefined;
|
|
760
|
+
const argTypes = [];
|
|
761
|
+
for (const arg of argList.namedChildren) {
|
|
762
|
+
if (arg.type === 'comment')
|
|
763
|
+
continue;
|
|
764
|
+
const valueNode = arg.childForFieldName?.('value') ??
|
|
765
|
+
arg.childForFieldName?.('expression') ??
|
|
766
|
+
(arg.type === 'argument' || arg.type === 'value_argument'
|
|
767
|
+
? (arg.firstNamedChild ?? arg)
|
|
768
|
+
: arg);
|
|
769
|
+
let inferred = inferLiteralType(valueNode);
|
|
770
|
+
if (!inferred && typeEnvLookup && valueNode.type === 'identifier') {
|
|
771
|
+
inferred = typeEnvLookup(valueNode.text, callNode);
|
|
772
|
+
}
|
|
773
|
+
argTypes.push(inferred);
|
|
774
|
+
}
|
|
775
|
+
if (argTypes.every((t) => t === undefined))
|
|
776
|
+
return undefined;
|
|
777
|
+
return argTypes;
|
|
778
|
+
};
|
|
779
|
+
exports.extractCallArgTypes = extractCallArgTypes;
|