cgraphx 2.0.1 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.claude-template/FLOW-MAP.md +7 -5
- package/dist/.claude-template/commands/end.md +1 -1
- package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +2 -1
- package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +4 -2
- package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +5 -2
- package/dist/.claude-template/skills/iboc-check/SKILL.md +116 -0
- package/dist/.claude-template/skills/iboc-check/filler-prompt.md +75 -0
- package/dist/.claude-template/skills/implementation/SKILL.md +7 -0
- package/dist/.claude-template/skills/init-project-guides/SKILL.md +1 -1
- package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
- package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
- package/dist/.claude-template/skills/write-api/assets/template-request.bru +3 -3
- package/dist/.claude-template/skills/write-api/references/bru-format.md +6 -6
- package/dist/.claude-template/skills/write-delivery-guide/SKILL.md +97 -0
- package/dist/.claude-template/skills/write-delivery-guide/template-change-type.md +120 -0
- package/dist/.claude-template/skills/write-delivery-guide/template-multi-role-flow.md +148 -0
- package/dist/.claude-template/skills/write-unit-test-code/SKILL.md +23 -6
- package/dist/core/code/engine/cli/analyze-config.js +320 -0
- package/dist/core/code/engine/cli/analyze.js +1086 -0
- package/dist/core/code/engine/cli/cli-message.js +83 -0
- package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
- package/dist/core/code/engine/cli/embedding-dims.js +43 -0
- package/dist/core/code/engine/cli/format-elapsed.js +12 -0
- package/dist/core/code/engine/cli/help-i18n.js +144 -0
- package/dist/core/code/engine/cli/i18n/en.js +110 -0
- package/dist/core/code/engine/cli/i18n/index.js +47 -0
- package/dist/core/code/engine/cli/i18n/resources.js +9 -0
- package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
- package/dist/core/code/engine/cli/lazy-action.js +67 -0
- package/dist/core/code/engine/cli/optional-grammars.js +136 -0
- package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
- package/dist/core/code/engine/cli/status.js +156 -0
- package/dist/core/code/engine/cli/tool.js +384 -0
- package/dist/core/code/engine/config/ignore-service.js +511 -0
- package/dist/core/code/engine/config/supported-languages.js +17 -0
- package/dist/core/code/engine/core/analysis-features.js +64 -0
- package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
- package/dist/core/code/engine/core/git-staleness.js +180 -0
- package/dist/core/code/engine/core/graph/graph.js +180 -0
- package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
- package/dist/core/code/engine/core/graph/types.js +2 -0
- package/dist/core/code/engine/core/index-freshness.js +12 -0
- package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
- package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
- package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
- package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
- package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
- package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
- package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
- package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
- package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
- package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
- package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
- package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
- package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
- package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
- package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
- package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
- package/dist/core/code/engine/core/ingestion/constants.js +26 -0
- package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
- package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
- package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
- package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
- package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
- package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
- package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
- package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
- package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
- package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
- package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
- package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
- package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
- package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
- package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
- package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
- package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
- package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
- package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
- package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
- package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
- package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
- package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
- package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
- package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
- package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
- package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
- package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
- package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
- package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
- package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
- package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
- package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
- package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
- package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
- package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
- package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
- package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
- package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
- package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
- package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
- package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
- package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
- package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
- package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
- package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
- package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
- package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
- package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
- package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
- package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
- package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
- package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
- package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
- package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
- package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
- package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
- package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
- package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
- package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
- package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
- package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
- package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
- package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
- package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
- package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
- package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
- package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
- package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
- package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
- package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
- package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
- package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
- package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
- package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
- package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
- package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
- package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
- package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
- package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
- package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
- package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
- package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
- package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
- package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
- package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
- package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
- package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
- package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
- package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
- package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
- package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
- package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
- package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
- package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
- package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
- package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
- package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
- package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
- package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
- package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
- package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
- package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
- package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
- package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
- package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
- package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
- package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
- package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
- package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
- package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
- package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
- package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
- package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
- package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
- package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
- package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
- package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
- package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
- package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
- package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
- package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
- package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
- package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
- package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
- package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
- package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
- package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
- package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
- package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
- package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
- package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
- package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
- package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
- package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
- package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
- package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
- package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
- package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
- package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
- package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
- package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
- package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
- package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
- package/dist/core/code/engine/core/lbug/native-check.js +435 -0
- package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
- package/dist/core/code/engine/core/lbug/query-params.js +25 -0
- package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
- package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
- package/dist/core/code/engine/core/lbug/schema.js +771 -0
- package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
- package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
- package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
- package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
- package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
- package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
- package/dist/core/code/engine/core/logger.js +339 -0
- package/dist/core/code/engine/core/platform/capabilities.js +91 -0
- package/dist/core/code/engine/core/run-analyze.js +1098 -0
- package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
- package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
- package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
- package/dist/core/code/engine/lib/utils.js +121 -0
- package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
- package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
- package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
- package/dist/core/code/engine/mcp/local/limits.js +15 -0
- package/dist/core/code/engine/mcp/local/line-display.js +6 -0
- package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
- package/dist/core/code/engine/storage/branch-index.js +72 -0
- package/dist/core/code/engine/storage/file-hash.js +95 -0
- package/dist/core/code/engine/storage/fs-atomic.js +34 -0
- package/dist/core/code/engine/storage/git.js +555 -0
- package/dist/core/code/engine/storage/index-lock.js +664 -0
- package/dist/core/code/engine/storage/parse-cache.js +650 -0
- package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
- package/dist/core/code/engine/storage/repo-manager.js +1061 -0
- package/dist/core/code/engine/storage/scope-index-store.js +247 -0
- package/dist/core/code/engine/types/pipeline.js +2 -0
- package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
- package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
- package/dist/core/code/shared/graph/types.js +8 -0
- package/dist/core/code/shared/index.js +105 -0
- package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
- package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
- package/dist/core/code/shared/integrations/retry.js +70 -0
- package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
- package/dist/core/code/shared/language-detection.js +162 -0
- package/dist/core/code/shared/languages.js +27 -0
- package/dist/core/code/shared/lbug/schema-constants.js +98 -0
- package/dist/core/code/shared/mro-strategy.js +2 -0
- package/dist/core/code/shared/pipeline.js +5 -0
- package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
- package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
- package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
- package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
- package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
- package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
- package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
- package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
- package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
- package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
- package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
- package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
- package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
- package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
- package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
- package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
- package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
- package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
- package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
- package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
- package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
- package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
- package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
- package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
- package/dist/core/code/shared/scope-resolution/types.js +25 -0
- package/dist/core/code/shared/test-helpers.js +17 -0
- package/dist/core/code/vendor/leiden/index.cjs +355 -0
- package/dist/core/code/vendor/leiden/utils.cjs +419 -0
- package/dist/core/features/scanner.d.ts +2 -0
- package/dist/core/features/scanner.d.ts.map +1 -1
- package/dist/core/features/scanner.js +27 -6
- package/dist/core/features/scanner.js.map +1 -1
- package/dist/core/timeline/cli.d.ts.map +1 -1
- package/dist/core/timeline/cli.js +13 -6
- package/dist/core/timeline/cli.js.map +1 -1
- package/dist/core/timeline/debris.d.ts +20 -0
- package/dist/core/timeline/debris.d.ts.map +1 -0
- package/dist/core/timeline/debris.js +124 -0
- package/dist/core/timeline/debris.js.map +1 -0
- package/dist/core/timeline/hook-runner.d.ts.map +1 -1
- package/dist/core/timeline/hook-runner.js +3 -1
- package/dist/core/timeline/hook-runner.js.map +1 -1
- package/dist/core/timeline/hooks.d.ts.map +1 -1
- package/dist/core/timeline/hooks.js +13 -5
- package/dist/core/timeline/hooks.js.map +1 -1
- package/dist/core/timeline/installer.d.ts +2 -0
- package/dist/core/timeline/installer.d.ts.map +1 -1
- package/dist/core/timeline/installer.js +12 -0
- package/dist/core/timeline/installer.js.map +1 -1
- package/dist/core/timeline/project-root.d.ts +21 -0
- package/dist/core/timeline/project-root.d.ts.map +1 -0
- package/dist/core/timeline/project-root.js +83 -0
- package/dist/core/timeline/project-root.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,1122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `emitScopeCaptures` for JavaScript.
|
|
4
|
+
*
|
|
5
|
+
* Adapts `emitTsScopeCaptures` for the JavaScript grammar:
|
|
6
|
+
*
|
|
7
|
+
* 1. **JS grammar** — uses `tree-sitter-javascript` instead of
|
|
8
|
+
* `tree-sitter-typescript`. The JS scope query is a subset of the
|
|
9
|
+
* TypeScript one (TypeScript-only node types dropped).
|
|
10
|
+
*
|
|
11
|
+
* 2. **CJS `require()` decomposition** — `const { X } = require('./m')`
|
|
12
|
+
* and `const X = require('./m')` are walked in a post-query pass and
|
|
13
|
+
* synthesized as `@import.kind/name/alias/source` markers so that
|
|
14
|
+
* `interpretJsImport` can recover a `ParsedImport` using the same
|
|
15
|
+
* shape as the TypeScript ESM decomposer.
|
|
16
|
+
*
|
|
17
|
+
* 3. **JSDoc type bindings** — JavaScript has no static type annotations
|
|
18
|
+
* so `@type-binding.parameter` / `@type-binding.return` must be
|
|
19
|
+
* inferred from leading JSDoc comments. A lightweight regex scanner
|
|
20
|
+
* (`parseJsDocParams` / `parseJsDocReturn`) extracts `@param {T} n`
|
|
21
|
+
* and `@returns {T}` tags and emits synthetic captures positioned on
|
|
22
|
+
* the annotated function node. `@type {T}` on a class FIELD is the same
|
|
23
|
+
* story one level down — it is the only way JavaScript can declare a
|
|
24
|
+
* field's type at all — and emits `@type-binding.class-field` (#2833).
|
|
25
|
+
*
|
|
26
|
+
* 4. **Shared synthesis passes** — destructuring, for-of map-tuple, and
|
|
27
|
+
* instanceof narrowing passes are duplicated from `typescript/captures.ts`
|
|
28
|
+
* (they are pure AST operations with no grammar-specific logic).
|
|
29
|
+
*
|
|
30
|
+
* Pure given the input source text. No I/O, no globals consulted.
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.FUNCTION_NODE_TYPES = void 0;
|
|
34
|
+
exports.emitJsScopeCaptures = emitJsScopeCaptures;
|
|
35
|
+
const ast_helpers_js_1 = require("../../utils/ast-helpers.js");
|
|
36
|
+
const import_decomposer_js_1 = require("../typescript/import-decomposer.js");
|
|
37
|
+
const query_js_1 = require("./query.js");
|
|
38
|
+
const arity_metadata_js_1 = require("../typescript/arity-metadata.js");
|
|
39
|
+
const receiver_binding_js_1 = require("../typescript/receiver-binding.js");
|
|
40
|
+
const array_callback_js_1 = require("../typescript/array-callback.js");
|
|
41
|
+
const captures_js_1 = require("../typescript/captures.js");
|
|
42
|
+
const interpret_js_1 = require("../typescript/interpret.js");
|
|
43
|
+
/** JavaScript's spelling of a class-field declaration — the TypeScript grammar
|
|
44
|
+
* calls the same construct `public_field_definition`. Named here, not in the
|
|
45
|
+
* shared predicate, so each literal is checked against the grammar of the file
|
|
46
|
+
* it lives in (`grammar-literal-validation`). */
|
|
47
|
+
const JS_CLASS_FIELD_DEFINITION_TYPES = new Set(['field_definition']);
|
|
48
|
+
const helpers_js_1 = require("../../field-extractors/configs/helpers.js");
|
|
49
|
+
const cjs_module_exports_js_1 = require("../typescript/cjs-module-exports.js");
|
|
50
|
+
const cjs_export_assignment_js_1 = require("../typescript/cjs-export-assignment.js");
|
|
51
|
+
const constants_js_1 = require("../../constants.js");
|
|
52
|
+
const safe_parse_js_1 = require("../../../tree-sitter/safe-parse.js");
|
|
53
|
+
const callable_flow_captures_js_1 = require("../../utils/callable-flow-captures.js");
|
|
54
|
+
const receiver_chain_captures_js_1 = require("../../utils/receiver-chain-captures.js");
|
|
55
|
+
const ts_js_hoc_utils_js_1 = require("../../ts-js-hoc-utils.js");
|
|
56
|
+
/** JS function-like node types that may carry a synthesized `this` binding.
|
|
57
|
+
* Kept in sync with the `@scope.function` patterns in `query.ts`. */
|
|
58
|
+
exports.FUNCTION_NODE_TYPES = [
|
|
59
|
+
'method_definition',
|
|
60
|
+
'arrow_function',
|
|
61
|
+
'function_expression',
|
|
62
|
+
'function_declaration',
|
|
63
|
+
'generator_function_declaration',
|
|
64
|
+
// The EXPRESSION form (`const g = function* () {}`) — see the matching note
|
|
65
|
+
// in `typescript/captures.ts`.
|
|
66
|
+
'generator_function',
|
|
67
|
+
];
|
|
68
|
+
/** Nodes whose `statement_block` child is their BODY, not a nested block. */
|
|
69
|
+
const JS_FUNCTION_BODY_OWNER_TYPES = new Set(exports.FUNCTION_NODE_TYPES);
|
|
70
|
+
/** Direct-child node types that create a BINDING in their enclosing block.
|
|
71
|
+
* `variable_declaration` (`var`) is deliberately absent: it hoists past the
|
|
72
|
+
* block to the function, so a block containing only `var` binds nothing. */
|
|
73
|
+
const BLOCK_BINDING_CHILD_TYPES = new Set([
|
|
74
|
+
'lexical_declaration',
|
|
75
|
+
'class_declaration',
|
|
76
|
+
'function_declaration',
|
|
77
|
+
'generator_function_declaration',
|
|
78
|
+
]);
|
|
79
|
+
/** True when `block` directly declares a name, i.e. it is a real environment
|
|
80
|
+
* record rather than punctuation. A block that binds nothing is transparent to
|
|
81
|
+
* every scope-chain walk — a lookup finds nothing in it and continues to the
|
|
82
|
+
* parent — so emitting a scope for it costs tree size and walk depth and buys
|
|
83
|
+
* exactly nothing. Only DIRECT children count: a declaration in a nested block
|
|
84
|
+
* belongs to that block, which gets its own scope by the same rule. */
|
|
85
|
+
const blockDeclaresBinding = (block) => {
|
|
86
|
+
for (let i = 0; i < block.namedChildCount; i++) {
|
|
87
|
+
const child = block.namedChild(i);
|
|
88
|
+
if (child !== null && BLOCK_BINDING_CHILD_TYPES.has(child.type))
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
};
|
|
93
|
+
/** Declaration anchors that carry function-like arity metadata. */
|
|
94
|
+
const FUNCTION_DECL_TAGS = ['@declaration.method', '@declaration.function'];
|
|
95
|
+
/** Callsite anchors that should carry `@reference.arity` + param types. */
|
|
96
|
+
const CALL_TAGS = [
|
|
97
|
+
'@reference.call.free',
|
|
98
|
+
'@reference.call.member',
|
|
99
|
+
'@reference.call.constructor',
|
|
100
|
+
];
|
|
101
|
+
const JS_CALLABLE_CAPTURE_OPTIONS = {
|
|
102
|
+
functionNodeTypes: new Set(exports.FUNCTION_NODE_TYPES),
|
|
103
|
+
callNodeTypes: new Set(['call_expression']),
|
|
104
|
+
parameterListNodeTypes: new Set(['formal_parameters', 'arguments']),
|
|
105
|
+
parameterNodeTypes: new Set(['identifier', 'rest_pattern', 'assignment_pattern']),
|
|
106
|
+
bindingNodeTypes: new Set(['variable_declarator']),
|
|
107
|
+
assignmentNodeTypes: new Set(['assignment_expression', 'augmented_assignment_expression']),
|
|
108
|
+
identifierNodeTypes: new Set([
|
|
109
|
+
'identifier',
|
|
110
|
+
'property_identifier',
|
|
111
|
+
'shorthand_property_identifier_pattern',
|
|
112
|
+
'private_property_identifier',
|
|
113
|
+
]),
|
|
114
|
+
};
|
|
115
|
+
function pickFirstDefined(grouped, tags) {
|
|
116
|
+
for (const tag of tags) {
|
|
117
|
+
const cap = grouped[tag];
|
|
118
|
+
if (cap !== undefined)
|
|
119
|
+
return cap;
|
|
120
|
+
}
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
function pickFirstNode(groupedNodes, tags) {
|
|
124
|
+
for (const tag of tags) {
|
|
125
|
+
const node = groupedNodes[tag];
|
|
126
|
+
if (node !== undefined)
|
|
127
|
+
return node;
|
|
128
|
+
}
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
/** Walks the parent chain from `node` (inclusive), returning the first node
|
|
132
|
+
* whose type matches, or null. Faster than `findNodeAtRange` when the caller
|
|
133
|
+
* already holds the anchor node — avoids re-scanning the tree from the root. */
|
|
134
|
+
function findSelfOrAncestorOfType(node, type) {
|
|
135
|
+
if (node === undefined)
|
|
136
|
+
return null;
|
|
137
|
+
let current = node;
|
|
138
|
+
while (current !== null) {
|
|
139
|
+
if (current.type === type)
|
|
140
|
+
return current;
|
|
141
|
+
current = current.parent;
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
/** Walks the parent chain from `node` (inclusive), returning the first node
|
|
146
|
+
* whose type is in the set, or null. Plural form of {@link findSelfOrAncestorOfType}. */
|
|
147
|
+
function findSelfOrAncestorOfTypes(node, types) {
|
|
148
|
+
if (node === undefined)
|
|
149
|
+
return null;
|
|
150
|
+
let current = node;
|
|
151
|
+
while (current !== null) {
|
|
152
|
+
if (types.includes(current.type))
|
|
153
|
+
return current;
|
|
154
|
+
current = current.parent;
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
/** Filter `@reference.read.member` in non-read contexts (same logic as TS). */
|
|
159
|
+
function shouldEmitReadMember(memberNode) {
|
|
160
|
+
const parent = memberNode.parent;
|
|
161
|
+
if (parent === null)
|
|
162
|
+
return true;
|
|
163
|
+
switch (parent.type) {
|
|
164
|
+
case 'call_expression':
|
|
165
|
+
return parent.childForFieldName('function')?.id !== memberNode.id;
|
|
166
|
+
case 'new_expression':
|
|
167
|
+
return parent.childForFieldName('constructor')?.id !== memberNode.id;
|
|
168
|
+
case 'assignment_expression':
|
|
169
|
+
case 'augmented_assignment_expression':
|
|
170
|
+
return parent.childForFieldName('left')?.id !== memberNode.id;
|
|
171
|
+
case 'jsx_self_closing_element':
|
|
172
|
+
case 'jsx_opening_element':
|
|
173
|
+
return parent.childForFieldName('name')?.id !== memberNode.id;
|
|
174
|
+
default:
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** Find the first JS function-like node at the given range.
|
|
179
|
+
* Prefers the threaded anchor node (walk up its parent chain) so the common
|
|
180
|
+
* case avoids a root re-scan; falls back to a range scan from root only when
|
|
181
|
+
* the anchor isn't a function-like (or isn't supplied). */
|
|
182
|
+
function findFunctionNode(rootNode, range, anchorNode) {
|
|
183
|
+
const fromAnchor = findSelfOrAncestorOfTypes(anchorNode, exports.FUNCTION_NODE_TYPES);
|
|
184
|
+
if (fromAnchor !== null)
|
|
185
|
+
return fromAnchor;
|
|
186
|
+
for (const nodeType of exports.FUNCTION_NODE_TYPES) {
|
|
187
|
+
const n = (0, ast_helpers_js_1.findNodeAtRange)(rootNode, range, nodeType);
|
|
188
|
+
if (n !== null)
|
|
189
|
+
return n;
|
|
190
|
+
}
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
/** Infer a callsite argument's static type from literal shapes. */
|
|
194
|
+
function inferArgType(argNode) {
|
|
195
|
+
switch (argNode.type) {
|
|
196
|
+
case 'number':
|
|
197
|
+
return 'number';
|
|
198
|
+
case 'string':
|
|
199
|
+
case 'template_string':
|
|
200
|
+
return 'string';
|
|
201
|
+
case 'true':
|
|
202
|
+
case 'false':
|
|
203
|
+
return 'boolean';
|
|
204
|
+
case 'null':
|
|
205
|
+
return 'null';
|
|
206
|
+
case 'undefined':
|
|
207
|
+
return 'undefined';
|
|
208
|
+
case 'array':
|
|
209
|
+
return 'Array';
|
|
210
|
+
case 'object':
|
|
211
|
+
return 'object';
|
|
212
|
+
case 'regex':
|
|
213
|
+
return 'RegExp';
|
|
214
|
+
case 'new_expression': {
|
|
215
|
+
const ctor = argNode.childForFieldName('constructor');
|
|
216
|
+
return ctor?.text ?? '';
|
|
217
|
+
}
|
|
218
|
+
default:
|
|
219
|
+
return '';
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// ─── CJS require() decomposition ─────────────────────────────────────────
|
|
223
|
+
/**
|
|
224
|
+
* Walk the AST and synthesize `@import.*` captures for CJS `require()` calls:
|
|
225
|
+
*
|
|
226
|
+
* - `const { X, Y } = require('./m')` → one match per destructured name,
|
|
227
|
+
* `@import.kind = 'named'`, `@import.name = X / Y`.
|
|
228
|
+
* - `const X = require('./m')` → `@import.kind = 'namespace'`,
|
|
229
|
+
* `@import.alias = X` (the whole module is bound to X).
|
|
230
|
+
* - `require('./m')` as a bare expression-statement → side-effect.
|
|
231
|
+
*
|
|
232
|
+
* CJS named-alias form (`const { X: alias } = require('./m')`) emits
|
|
233
|
+
* `@import.kind = 'named-alias'` with `@import.name = X` and
|
|
234
|
+
* `@import.alias = alias`.
|
|
235
|
+
*
|
|
236
|
+
* The synthesized markers are identical to those produced by
|
|
237
|
+
* `splitImportStatement` for ESM, so `interpretJsImport` can delegate
|
|
238
|
+
* unchanged to `interpretTsImport` for all cases.
|
|
239
|
+
*/
|
|
240
|
+
function synthesizeCjsImports(root, out) {
|
|
241
|
+
const stack = [root];
|
|
242
|
+
for (;;) {
|
|
243
|
+
const node = stack.pop();
|
|
244
|
+
if (node === undefined)
|
|
245
|
+
break;
|
|
246
|
+
for (const child of node.namedChildren) {
|
|
247
|
+
if (child !== null)
|
|
248
|
+
stack.push(child);
|
|
249
|
+
}
|
|
250
|
+
if (node.type !== 'call_expression')
|
|
251
|
+
continue;
|
|
252
|
+
// Require call: function must be bare identifier "require".
|
|
253
|
+
const fn = node.childForFieldName('function');
|
|
254
|
+
if (fn === null || fn.type !== 'identifier' || fn.text !== 'require')
|
|
255
|
+
continue;
|
|
256
|
+
const argsNode = node.childForFieldName('arguments');
|
|
257
|
+
if (argsNode === null)
|
|
258
|
+
continue;
|
|
259
|
+
// Source must be a string literal.
|
|
260
|
+
const firstArg = argsNode.namedChild(0);
|
|
261
|
+
if (firstArg === null || firstArg.type !== 'string')
|
|
262
|
+
continue;
|
|
263
|
+
const rawSource = firstArg.text; // includes surrounding quotes
|
|
264
|
+
const source = firstArg.namedChild(0)?.text ?? rawSource.slice(1, -1);
|
|
265
|
+
const parent = node.parent;
|
|
266
|
+
// Case 1: const { X } = require('./m') OR const X = require('./m')
|
|
267
|
+
if (parent?.type === 'variable_declarator') {
|
|
268
|
+
const nameNode = parent.childForFieldName('name');
|
|
269
|
+
if (nameNode === null)
|
|
270
|
+
continue;
|
|
271
|
+
if (nameNode.type === 'object_pattern') {
|
|
272
|
+
// Destructured: emit one match per specifier.
|
|
273
|
+
for (const field of nameNode.namedChildren) {
|
|
274
|
+
if (field === null)
|
|
275
|
+
continue;
|
|
276
|
+
if (field.type === 'shorthand_property_identifier_pattern') {
|
|
277
|
+
const name = field.text;
|
|
278
|
+
out.push({
|
|
279
|
+
'@import.statement': (0, ast_helpers_js_1.syntheticCapture)('@import.statement', node, rawSource),
|
|
280
|
+
'@import.kind': (0, ast_helpers_js_1.syntheticCapture)('@import.kind', node, 'named'),
|
|
281
|
+
'@import.name': (0, ast_helpers_js_1.syntheticCapture)('@import.name', field, name),
|
|
282
|
+
'@import.source': (0, ast_helpers_js_1.syntheticCapture)('@import.source', firstArg, source),
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
else if (field.type === 'pair_pattern') {
|
|
286
|
+
const key = field.childForFieldName('key');
|
|
287
|
+
const value = field.childForFieldName('value');
|
|
288
|
+
if (key === null || value === null || value.type !== 'identifier')
|
|
289
|
+
continue;
|
|
290
|
+
out.push({
|
|
291
|
+
'@import.statement': (0, ast_helpers_js_1.syntheticCapture)('@import.statement', node, rawSource),
|
|
292
|
+
'@import.kind': (0, ast_helpers_js_1.syntheticCapture)('@import.kind', node, 'named-alias'),
|
|
293
|
+
'@import.name': (0, ast_helpers_js_1.syntheticCapture)('@import.name', key, key.text),
|
|
294
|
+
'@import.alias': (0, ast_helpers_js_1.syntheticCapture)('@import.alias', value, value.text),
|
|
295
|
+
'@import.source': (0, ast_helpers_js_1.syntheticCapture)('@import.source', firstArg, source),
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
else if (nameNode.type === 'identifier') {
|
|
301
|
+
// Namespace-style: const X = require('./m') → bind whole module to X.
|
|
302
|
+
out.push({
|
|
303
|
+
'@import.statement': (0, ast_helpers_js_1.syntheticCapture)('@import.statement', node, rawSource),
|
|
304
|
+
'@import.kind': (0, ast_helpers_js_1.syntheticCapture)('@import.kind', node, 'namespace'),
|
|
305
|
+
'@import.alias': (0, ast_helpers_js_1.syntheticCapture)('@import.alias', nameNode, nameNode.text),
|
|
306
|
+
'@import.source': (0, ast_helpers_js_1.syntheticCapture)('@import.source', firstArg, source),
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
// Case 2: bare require('./m') — side-effect import.
|
|
312
|
+
if (parent?.type === 'expression_statement') {
|
|
313
|
+
out.push({
|
|
314
|
+
'@import.statement': (0, ast_helpers_js_1.syntheticCapture)('@import.statement', node, rawSource),
|
|
315
|
+
'@import.kind': (0, ast_helpers_js_1.syntheticCapture)('@import.kind', node, 'side-effect'),
|
|
316
|
+
'@import.source': (0, ast_helpers_js_1.syntheticCapture)('@import.source', firstArg, source),
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/** Extract `@param {Type} name` entries from a JSDoc comment block. */
|
|
322
|
+
function parseJsDocParams(text) {
|
|
323
|
+
const results = [];
|
|
324
|
+
// Match @param {Type} name or @param {Type} [name] (optional)
|
|
325
|
+
const re = /@param\s+\{([^}]+)\}\s+\[?(\w+)\]?/g;
|
|
326
|
+
let m;
|
|
327
|
+
while ((m = re.exec(text)) !== null) {
|
|
328
|
+
results.push({ type: m[1].trim(), name: m[2].trim() });
|
|
329
|
+
}
|
|
330
|
+
return results;
|
|
331
|
+
}
|
|
332
|
+
/** Extract `@returns {Type}` or `@return {Type}` from a JSDoc comment. */
|
|
333
|
+
function parseJsDocReturn(text) {
|
|
334
|
+
const m = /@returns?\s+\{([^}]+)\}/.exec(text);
|
|
335
|
+
return m ? m[1].trim() : null;
|
|
336
|
+
}
|
|
337
|
+
/** Extract `@type {Type}` from a JSDoc comment (variable-level annotation). */
|
|
338
|
+
function parseJsDocType(text) {
|
|
339
|
+
const m = /@type\s+\{([^}]+)\}/.exec(text);
|
|
340
|
+
return m ? m[1].trim() : null;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* A type REFERENCE, possibly qualified, generic, or unioned:
|
|
344
|
+
* `Repo`, `Repo<User>`, `models.Repo`, `Handler<Req, Res>`, `Repo|null`,
|
|
345
|
+
* `Repo<User> | null`.
|
|
346
|
+
*
|
|
347
|
+
* Applied only to a string already capped by {@link JSDOC_TYPE_MAX_LENGTH}:
|
|
348
|
+
* the union and generic groups both nest quantifiers, so an unbounded
|
|
349
|
+
* non-matching input is a backtracking hazard, and a docblock's `{…}` payload
|
|
350
|
+
* is attacker-shaped text (it is whatever the file says).
|
|
351
|
+
*
|
|
352
|
+
* JSDoc's `{…}` payload is free text and carries shapes that are not
|
|
353
|
+
* references at all — record types (`{{a: number}}`), function types
|
|
354
|
+
* (`{function(string): void}`), the any-type `{*}`, parenthesized unions
|
|
355
|
+
* (`{(Repo|Other)}`). None of those name a class, so a field annotated with
|
|
356
|
+
* one is DECLINED rather than bound to whatever substring survives
|
|
357
|
+
* normalization. (`parseJsDocType`'s `[^}]+` also truncates a record type at
|
|
358
|
+
* its first `}`, which this rejects too.)
|
|
359
|
+
*/
|
|
360
|
+
/** Longest `@type {…}` payload considered. A type REFERENCE that names a class
|
|
361
|
+
* is far shorter; past this the string is a structural type or generated
|
|
362
|
+
* noise, which this pass declines anyway, and the cap is what keeps
|
|
363
|
+
* {@link JSDOC_TYPE_REFERENCE_RE}'s nested quantifiers off an unbounded
|
|
364
|
+
* input. */
|
|
365
|
+
const JSDOC_TYPE_MAX_LENGTH = 200;
|
|
366
|
+
const JSDOC_TYPE_REFERENCE_RE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*(?:\s*<[\w$.,<>\s]*>)?(?:\s*\|\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*(?:\s*<[\w$.,<>\s]*>)?)*$/;
|
|
367
|
+
/**
|
|
368
|
+
* The spelling a JSDoc `@type` should bind a class FIELD to, or `null` to
|
|
369
|
+
* decline.
|
|
370
|
+
*
|
|
371
|
+
* The as-written spelling is returned, NOT a reduced one: `interpretJsTypeBinding`
|
|
372
|
+
* carries `Repo<User>` through to `TypeRef.rawName` untouched (user generics are
|
|
373
|
+
* not on `stripGeneric`'s wrapper list), and `resolveClassBindingForName` erases
|
|
374
|
+
* the arguments to `Repo` at lookup time. That is the same erasure every other
|
|
375
|
+
* language in #2833 relies on, so generics need no code here — verified, not
|
|
376
|
+
* assumed, by the capture probe in that issue.
|
|
377
|
+
*
|
|
378
|
+
* Two declines:
|
|
379
|
+
* - `reducesToContainedType` — the container spellings whose interpretation
|
|
380
|
+
* would yield the ELEMENT (`Repo[]`, `Array<Repo>`, `Promise<Repo>`). See
|
|
381
|
+
* that predicate for why a field must not take its element's type.
|
|
382
|
+
* - anything that is not a type reference (see JSDOC_TYPE_REFERENCE_RE).
|
|
383
|
+
*
|
|
384
|
+
* The leading `?` / `!` nullability sigils are JSDoc-specific decoration with no
|
|
385
|
+
* bearing on which class is named, so they are peeled first — `{?Repo}` binds
|
|
386
|
+
* `Repo` exactly as `{Repo|null}` does.
|
|
387
|
+
*/
|
|
388
|
+
function jsDocFieldTypeSpelling(rawType) {
|
|
389
|
+
const spelling = rawType
|
|
390
|
+
.trim()
|
|
391
|
+
.replace(/^[?!]+/, '')
|
|
392
|
+
.trim();
|
|
393
|
+
if (spelling === '' || spelling.length > JSDOC_TYPE_MAX_LENGTH)
|
|
394
|
+
return null;
|
|
395
|
+
if ((0, interpret_js_1.reducesToContainedType)(spelling))
|
|
396
|
+
return null;
|
|
397
|
+
if (!JSDOC_TYPE_REFERENCE_RE.test(spelling))
|
|
398
|
+
return null;
|
|
399
|
+
return spelling;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* The identifier a JSDoc `@type` may bind a `field_definition` to, or `null` if
|
|
403
|
+
* this field takes no docblock binding at all (#2833).
|
|
404
|
+
*
|
|
405
|
+
* Two refusals, and both are cheaper to answer than the docblock search they
|
|
406
|
+
* gate, which is why they run before it:
|
|
407
|
+
*
|
|
408
|
+
* - `static` fields are dropped, exactly as the query-driven annotation path
|
|
409
|
+
* drops them in `emitJsScopeCaptures` — a static member belongs to the class
|
|
410
|
+
* object and would silently RETYPE an instance field of the same name. The
|
|
411
|
+
* full cost of that trade, measured, is in `isStaticClassFieldBinding`
|
|
412
|
+
* (#2807). Re-checked here because the synthesis pass runs outside the
|
|
413
|
+
* match loop that applies it.
|
|
414
|
+
* - a name that is not a plain identifier (a computed key, a string key)
|
|
415
|
+
* names nothing `this.x` could look up.
|
|
416
|
+
*
|
|
417
|
+
* The JavaScript grammar names a field's name `property:`, not `name:`. `#priv`
|
|
418
|
+
* arrives as `private_property_identifier`; TypeScript binds those under their
|
|
419
|
+
* `#`-prefixed spelling, which is how `this.#priv` looks it up.
|
|
420
|
+
*/
|
|
421
|
+
function jsDocBindableFieldName(node) {
|
|
422
|
+
if ((0, captures_js_1.isStaticClassFieldBinding)(node, JS_CLASS_FIELD_DEFINITION_TYPES))
|
|
423
|
+
return null;
|
|
424
|
+
const nameNode = node.childForFieldName('property');
|
|
425
|
+
if (nameNode === null ||
|
|
426
|
+
(nameNode.type !== 'property_identifier' && nameNode.type !== 'private_property_identifier')) {
|
|
427
|
+
return null;
|
|
428
|
+
}
|
|
429
|
+
return nameNode;
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Emit the class-FIELD type binding a JSDoc `@type {T}` block declares (#2833).
|
|
433
|
+
*
|
|
434
|
+
* JavaScript has no type annotations, so a docblock is the only way a field
|
|
435
|
+
* can declare one — and measured before this branch, `/** @type {Repo<User>} */
|
|
436
|
+
* repo;` bound NOTHING, taking down the non-generic control (`{Plain}`) with
|
|
437
|
+
* it. TypeScript's equivalent `repo: Repo<User>` has always bound, via the
|
|
438
|
+
* `@type-binding.annotation` rule on `public_field_definition`; this reaches the
|
|
439
|
+
* same DESTINATION from the docblock — an annotation-strength binding on the
|
|
440
|
+
* enclosing Class scope, which is the only place `typeOfMemberOnClass` reads a
|
|
441
|
+
* field's type — so the compound-receiver resolver finds it the way it always
|
|
442
|
+
* has. No resolution-side change. See the tag note on the emit below for why
|
|
443
|
+
* the marker is `class-field` rather than `annotation`.
|
|
444
|
+
*/
|
|
445
|
+
function emitJsDocFieldBinding(docComment, nameNode, out) {
|
|
446
|
+
const rawType = parseJsDocType(docComment);
|
|
447
|
+
const spelling = rawType === null ? null : jsDocFieldTypeSpelling(rawType);
|
|
448
|
+
if (spelling === null)
|
|
449
|
+
return;
|
|
450
|
+
out.push({
|
|
451
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', nameNode, nameNode.text),
|
|
452
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', nameNode, spelling),
|
|
453
|
+
// `class-field`, not `annotation`: this is the JS provider's own
|
|
454
|
+
// marker for a binding that must be HOISTED to the enclosing Class
|
|
455
|
+
// scope, which is where `typeOfMemberOnClass` reads a field's type.
|
|
456
|
+
// `jsBindingScopeFor` does that walk; `interpretJsTypeBinding` then
|
|
457
|
+
// remaps the tag to `annotation` so the source strength is the same
|
|
458
|
+
// as TypeScript's `repo: Repo<User>`. Measured: with `annotation`
|
|
459
|
+
// the binding lands on the innermost scope and the field never
|
|
460
|
+
// types — the same shape `synthesizeConstructorFieldBindings` needs
|
|
461
|
+
// for `this.p = new Outer()`.
|
|
462
|
+
'@type-binding.class-field': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.class-field', nameNode, '1'),
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Walk the AST and synthesize `@type-binding.*` captures from JSDoc
|
|
467
|
+
* comments immediately preceding function declarations / expressions and class
|
|
468
|
+
* field definitions.
|
|
469
|
+
*
|
|
470
|
+
* Only `/** … */` block comments are scanned. Line comments (`//`) are
|
|
471
|
+
* intentionally excluded — JSDoc lives in block comments.
|
|
472
|
+
*
|
|
473
|
+
* Emits:
|
|
474
|
+
* - `@type-binding.parameter` for each `@param {T} n` tag.
|
|
475
|
+
* - `@type-binding.return` for `@returns {T}` / `@return {T}`.
|
|
476
|
+
* - `@type-binding.annotation` for `@type {T}` on `let`/`const`/`var`
|
|
477
|
+
* declarations — covers the common `/** @type {User} */ const u = …`
|
|
478
|
+
* pattern (ECMA-262 §14.3.1/§14.3.2 variable declarations).
|
|
479
|
+
* - `@type-binding.class-field` for `@type {T}` on a `field_definition`
|
|
480
|
+
* (#2833) — see {@link emitJsDocFieldBinding}.
|
|
481
|
+
*
|
|
482
|
+
* The binding is anchored on the function node so `tsBindingScopeFor`
|
|
483
|
+
* can hoist method return-type bindings to Module scope (matching the
|
|
484
|
+
* TypeScript path where `hoistTypeBindingsToModule: true`).
|
|
485
|
+
*
|
|
486
|
+
* `field_definition` is a node kind of THIS walk rather than a pass of its own,
|
|
487
|
+
* even though a field's anchor and name are the field itself while every other
|
|
488
|
+
* branch keys off a function-like anchor. A separate pass would be a ninth
|
|
489
|
+
* full-tree traversal of `emitJsScopeCaptures`, and measured on
|
|
490
|
+
* `dist/core/ingestion/workers/parse-worker.js` (2.4k lines, 17.3k nodes) one
|
|
491
|
+
* `namedChildren` walk costs 14.3 ms against 7.5 ms to PARSE the whole file —
|
|
492
|
+
* `node.namedChildren` materializes a fresh array of node wrappers across the
|
|
493
|
+
* N-API boundary at every node. The two node kinds share this walk's preceding-
|
|
494
|
+
* comment search and nothing else, so the branch below returns as soon as it
|
|
495
|
+
* has emitted.
|
|
496
|
+
*/
|
|
497
|
+
function synthesizeJsDocBindings(root, out) {
|
|
498
|
+
const stack = [root];
|
|
499
|
+
for (;;) {
|
|
500
|
+
const node = stack.pop();
|
|
501
|
+
if (node === undefined)
|
|
502
|
+
break;
|
|
503
|
+
for (const child of node.namedChildren) {
|
|
504
|
+
if (child !== null)
|
|
505
|
+
stack.push(child);
|
|
506
|
+
}
|
|
507
|
+
const isFnDecl = node.type === 'function_declaration' || node.type === 'generator_function_declaration';
|
|
508
|
+
const isMethodDef = node.type === 'method_definition';
|
|
509
|
+
// Also check lexical_declaration containing an arrow/fn-expression
|
|
510
|
+
const isLexDecl = node.type === 'lexical_declaration' || node.type === 'variable_declaration';
|
|
511
|
+
const isFieldDef = node.type === 'field_definition';
|
|
512
|
+
if (!isFnDecl && !isMethodDef && !isLexDecl && !isFieldDef)
|
|
513
|
+
continue;
|
|
514
|
+
// Non-null exactly for a field that can carry a binding, so it doubles as
|
|
515
|
+
// the branch selector inside the comment search below. Answered before that
|
|
516
|
+
// search because an unbindable field has no reason to look for a docblock.
|
|
517
|
+
const fieldNameNode = isFieldDef ? jsDocBindableFieldName(node) : null;
|
|
518
|
+
if (isFieldDef && fieldNameNode === null)
|
|
519
|
+
continue;
|
|
520
|
+
// For `export function foo() { ... }`, the JSDoc comment precedes the
|
|
521
|
+
// wrapping export_statement, not the inner function_declaration.
|
|
522
|
+
// Walk up to the export_statement so the preceding-sibling search finds it.
|
|
523
|
+
const lookupNode = (isFnDecl || isLexDecl) && node.parent?.type === 'export_statement' ? node.parent : node;
|
|
524
|
+
// Find the preceding sibling comment.
|
|
525
|
+
let sibling = lookupNode.previousNamedSibling;
|
|
526
|
+
while (sibling !== null && sibling.type === 'comment') {
|
|
527
|
+
const text = sibling.text;
|
|
528
|
+
if (text.startsWith('/**')) {
|
|
529
|
+
// A field's docblock declares its own type and nothing else — `@param` /
|
|
530
|
+
// `@returns` on a field name no callable — so this branch does not fall
|
|
531
|
+
// through to the function-like tags below.
|
|
532
|
+
if (fieldNameNode !== null) {
|
|
533
|
+
emitJsDocFieldBinding(text, fieldNameNode, out);
|
|
534
|
+
break;
|
|
535
|
+
}
|
|
536
|
+
// Found a JSDoc block.
|
|
537
|
+
const params = parseJsDocParams(text);
|
|
538
|
+
const retType = parseJsDocReturn(text);
|
|
539
|
+
const varType = isLexDecl ? parseJsDocType(text) : null;
|
|
540
|
+
// Determine the anchor node (the function-like node, for hoisting).
|
|
541
|
+
const anchor = node;
|
|
542
|
+
for (const p of params) {
|
|
543
|
+
out.push({
|
|
544
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', anchor, p.name),
|
|
545
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', anchor, p.type),
|
|
546
|
+
'@type-binding.parameter': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.parameter', anchor, '1'),
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
if (retType !== null) {
|
|
550
|
+
// For named functions, use the function name as the binding name so
|
|
551
|
+
// `hoistTypeBindingsToModule` knows which function's return type this is.
|
|
552
|
+
let fnName = null;
|
|
553
|
+
if (isFnDecl) {
|
|
554
|
+
fnName = node.childForFieldName('name')?.text ?? null;
|
|
555
|
+
}
|
|
556
|
+
else if (isMethodDef) {
|
|
557
|
+
// method_definition uses `name:` field for the method name
|
|
558
|
+
const nameNode = node.childForFieldName('name');
|
|
559
|
+
if (nameNode?.type === 'property_identifier')
|
|
560
|
+
fnName = nameNode.text;
|
|
561
|
+
}
|
|
562
|
+
else if (isLexDecl) {
|
|
563
|
+
const declarator = node.namedChild(0);
|
|
564
|
+
const nameNode = declarator?.childForFieldName('name');
|
|
565
|
+
if (nameNode?.type === 'identifier')
|
|
566
|
+
fnName = nameNode.text;
|
|
567
|
+
}
|
|
568
|
+
if (fnName !== null) {
|
|
569
|
+
out.push({
|
|
570
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', anchor, fnName),
|
|
571
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', anchor, retType),
|
|
572
|
+
'@type-binding.return': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.return', anchor, '1'),
|
|
573
|
+
});
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
// @type {T} on let/const/var: `/** @type {User} */ const u = getUser()`.
|
|
577
|
+
// Emits annotation-strength binding (source = 'annotation') so it
|
|
578
|
+
// overrides any weaker constructor/alias inference on the same name.
|
|
579
|
+
if (varType !== null) {
|
|
580
|
+
for (const declarator of node.namedChildren) {
|
|
581
|
+
if (declarator === null || declarator.type !== 'variable_declarator')
|
|
582
|
+
continue;
|
|
583
|
+
const nameNode = declarator.childForFieldName('name');
|
|
584
|
+
if (nameNode === null || nameNode.type !== 'identifier')
|
|
585
|
+
continue;
|
|
586
|
+
out.push({
|
|
587
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', nameNode, nameNode.text),
|
|
588
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', nameNode, varType),
|
|
589
|
+
'@type-binding.annotation': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.annotation', nameNode, '1'),
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
break;
|
|
594
|
+
}
|
|
595
|
+
sibling = sibling.previousNamedSibling;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
// ─── Destructuring / for-of / instanceof (shared with TS captures) ───────
|
|
600
|
+
function synthesizeDestructuringBindings(root, out) {
|
|
601
|
+
const stack = [root];
|
|
602
|
+
for (;;) {
|
|
603
|
+
const node = stack.pop();
|
|
604
|
+
if (node === undefined)
|
|
605
|
+
break;
|
|
606
|
+
for (const child of node.namedChildren) {
|
|
607
|
+
if (child !== null)
|
|
608
|
+
stack.push(child);
|
|
609
|
+
}
|
|
610
|
+
if (node.type !== 'variable_declarator')
|
|
611
|
+
continue;
|
|
612
|
+
const nameNode = node.childForFieldName('name');
|
|
613
|
+
const valueNode = node.childForFieldName('value');
|
|
614
|
+
if (nameNode === null || valueNode === null)
|
|
615
|
+
continue;
|
|
616
|
+
if (nameNode.type !== 'object_pattern')
|
|
617
|
+
continue;
|
|
618
|
+
if (valueNode.type !== 'identifier')
|
|
619
|
+
continue;
|
|
620
|
+
const rhsName = valueNode.text;
|
|
621
|
+
for (const fieldNode of nameNode.namedChildren) {
|
|
622
|
+
if (fieldNode === null)
|
|
623
|
+
continue;
|
|
624
|
+
if (fieldNode.type === 'shorthand_property_identifier_pattern') {
|
|
625
|
+
const localName = fieldNode.text;
|
|
626
|
+
out.push({
|
|
627
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', fieldNode, localName),
|
|
628
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', fieldNode, `${rhsName}.${localName}`),
|
|
629
|
+
'@type-binding.destructured': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.destructured', fieldNode, fieldNode.text),
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
else if (fieldNode.type === 'pair_pattern') {
|
|
633
|
+
const key = fieldNode.childForFieldName('key');
|
|
634
|
+
const value = fieldNode.childForFieldName('value');
|
|
635
|
+
if (key === null || value === null || value.type !== 'identifier')
|
|
636
|
+
continue;
|
|
637
|
+
const fieldName = key.text;
|
|
638
|
+
const localName = value.text;
|
|
639
|
+
out.push({
|
|
640
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', value, localName),
|
|
641
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', fieldNode, `${rhsName}.${fieldName}`),
|
|
642
|
+
'@type-binding.destructured': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.destructured', fieldNode, fieldNode.text),
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
function synthesizeForOfMapTupleBindings(root, out) {
|
|
649
|
+
const stack = [root];
|
|
650
|
+
for (;;) {
|
|
651
|
+
const node = stack.pop();
|
|
652
|
+
if (node === undefined)
|
|
653
|
+
break;
|
|
654
|
+
for (const child of node.namedChildren) {
|
|
655
|
+
if (child !== null)
|
|
656
|
+
stack.push(child);
|
|
657
|
+
}
|
|
658
|
+
if (node.type !== 'for_in_statement')
|
|
659
|
+
continue;
|
|
660
|
+
const left = node.childForFieldName('left');
|
|
661
|
+
const right = node.childForFieldName('right');
|
|
662
|
+
if (left === null || right === null)
|
|
663
|
+
continue;
|
|
664
|
+
if (left.type !== 'array_pattern' || right.type !== 'identifier')
|
|
665
|
+
continue;
|
|
666
|
+
const rhs = right.text;
|
|
667
|
+
let slot = 0;
|
|
668
|
+
for (const child of left.namedChildren) {
|
|
669
|
+
if (child === null || child.type !== 'identifier')
|
|
670
|
+
continue;
|
|
671
|
+
const localName = child.text;
|
|
672
|
+
out.push({
|
|
673
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', child, localName),
|
|
674
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', child, `__MAP_TUPLE_${slot}__:${rhs}`),
|
|
675
|
+
'@type-binding.map-tuple-entry': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.map-tuple-entry', child, String(slot)),
|
|
676
|
+
});
|
|
677
|
+
slot++;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
function synthesizeInstanceofNarrowings(root, out) {
|
|
682
|
+
const stack = [root];
|
|
683
|
+
for (;;) {
|
|
684
|
+
const node = stack.pop();
|
|
685
|
+
if (node === undefined)
|
|
686
|
+
break;
|
|
687
|
+
for (const child of node.namedChildren) {
|
|
688
|
+
if (child !== null)
|
|
689
|
+
stack.push(child);
|
|
690
|
+
}
|
|
691
|
+
if (node.type !== 'if_statement')
|
|
692
|
+
continue;
|
|
693
|
+
const cond = node.childForFieldName('condition');
|
|
694
|
+
if (cond === null)
|
|
695
|
+
continue;
|
|
696
|
+
const inner = cond.type === 'parenthesized_expression' ? cond.namedChildren[0] : cond;
|
|
697
|
+
if (inner === null || inner.type !== 'binary_expression')
|
|
698
|
+
continue;
|
|
699
|
+
const op = inner.childForFieldName('operator');
|
|
700
|
+
const left = inner.childForFieldName('left');
|
|
701
|
+
const right = inner.childForFieldName('right');
|
|
702
|
+
if (op === null || left === null || right === null)
|
|
703
|
+
continue;
|
|
704
|
+
if (op.type !== 'instanceof')
|
|
705
|
+
continue;
|
|
706
|
+
if (left.type !== 'identifier')
|
|
707
|
+
continue;
|
|
708
|
+
if (right.type !== 'identifier')
|
|
709
|
+
continue;
|
|
710
|
+
const varName = left.text;
|
|
711
|
+
const typeName = right.text;
|
|
712
|
+
const cons = node.childForFieldName('consequence');
|
|
713
|
+
if (cons === null)
|
|
714
|
+
continue;
|
|
715
|
+
out.push({
|
|
716
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', cons, varName),
|
|
717
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', right, typeName),
|
|
718
|
+
'@type-binding.instanceof-narrow': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.instanceof-narrow', cons, '1'),
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
// ─── Constructor field type bindings ─────────────────────────────────────
|
|
723
|
+
/**
|
|
724
|
+
* Synthesize class-scope type bindings from `this.X = new Y()` assignments
|
|
725
|
+
* inside constructor method bodies. Covers the traditional ES5+ OOP pattern:
|
|
726
|
+
*
|
|
727
|
+
* class User {
|
|
728
|
+
* constructor() {
|
|
729
|
+
* /** @type {Address} *\/
|
|
730
|
+
* this.address = new Address();
|
|
731
|
+
* }
|
|
732
|
+
* }
|
|
733
|
+
*
|
|
734
|
+
* The emitted `@type-binding.class-field` is hoisted to the Class scope by
|
|
735
|
+
* `tsBindingScopeFor` so that compound-receiver resolution can look up
|
|
736
|
+
* `User.address → Address` when resolving `user.address.save()`.
|
|
737
|
+
*
|
|
738
|
+
* Type source priority:
|
|
739
|
+
* 1. JSDoc `@type {T}` comment immediately preceding the statement
|
|
740
|
+
* 2. `new Y()` constructor inference
|
|
741
|
+
*/
|
|
742
|
+
function synthesizeConstructorFieldBindings(root, out) {
|
|
743
|
+
const stack = [root];
|
|
744
|
+
for (;;) {
|
|
745
|
+
const node = stack.pop();
|
|
746
|
+
if (node === undefined)
|
|
747
|
+
break;
|
|
748
|
+
for (const child of node.namedChildren) {
|
|
749
|
+
if (child !== null)
|
|
750
|
+
stack.push(child);
|
|
751
|
+
}
|
|
752
|
+
// Only process constructor method definitions
|
|
753
|
+
if (node.type !== 'method_definition')
|
|
754
|
+
continue;
|
|
755
|
+
// …and only a CLASS's. An object literal's members are `method_definition`
|
|
756
|
+
// too, so `{ constructor() { this.p = new Alien(); } }` reached here and
|
|
757
|
+
// typed a field on whatever class the hoist walked up to — an object
|
|
758
|
+
// literal's `this` is the literal, never that class's instance (#2807).
|
|
759
|
+
// TypeScript's sibling pattern carries the same constraint in its query
|
|
760
|
+
// nesting; the two must not read one source differently.
|
|
761
|
+
if (node.parent?.type !== 'class_body')
|
|
762
|
+
continue;
|
|
763
|
+
const nameNode = node.childForFieldName('name');
|
|
764
|
+
if (nameNode?.text !== 'constructor')
|
|
765
|
+
continue;
|
|
766
|
+
// `static constructor() {}` is legal JavaScript — the reserved-name rule
|
|
767
|
+
// applies to instance methods only — and its `this` is the CLASS object, so
|
|
768
|
+
// `this.p = new Alien()` there writes a static property and must not type
|
|
769
|
+
// the instance field `p`. TypeScript's sibling guard (`isStaticMethodThis`)
|
|
770
|
+
// already drops this shape; without the same test here `.js` and `.ts` read
|
|
771
|
+
// one source differently. `hasKeyword` skips the `name` field, so a method
|
|
772
|
+
// named `static` cannot false-positive.
|
|
773
|
+
if ((0, helpers_js_1.hasKeyword)(node, 'static'))
|
|
774
|
+
continue;
|
|
775
|
+
const body = node.childForFieldName('body');
|
|
776
|
+
if (body === null)
|
|
777
|
+
continue;
|
|
778
|
+
for (const stmt of body.namedChildren) {
|
|
779
|
+
if (stmt === null || stmt.type !== 'expression_statement')
|
|
780
|
+
continue;
|
|
781
|
+
const expr = stmt.namedChild(0);
|
|
782
|
+
if (expr === null || expr.type !== 'assignment_expression')
|
|
783
|
+
continue;
|
|
784
|
+
const left = expr.childForFieldName('left');
|
|
785
|
+
const right = expr.childForFieldName('right');
|
|
786
|
+
if (left === null || right === null)
|
|
787
|
+
continue;
|
|
788
|
+
if (left.type !== 'member_expression')
|
|
789
|
+
continue;
|
|
790
|
+
const obj = left.childForFieldName('object');
|
|
791
|
+
const prop = left.childForFieldName('property');
|
|
792
|
+
if (obj === null || prop === null)
|
|
793
|
+
continue;
|
|
794
|
+
if (obj.text !== 'this' || prop.type !== 'property_identifier')
|
|
795
|
+
continue;
|
|
796
|
+
const fieldName = prop.text;
|
|
797
|
+
// Prefer JSDoc @type annotation on the preceding sibling comment.
|
|
798
|
+
let typeName = null;
|
|
799
|
+
const prevSib = stmt.previousNamedSibling;
|
|
800
|
+
if (prevSib !== null && prevSib.type === 'comment') {
|
|
801
|
+
const m = /@type\s*\{([^}]+)\}/.exec(prevSib.text);
|
|
802
|
+
if (m?.[1])
|
|
803
|
+
typeName = m[1].trim();
|
|
804
|
+
}
|
|
805
|
+
// Fall back to constructor inference from `new Y()`.
|
|
806
|
+
if (typeName === null && right.type === 'new_expression') {
|
|
807
|
+
const ctor = right.childForFieldName('constructor');
|
|
808
|
+
if (ctor !== null && ctor.type === 'identifier')
|
|
809
|
+
typeName = ctor.text;
|
|
810
|
+
}
|
|
811
|
+
if (typeName === null)
|
|
812
|
+
continue;
|
|
813
|
+
out.push({
|
|
814
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', prop, fieldName),
|
|
815
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', prop, typeName),
|
|
816
|
+
// Anchor: positioned inside the constructor body so tsBindingScopeFor
|
|
817
|
+
// can walk up from the Function (constructor) scope to the Class scope.
|
|
818
|
+
'@type-binding.class-field': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.class-field', stmt, '1'),
|
|
819
|
+
});
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
// ─── Inheritance references (EXTENDS) ────────────────────────────────────
|
|
824
|
+
/**
|
|
825
|
+
* Synthesize `@reference.inherits` captures from JavaScript class heritage so
|
|
826
|
+
* the registry-primary scope-resolution path emits EXTENDS edges (mirrors C#
|
|
827
|
+
* `synthesizeCsharpInheritanceReferences` / C++ `emitCppInheritanceCaptures`).
|
|
828
|
+
* Without this, JS inheritance edges came only from the legacy heritage-capture
|
|
829
|
+
* leg (removed in #942), which the worker pipeline drops for registry-primary
|
|
830
|
+
* languages, yielding 0 inheritance edges in worker mode (issue #1951).
|
|
831
|
+
*
|
|
832
|
+
* Scope is intentionally limited to a `class_declaration`'s `class_heritage`
|
|
833
|
+
* base, matching the legacy JavaScript heritage query's class scope and its
|
|
834
|
+
* supertype shape descriptor (`javascriptHeritageShapes`:
|
|
835
|
+
* `['identifier', 'member_expression']`). JavaScript classes have a single
|
|
836
|
+
* `extends` base and no `implements`, so every emission is an EXTENDS (decided
|
|
837
|
+
* downstream from the resolved target's symbol kind in
|
|
838
|
+
* `preEmitInheritanceEdges`).
|
|
839
|
+
*
|
|
840
|
+
* Bases handled (at parity with the legacy heritage leg, #1951):
|
|
841
|
+
* - `(identifier)` base (`extends Base`) — bare simple name.
|
|
842
|
+
* - `(member_expression)` base (`extends ns.Base`, `extends a.b.Base`) —
|
|
843
|
+
* qualified; reduced to its trailing `property_identifier` (`Base`) so the
|
|
844
|
+
* V1 `findClassBindingInScope` simple-name contract holds. This mirrors the
|
|
845
|
+
* TypeScript `terminalTsTypeNameNode` member_expression arm.
|
|
846
|
+
*
|
|
847
|
+
* Deliberately NOT emitted (preserving parity with the legacy query, incl. the
|
|
848
|
+
* #1943 HOC behavior):
|
|
849
|
+
* - `class` EXPRESSION nodes (legacy captures `class_declaration` only).
|
|
850
|
+
* - `call_expression` / HOC bases (`extends withFoo(Bar)`) — not a legacy
|
|
851
|
+
* heritage shape; left to the normal call-resolution path.
|
|
852
|
+
*
|
|
853
|
+
* The `@reference.name` bare-name text emitted for each base equals
|
|
854
|
+
* `normalizeSupertypeName(base)` (the legacy leg's reduction): `Base` → `Base`,
|
|
855
|
+
* `ns.Base` → `Base`, `a.b.Base` → `Base` — keeping the two legs at parity.
|
|
856
|
+
*/
|
|
857
|
+
function synthesizeJsInheritanceReferences(root, out) {
|
|
858
|
+
const stack = [root];
|
|
859
|
+
for (;;) {
|
|
860
|
+
const node = stack.pop();
|
|
861
|
+
if (node === undefined)
|
|
862
|
+
break;
|
|
863
|
+
for (const child of node.namedChildren) {
|
|
864
|
+
if (child !== null)
|
|
865
|
+
stack.push(child);
|
|
866
|
+
}
|
|
867
|
+
if (node.type !== 'class_declaration')
|
|
868
|
+
continue;
|
|
869
|
+
// Find the `class_heritage` child (holds the single `extends` base).
|
|
870
|
+
let heritage = null;
|
|
871
|
+
for (const child of node.namedChildren) {
|
|
872
|
+
if (child !== null && child.type === 'class_heritage') {
|
|
873
|
+
heritage = child;
|
|
874
|
+
break;
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
if (heritage === null)
|
|
878
|
+
continue;
|
|
879
|
+
// Emit for `(identifier)` and `(member_expression)` bases — matching the
|
|
880
|
+
// legacy heritage shape descriptor (`call_expression` HOC bases excluded).
|
|
881
|
+
for (const base of heritage.namedChildren) {
|
|
882
|
+
if (base === null)
|
|
883
|
+
continue;
|
|
884
|
+
const nameNode = terminalJsHeritageNameNode(base);
|
|
885
|
+
if (nameNode === null)
|
|
886
|
+
continue;
|
|
887
|
+
out.push({
|
|
888
|
+
'@reference.inherits': (0, ast_helpers_js_1.nodeToCapture)('@reference.inherits', base),
|
|
889
|
+
'@reference.name': (0, ast_helpers_js_1.nodeToCapture)('@reference.name', nameNode),
|
|
890
|
+
});
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
/** Resolve a JavaScript heritage base node to its bare simple-identifier node.
|
|
895
|
+
* `Base` (identifier) → `Base`, `ns.Base` / `a.b.Base` (member_expression) →
|
|
896
|
+
* the trailing `property_identifier` `Base`. Mirrors the TypeScript
|
|
897
|
+
* `terminalTsTypeNameNode` member_expression arm. Returns null for any other
|
|
898
|
+
* shape (e.g. `call_expression` HOC bases), which is then skipped — keeping
|
|
899
|
+
* parity with the legacy `javascriptHeritageShapes` descriptor and
|
|
900
|
+
* `normalizeSupertypeName`'s reduction of each shape. */
|
|
901
|
+
function terminalJsHeritageNameNode(node) {
|
|
902
|
+
switch (node.type) {
|
|
903
|
+
case 'identifier':
|
|
904
|
+
// `extends ns.Base` parses as a member_expression whose tail is a
|
|
905
|
+
// `property_identifier` (not an identifier) — treat it as a leaf name.
|
|
906
|
+
case 'property_identifier':
|
|
907
|
+
return node;
|
|
908
|
+
case 'member_expression': {
|
|
909
|
+
// Qualified `ns.Base` / `a.b.Base` → tail identifier `Base`.
|
|
910
|
+
const tail = node.lastNamedChild;
|
|
911
|
+
return tail === null ? null : terminalJsHeritageNameNode(tail);
|
|
912
|
+
}
|
|
913
|
+
default:
|
|
914
|
+
return null;
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
// ─── Main emitter ──────────────────────────────────────────────────────────
|
|
918
|
+
function emitJsScopeCaptures(sourceText, filePath, cachedTree) {
|
|
919
|
+
let tree = cachedTree;
|
|
920
|
+
if (tree !== undefined && !(0, query_js_1.jsCachedTreeMatchesGrammar)(tree)) {
|
|
921
|
+
tree = undefined;
|
|
922
|
+
}
|
|
923
|
+
if (tree === undefined) {
|
|
924
|
+
tree = (0, safe_parse_js_1.parseSourceSafe)((0, query_js_1.getJsParser)(filePath), sourceText, undefined, {
|
|
925
|
+
bufferSize: (0, constants_js_1.getTreeSitterBufferSize)(sourceText),
|
|
926
|
+
});
|
|
927
|
+
}
|
|
928
|
+
const rawMatches = (0, query_js_1.getJsScopeQuery)(filePath).matches(tree.rootNode);
|
|
929
|
+
const out = [];
|
|
930
|
+
for (const m of rawMatches) {
|
|
931
|
+
const grouped = {};
|
|
932
|
+
// Parallel tag -> captured SyntaxNode map. The query hands us each matched
|
|
933
|
+
// node as c.node, so anchors resolve by walking up from the captured node
|
|
934
|
+
// (findSelfOrAncestorOfType[s]) instead of re-deriving them with
|
|
935
|
+
// findNodeAtRange(tree.rootNode, ...) per match — the O(matches x N)
|
|
936
|
+
// root-walk fixed for go #1915 / python #1918 / csharp, mirrored here
|
|
937
|
+
// (mirrors typescript/captures.ts groupedNodes).
|
|
938
|
+
const groupedNodes = {};
|
|
939
|
+
for (const c of m.captures) {
|
|
940
|
+
const tag = '@' + c.name;
|
|
941
|
+
grouped[tag] = (0, ast_helpers_js_1.nodeToCapture)(tag, c.node);
|
|
942
|
+
groupedNodes[tag] = c.node;
|
|
943
|
+
}
|
|
944
|
+
if (Object.keys(grouped).length === 0)
|
|
945
|
+
continue;
|
|
946
|
+
// Decompose ESM import_statement / re-export export_statement.
|
|
947
|
+
if (grouped['@import.statement'] !== undefined) {
|
|
948
|
+
const stmtCapture = grouped['@import.statement'];
|
|
949
|
+
const stmtNode = findSelfOrAncestorOfTypes(groupedNodes['@import.statement'], [
|
|
950
|
+
'import_statement',
|
|
951
|
+
'export_statement',
|
|
952
|
+
]) ??
|
|
953
|
+
(0, ast_helpers_js_1.findNodeAtRange)(tree.rootNode, stmtCapture.range, 'import_statement') ??
|
|
954
|
+
(0, ast_helpers_js_1.findNodeAtRange)(tree.rootNode, stmtCapture.range, 'export_statement');
|
|
955
|
+
if (stmtNode !== null) {
|
|
956
|
+
const decomposed = (0, import_decomposer_js_1.splitImportStatement)(stmtNode);
|
|
957
|
+
for (const d of decomposed)
|
|
958
|
+
out.push(d);
|
|
959
|
+
}
|
|
960
|
+
continue;
|
|
961
|
+
}
|
|
962
|
+
// Decompose dynamic import() calls.
|
|
963
|
+
if (grouped['@import.dynamic'] !== undefined) {
|
|
964
|
+
const dynCapture = grouped['@import.dynamic'];
|
|
965
|
+
const callNode = findSelfOrAncestorOfType(groupedNodes['@import.dynamic'], 'call_expression') ??
|
|
966
|
+
(0, ast_helpers_js_1.findNodeAtRange)(tree.rootNode, dynCapture.range, 'call_expression');
|
|
967
|
+
if (callNode !== null) {
|
|
968
|
+
const decomposed = (0, import_decomposer_js_1.splitImportStatement)(callNode);
|
|
969
|
+
for (const d of decomposed)
|
|
970
|
+
out.push(d);
|
|
971
|
+
}
|
|
972
|
+
continue;
|
|
973
|
+
}
|
|
974
|
+
// Filter @reference.read.member false-positives.
|
|
975
|
+
// See the matching filter in typescript/captures.ts: a `statement_block`
|
|
976
|
+
// that IS a function body duplicates the enclosing Function scope, and
|
|
977
|
+
// keeping it puts a redundant level inside every function for every
|
|
978
|
+
// scope-chain walk to step through (~6% of analyze wall time, measured).
|
|
979
|
+
if (grouped['@scope.block'] !== undefined) {
|
|
980
|
+
const blockNode = groupedNodes['@scope.block'];
|
|
981
|
+
const parentType = blockNode?.parent?.type;
|
|
982
|
+
if (parentType !== undefined && JS_FUNCTION_BODY_OWNER_TYPES.has(parentType))
|
|
983
|
+
continue;
|
|
984
|
+
if (blockNode === undefined || !blockDeclaresBinding(blockNode))
|
|
985
|
+
continue;
|
|
986
|
+
}
|
|
987
|
+
if (grouped['@reference.read.member'] !== undefined) {
|
|
988
|
+
const anchor = grouped['@reference.read.member'];
|
|
989
|
+
const memberNode = findSelfOrAncestorOfType(groupedNodes['@reference.read.member'], 'member_expression') ??
|
|
990
|
+
(0, ast_helpers_js_1.findNodeAtRange)(tree.rootNode, anchor.range, 'member_expression');
|
|
991
|
+
if (memberNode === null || !shouldEmitReadMember(memberNode)) {
|
|
992
|
+
continue;
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
// A `static` class field is a member of the class object, not of instances,
|
|
996
|
+
// so `static p = new Wrong()` must not retype the `p = new Right()` beside
|
|
997
|
+
// it — the two land on one Class scope and the later match wins the `>=`
|
|
998
|
+
// tie-break. Shared with TypeScript (`isStaticClassFieldBinding`), which is
|
|
999
|
+
// where the reasoning and the grammar evidence live; the two languages read
|
|
1000
|
+
// the same source and must not read it differently. JavaScript has no type
|
|
1001
|
+
// annotations, so `field_definition` initializers are the only class-field
|
|
1002
|
+
// type binding its query emits and `@type-binding.constructor` is the only
|
|
1003
|
+
// anchor that can carry the modifier.
|
|
1004
|
+
if ((0, captures_js_1.isStaticClassFieldBinding)(groupedNodes['@type-binding.constructor'], JS_CLASS_FIELD_DEFINITION_TYPES)) {
|
|
1005
|
+
continue;
|
|
1006
|
+
}
|
|
1007
|
+
// #1876: drop @declaration.function for array higher-order-method
|
|
1008
|
+
// callbacks (`const x = arr.map(a => …)`). The HOC-wrapped-arrow
|
|
1009
|
+
// pattern matches them, but the binding holds a value, not a callable.
|
|
1010
|
+
// The binding keeps its separate @declaration.const / .variable match,
|
|
1011
|
+
// and the arrow's own @scope.function match (a different pattern) is
|
|
1012
|
+
// untouched, so inner-call attribution falls through to the enclosing
|
|
1013
|
+
// scope instead of a phantom Function.
|
|
1014
|
+
const fnDeclAnchor = grouped['@declaration.function'];
|
|
1015
|
+
if (fnDeclAnchor !== undefined) {
|
|
1016
|
+
const arrowNode = findFunctionNode(tree.rootNode, fnDeclAnchor.range, groupedNodes['@declaration.function']);
|
|
1017
|
+
if (arrowNode !== null && (0, array_callback_js_1.isArrayMethodCallbackArrow)(arrowNode)) {
|
|
1018
|
+
continue;
|
|
1019
|
+
}
|
|
1020
|
+
if (arrowNode !== null && (0, ts_js_hoc_utils_js_1.isBlockedDefaultExportHoc)(arrowNode)) {
|
|
1021
|
+
continue;
|
|
1022
|
+
}
|
|
1023
|
+
// #2723 — see the matching filter in `typescript/captures.ts`.
|
|
1024
|
+
if (arrowNode !== null && (0, cjs_export_assignment_js_1.isShadowedCjsExportAssignment)(arrowNode, tree.rootNode)) {
|
|
1025
|
+
continue;
|
|
1026
|
+
}
|
|
1027
|
+
// #2723 follow-up: the member-assignment rule matches ANY identifier
|
|
1028
|
+
// receiver so an `exports` alias can be recognised. A receiver that is
|
|
1029
|
+
// not the exports object declares nothing at module scope — drop it, or
|
|
1030
|
+
// every `obj.handler = fn` would bind `handler` as a module symbol.
|
|
1031
|
+
if (arrowNode !== null && (0, cjs_export_assignment_js_1.isUnexportedMemberAssignmentValue)(arrowNode, tree.rootNode)) {
|
|
1032
|
+
continue;
|
|
1033
|
+
}
|
|
1034
|
+
// A `this.X = fn` declares a module symbol ONLY at the top level of a
|
|
1035
|
+
// CommonJS file, where `this` is `module.exports`. Inside a function it
|
|
1036
|
+
// is an instance member (a Method with an owner, no module binding), and
|
|
1037
|
+
// in ESM top-level `this` is undefined and exports nothing.
|
|
1038
|
+
if (arrowNode !== null && (0, cjs_export_assignment_js_1.isUndeclarableThisMemberValue)(arrowNode, tree.rootNode)) {
|
|
1039
|
+
continue;
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
if (fnDeclAnchor !== undefined) {
|
|
1043
|
+
const fnNode = findFunctionNode(tree.rootNode, fnDeclAnchor.range, groupedNodes['@declaration.function']);
|
|
1044
|
+
if (fnNode !== null && (0, ts_js_hoc_utils_js_1.isDefaultExportHocFunctionNode)(fnNode)) {
|
|
1045
|
+
grouped['@declaration.name'] = (0, ast_helpers_js_1.syntheticCapture)('@declaration.name', fnNode, (0, ts_js_hoc_utils_js_1.deriveDefaultExportHocName)(filePath));
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
// Synthesize arity metadata on function-like declarations.
|
|
1049
|
+
const declAnchor = pickFirstDefined(grouped, FUNCTION_DECL_TAGS);
|
|
1050
|
+
const declAnchorNode = pickFirstNode(groupedNodes, FUNCTION_DECL_TAGS);
|
|
1051
|
+
if (declAnchor !== undefined) {
|
|
1052
|
+
const fnNode = findFunctionNode(tree.rootNode, declAnchor.range, declAnchorNode);
|
|
1053
|
+
if (fnNode !== null) {
|
|
1054
|
+
const arity = (0, arity_metadata_js_1.computeTsArityMetadata)(fnNode);
|
|
1055
|
+
if (arity.parameterCount !== undefined) {
|
|
1056
|
+
grouped['@declaration.parameter-count'] = (0, ast_helpers_js_1.syntheticCapture)('@declaration.parameter-count', fnNode, String(arity.parameterCount));
|
|
1057
|
+
}
|
|
1058
|
+
if (arity.requiredParameterCount !== undefined) {
|
|
1059
|
+
grouped['@declaration.required-parameter-count'] = (0, ast_helpers_js_1.syntheticCapture)('@declaration.required-parameter-count', fnNode, String(arity.requiredParameterCount));
|
|
1060
|
+
}
|
|
1061
|
+
if (arity.parameterTypes !== undefined) {
|
|
1062
|
+
grouped['@declaration.parameter-types'] = (0, ast_helpers_js_1.syntheticCapture)('@declaration.parameter-types', fnNode, JSON.stringify(arity.parameterTypes));
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
// Synthesize @reference.arity on callsites. Skip JSX element anchors: a JSX
|
|
1067
|
+
// component used as a call argument (e.g. `render(<Foo .../>)`) is itself a
|
|
1068
|
+
// @reference.call.* anchor, and the ascent below would climb into the
|
|
1069
|
+
// enclosing call_expression and mis-attribute that call's arity to the
|
|
1070
|
+
// component. A JSX component reference has no call arity here — this restores
|
|
1071
|
+
// the pre-#1951 range-based behavior (no call_expression at the JSX range).
|
|
1072
|
+
// The guard lives at this call site, not inside findSelfOrAncestorOfTypes,
|
|
1073
|
+
// which is also used by the import-statement and function-scope ascents.
|
|
1074
|
+
const callAnchor = pickFirstDefined(grouped, CALL_TAGS);
|
|
1075
|
+
const callAnchorNode = pickFirstNode(groupedNodes, CALL_TAGS);
|
|
1076
|
+
const anchorIsJsxElement = callAnchorNode?.type === 'jsx_self_closing_element' ||
|
|
1077
|
+
callAnchorNode?.type === 'jsx_opening_element';
|
|
1078
|
+
if (callAnchor !== undefined &&
|
|
1079
|
+
grouped['@reference.arity'] === undefined &&
|
|
1080
|
+
!anchorIsJsxElement) {
|
|
1081
|
+
const callNode = findSelfOrAncestorOfTypes(callAnchorNode, ['call_expression', 'new_expression']) ??
|
|
1082
|
+
(0, ast_helpers_js_1.findNodeAtRange)(tree.rootNode, callAnchor.range, 'call_expression') ??
|
|
1083
|
+
(0, ast_helpers_js_1.findNodeAtRange)(tree.rootNode, callAnchor.range, 'new_expression');
|
|
1084
|
+
if (callNode !== null) {
|
|
1085
|
+
const argList = callNode.childForFieldName('arguments');
|
|
1086
|
+
const args = argList === null
|
|
1087
|
+
? []
|
|
1088
|
+
: argList.namedChildren.filter((c) => c !== null && c.type !== 'comment');
|
|
1089
|
+
grouped['@reference.arity'] = (0, ast_helpers_js_1.syntheticCapture)('@reference.arity', callNode, String(args.length));
|
|
1090
|
+
grouped['@reference.parameter-types'] = (0, ast_helpers_js_1.syntheticCapture)('@reference.parameter-types', callNode, JSON.stringify(args.map(inferArgType)));
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
// Structural receiver chain for a call whose receiver is itself an
|
|
1094
|
+
// expression, so resolution can type it by folding over structure
|
|
1095
|
+
// instead of re-parsing the receiver's source text. Self-gating: a
|
|
1096
|
+
// non-call match, an absent receiver, or a chain with no nameable base
|
|
1097
|
+
// all leave `grouped` untouched.
|
|
1098
|
+
(0, receiver_chain_captures_js_1.synthesizeReceiverChainCapture)(grouped, groupedNodes['@reference.receiver']);
|
|
1099
|
+
out.push(grouped);
|
|
1100
|
+
// Synthesize `this` receiver type-bindings on class member functions.
|
|
1101
|
+
const scopeFnAnchor = grouped['@scope.function'];
|
|
1102
|
+
if (scopeFnAnchor !== undefined) {
|
|
1103
|
+
const fnNode = findFunctionNode(tree.rootNode, scopeFnAnchor.range, groupedNodes['@scope.function']);
|
|
1104
|
+
if (fnNode !== null) {
|
|
1105
|
+
const synth = (0, receiver_binding_js_1.synthesizeTsReceiverBinding)(fnNode);
|
|
1106
|
+
if (synth !== null)
|
|
1107
|
+
out.push(synth);
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
// Post-query synthesis passes.
|
|
1112
|
+
synthesizeCjsImports(tree.rootNode, out);
|
|
1113
|
+
(0, cjs_module_exports_js_1.synthesizeCjsModuleExports)(tree.rootNode, filePath, out);
|
|
1114
|
+
synthesizeJsDocBindings(tree.rootNode, out);
|
|
1115
|
+
synthesizeConstructorFieldBindings(tree.rootNode, out);
|
|
1116
|
+
synthesizeDestructuringBindings(tree.rootNode, out);
|
|
1117
|
+
synthesizeForOfMapTupleBindings(tree.rootNode, out);
|
|
1118
|
+
synthesizeInstanceofNarrowings(tree.rootNode, out);
|
|
1119
|
+
synthesizeJsInheritanceReferences(tree.rootNode, out);
|
|
1120
|
+
out.push(...(0, callable_flow_captures_js_1.synthesizeCallableFlowCaptures)(tree.rootNode, JS_CALLABLE_CAPTURE_OPTIONS));
|
|
1121
|
+
return out;
|
|
1122
|
+
}
|