cgraphx 2.0.2 → 2.0.6
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 +13 -3
- package/dist/.claude-template/agents/task-history.md +186 -0
- package/dist/.claude-template/commands/end.md +1 -0
- package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +5 -3
- package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +8 -8
- package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +8 -8
- package/dist/.claude-template/skills/clarify-requirements/SKILL.md +13 -9
- package/dist/.claude-template/skills/db-query/SKILL.md +19 -2
- package/dist/.claude-template/skills/iboc-check/SKILL.md +51 -23
- package/dist/.claude-template/skills/iboc-check/filler-prompt.md +3 -4
- package/dist/.claude-template/skills/run-api-test/SKILL.md +15 -15
- package/dist/.claude-template/skills/run-api-test/assets/{template-test-report.md → template-/346/216/245/345/217/243/346/265/213/350/257/225/346/212/245/345/221/212.md} +4 -4
- package/dist/.claude-template/skills/run-api-test/references/bru-run.md +1 -1
- package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
- package/dist/.claude-template/skills/run-api-test/references/report-format.md +6 -6
- package/dist/.claude-template/skills/run-api-test/references/service-readiness.md +1 -1
- package/dist/.claude-template/skills/run-api-test/references/test-scope.md +6 -6
- package/dist/.claude-template/skills/run-ui-test/SKILL.md +186 -0
- package/dist/.claude-template/skills/run-ui-test/references/report-format.md +77 -0
- package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
- package/dist/.claude-template/skills/write-api/SKILL.md +18 -18
- package/dist/.claude-template/skills/write-api/assets/{template-api-spec.md → template-/346/216/245/345/217/243/346/265/213/350/257/225-spec.md} +1 -1
- package/dist/.claude-template/skills/write-api/references/{api-spec-format.md → /346/216/245/345/217/243/346/265/213/350/257/225-spec-format.md} +3 -3
- package/dist/.claude-template/skills/write-plan/SKILL.md +4 -2
- package/dist/.claude-template/skills/write-ui-test/SKILL.md +125 -0
- package/dist/.claude-template/skills/write-ui-test/references//347/224/250/344/276/213/350/247/204/346/240/274-format.md +94 -0
- 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/dbquery/cli.d.ts.map +1 -1
- package/dist/core/dbquery/cli.js +5 -4
- package/dist/core/dbquery/cli.js.map +1 -1
- package/dist/core/dbquery/config.d.ts.map +1 -1
- package/dist/core/dbquery/config.js +39 -3
- package/dist/core/dbquery/config.js.map +1 -1
- package/dist/core/dbquery/drivers/http.d.ts +23 -0
- package/dist/core/dbquery/drivers/http.d.ts.map +1 -0
- package/dist/core/dbquery/drivers/http.js +125 -0
- package/dist/core/dbquery/drivers/http.js.map +1 -0
- package/dist/core/dbquery/drivers/mysql.js +1 -1
- package/dist/core/dbquery/drivers/mysql.js.map +1 -1
- package/dist/core/dbquery/drivers/postgres.js +1 -1
- package/dist/core/dbquery/drivers/postgres.js.map +1 -1
- package/dist/core/dbquery/executor.d.ts.map +1 -1
- package/dist/core/dbquery/executor.js +46 -12
- package/dist/core/dbquery/executor.js.map +1 -1
- package/dist/core/dbquery/format.d.ts.map +1 -1
- package/dist/core/dbquery/format.js +2 -1
- package/dist/core/dbquery/format.js.map +1 -1
- package/dist/core/dbquery/init.d.ts.map +1 -1
- package/dist/core/dbquery/init.js +7 -0
- package/dist/core/dbquery/init.js.map +1 -1
- package/dist/core/dbquery/types.d.ts +55 -7
- package/dist/core/dbquery/types.d.ts.map +1 -1
- package/dist/core/directory.d.ts +17 -0
- package/dist/core/directory.d.ts.map +1 -1
- package/dist/core/directory.js +37 -0
- package/dist/core/directory.js.map +1 -1
- package/dist/core/features/cli.d.ts.map +1 -1
- package/dist/core/features/cli.js +3 -2
- package/dist/core/features/cli.js.map +1 -1
- package/dist/core/features/scanner.d.ts +1 -1
- package/dist/core/features/scanner.d.ts.map +1 -1
- package/dist/core/features/scanner.js +20 -4
- package/dist/core/features/scanner.js.map +1 -1
- package/dist/core/markdown/cli.d.ts.map +1 -1
- package/dist/core/markdown/cli.js +9 -8
- package/dist/core/markdown/cli.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/dist/web/register.d.ts.map +1 -1
- package/dist/web/register.js +2 -1
- package/dist/web/register.js.map +1 -1
- package/package.json +1 -1
- package/dist/.claude-template/.cgraphx/timeline-current-turn.json +0 -1
- package/dist/.claude-template/skills/.cgraphx/timeline-current-turn.json +0 -1
- package/dist/.claude-template/skills/handdrawn-deck/.cgraphx/timeline-current-turn.json +0 -1
- package/dist/.claude-template/skills/handdrawn-deck/references/.cgraphx/timeline-current-turn.json +0 -1
- package/dist/.claude-template/skills/handdrawn-sketch-engine/.cgraphx/timeline-current-turn.json +0 -1
- /package/dist/.claude-template/skills/run-api-test/assets/{template-test-verify.jsonl → template-/346/216/245/345/217/243/346/265/213/350/257/225/351/252/214/350/257/201.jsonl"} +0 -0
|
@@ -0,0 +1,1096 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `emitDartScopeCaptures` — the Dart scope-capture orchestrator (mirror of
|
|
4
|
+
* `languages/swift/captures.ts`, adapted for tree-sitter-dart's grammar).
|
|
5
|
+
*
|
|
6
|
+
* It runs `DART_SCOPE_QUERY` for the constructs that map cleanly to a single
|
|
7
|
+
* node (module/class scopes, type/method/field declarations, imports), then
|
|
8
|
+
* synthesizes the Dart-specific streams the grammar can't express as a single
|
|
9
|
+
* query node:
|
|
10
|
+
*
|
|
11
|
+
* 1. Function/method/constructor SCOPES — `function_signature`/`function_body`
|
|
12
|
+
* are SIBLINGS, so each Function scope is synthesized to span
|
|
13
|
+
* `signature.start .. body.end` (composed range); a constructor's body is
|
|
14
|
+
* a sibling of the wrapping `method_signature`.
|
|
15
|
+
* 2. Receiver (`this`/`super`) + parameter + return type bindings, anchored
|
|
16
|
+
* inside the body so they land in the Function scope.
|
|
17
|
+
* 3. Arity metadata on function-like declarations.
|
|
18
|
+
* 4. Field type bindings (for receiver-chain resolution).
|
|
19
|
+
* 5. References — calls (free/member/cascade) and member reads — from Dart's
|
|
20
|
+
* postfix `identifier (selector …)` chains, which have no
|
|
21
|
+
* `call_expression` node.
|
|
22
|
+
* 6. Local-variable constructor/call-result type inference.
|
|
23
|
+
* 7. Heritage — `extends` → `@reference.inherits` (the generic
|
|
24
|
+
* EXTENDS-by-target-kind pre-pass); `implements`/`with` → side-effect
|
|
25
|
+
* `__heritage__:` import markers consumed by `emitDartHeritageEdges`
|
|
26
|
+
* (Dart `implements <class>` must be IMPLEMENTS regardless of the
|
|
27
|
+
* target's symbol kind).
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.dartScopeOwnsReceivers = dartScopeOwnsReceivers;
|
|
31
|
+
exports.emitDartScopeCaptures = emitDartScopeCaptures;
|
|
32
|
+
const ast_helpers_js_1 = require("../../utils/ast-helpers.js");
|
|
33
|
+
const arity_metadata_js_1 = require("./arity-metadata.js");
|
|
34
|
+
const receiver_binding_js_1 = require("./receiver-binding.js");
|
|
35
|
+
const signature_bindings_js_1 = require("./signature-bindings.js");
|
|
36
|
+
const query_js_1 = require("./query.js");
|
|
37
|
+
const extension_type_preprocess_js_1 = require("./extension-type-preprocess.js");
|
|
38
|
+
const cache_stats_js_1 = require("./cache-stats.js");
|
|
39
|
+
const constants_js_1 = require("../../constants.js");
|
|
40
|
+
const safe_parse_js_1 = require("../../../tree-sitter/safe-parse.js");
|
|
41
|
+
const heritage_marker_js_1 = require("../../utils/heritage-marker.js");
|
|
42
|
+
const built_ins_js_1 = require("./built-ins.js");
|
|
43
|
+
const callable_flow_captures_js_1 = require("../../utils/callable-flow-captures.js");
|
|
44
|
+
const receiver_chain_captures_js_1 = require("../../utils/receiver-chain-captures.js");
|
|
45
|
+
const helpers_js_1 = require("../../field-extractors/configs/helpers.js");
|
|
46
|
+
/**
|
|
47
|
+
* `LanguageProvider.scopeOwnsReceivers` for Dart — the read side of
|
|
48
|
+
* `dartShadowedFieldsCapture`, which is where the full rationale lives.
|
|
49
|
+
*
|
|
50
|
+
* Reads the marker rather than re-deriving anything: the names were computed at
|
|
51
|
+
* capture time, where the AST is, and a `CaptureMatch` carries only
|
|
52
|
+
* name/range/text. Kept beside the emitter so the tag string has exactly one
|
|
53
|
+
* producer and one consumer, both in this file's line of sight.
|
|
54
|
+
*/
|
|
55
|
+
function dartScopeOwnsReceivers(match) {
|
|
56
|
+
const raw = match['@receiver-owner.shadowed-fields']?.text;
|
|
57
|
+
if (raw === undefined)
|
|
58
|
+
return undefined;
|
|
59
|
+
let parsed;
|
|
60
|
+
try {
|
|
61
|
+
parsed = JSON.parse(raw);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
if (!Array.isArray(parsed))
|
|
67
|
+
return undefined;
|
|
68
|
+
const names = parsed.filter((name) => typeof name === 'string' && name.length > 0);
|
|
69
|
+
return names.length > 0 ? new Set(names) : undefined;
|
|
70
|
+
}
|
|
71
|
+
const FUNCTION_DECL_TAGS = [
|
|
72
|
+
'@declaration.function',
|
|
73
|
+
'@declaration.method',
|
|
74
|
+
'@declaration.constructor',
|
|
75
|
+
];
|
|
76
|
+
const DART_CALLABLE_CAPTURE_OPTIONS = {
|
|
77
|
+
functionNodeTypes: new Set(['function_signature', 'function_expression']),
|
|
78
|
+
callNodeTypes: new Set(['selector']),
|
|
79
|
+
parameterListNodeTypes: new Set(['formal_parameter_list', 'arguments']),
|
|
80
|
+
parameterNodeTypes: new Set(['formal_parameter']),
|
|
81
|
+
// `initialized_identifier` covers TOP-LEVEL `var` bindings and the second and
|
|
82
|
+
// later declarators of a multi-name local; `static_final_declaration` covers
|
|
83
|
+
// top-level `final`/`const`, which parse into a different list node entirely.
|
|
84
|
+
// Dart wraps only the FIRST local declarator in `initialized_variable_
|
|
85
|
+
// definition`, so without the other two a top-level `var f = (x) => x;`, a
|
|
86
|
+
// `final f = …`, and the `g` of `var f = …, g = …;` all emitted no flow
|
|
87
|
+
// captures at all and never resolved (#2693).
|
|
88
|
+
bindingNodeTypes: new Set([
|
|
89
|
+
'initialized_variable_definition',
|
|
90
|
+
'initialized_identifier',
|
|
91
|
+
'static_final_declaration',
|
|
92
|
+
]),
|
|
93
|
+
assignmentNodeTypes: new Set(['assignment_expression']),
|
|
94
|
+
identifierNodeTypes: new Set(['identifier', 'type_identifier']),
|
|
95
|
+
// `initialized_identifier` and `static_final_declaration` are FIELDLESS, so
|
|
96
|
+
// the shared field-based fallback (`left`/`name`/`value`/…) decomposes
|
|
97
|
+
// nothing and those bindings produced no flow facts at all — the same shape
|
|
98
|
+
// as Kotlin's fieldless `assignment` node. Positional: first named child is
|
|
99
|
+
// the bound name, last is the initializer.
|
|
100
|
+
// `initialized_variable_definition` carries real `name:` / `value:` fields,
|
|
101
|
+
// so it is left to the shared path by returning undefined.
|
|
102
|
+
extractAssignment: (node) => {
|
|
103
|
+
if (node.type !== 'initialized_identifier' && node.type !== 'static_final_declaration') {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
const named = node.namedChildren.filter((child) => child !== null);
|
|
107
|
+
if (named.length < 2)
|
|
108
|
+
return undefined;
|
|
109
|
+
return { destination: named[0], source: named[named.length - 1] };
|
|
110
|
+
},
|
|
111
|
+
lexicalFunctionOwner: (node) => dartLexicalFunctionOwner(node),
|
|
112
|
+
isCallNode: (node) => node.namedChild(0)?.type === 'argument_part',
|
|
113
|
+
extractCallCallee: (node) => dartCallableCallee(node) ?? undefined,
|
|
114
|
+
callSiteNode: (node) => dartCallableCallee(node) ?? undefined,
|
|
115
|
+
callableProtocolMethods: new Set(['call']),
|
|
116
|
+
};
|
|
117
|
+
function dartLexicalFunctionOwner(input) {
|
|
118
|
+
let node = input;
|
|
119
|
+
while (node !== null) {
|
|
120
|
+
if (node.type === 'function_signature' || node.type === 'function_expression')
|
|
121
|
+
return node;
|
|
122
|
+
if (node.type === 'function_body') {
|
|
123
|
+
const signature = node.previousNamedSibling;
|
|
124
|
+
if (signature?.type === 'function_signature')
|
|
125
|
+
return signature;
|
|
126
|
+
}
|
|
127
|
+
node = node.parent;
|
|
128
|
+
}
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
function emitDartScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
132
|
+
// Idempotent re-application: `extractParsedFile` already preprocesses, but
|
|
133
|
+
// direct emitter callers (benchmarks, capture goldens) must see the same
|
|
134
|
+
// program the pipeline does.
|
|
135
|
+
const parseText = (0, extension_type_preprocess_js_1.preprocessDartExtensionTypes)(sourceText);
|
|
136
|
+
let tree;
|
|
137
|
+
if (cachedTree !== undefined && cachedTree !== null) {
|
|
138
|
+
tree = cachedTree;
|
|
139
|
+
(0, cache_stats_js_1.recordCacheHit)();
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
tree = (0, safe_parse_js_1.parseSourceSafe)((0, query_js_1.getDartParser)(), parseText, undefined, {
|
|
143
|
+
bufferSize: (0, constants_js_1.getTreeSitterBufferSize)(parseText),
|
|
144
|
+
});
|
|
145
|
+
(0, cache_stats_js_1.recordCacheMiss)();
|
|
146
|
+
}
|
|
147
|
+
const root = tree.rootNode;
|
|
148
|
+
const out = [];
|
|
149
|
+
// A named constructor (`A.named()`) parses as ONE `constructor_signature`
|
|
150
|
+
// carrying multiple `name:` fields, so the `@declaration.constructor` query
|
|
151
|
+
// pattern matches it more than once. Each match would synthesize an
|
|
152
|
+
// identical-range `@scope.function`, producing duplicate scope ids that make
|
|
153
|
+
// `buildScopeTree` throw and the whole file get dropped. Dedup function-like
|
|
154
|
+
// declarations by their statement node so each is emitted exactly once.
|
|
155
|
+
const seenFnDeclNodes = new Set();
|
|
156
|
+
// Shared, per-file. Pass A (the receiver mask below) and Pass B
|
|
157
|
+
// (`emitDartFieldAssignmentBindings`) ask the SAME two questions of the same
|
|
158
|
+
// nodes — "what does this class declare as a field" and "what does this
|
|
159
|
+
// member body bind" — so the memo makes each answer cost one walk per node
|
|
160
|
+
// for the whole file instead of one per consumer.
|
|
161
|
+
const memo = { fieldsByClassBody: new Map(), shadowsByBody: new Map() };
|
|
162
|
+
// ── Pass A: query-driven scopes / declarations / imports ────────────────
|
|
163
|
+
for (const match of (0, query_js_1.getDartScopeQuery)().matches(root)) {
|
|
164
|
+
const grouped = {};
|
|
165
|
+
const nodeMap = {};
|
|
166
|
+
for (const c of match.captures) {
|
|
167
|
+
const tag = '@' + c.name;
|
|
168
|
+
grouped[tag] = (0, ast_helpers_js_1.nodeToCapture)(tag, c.node);
|
|
169
|
+
nodeMap[tag] = c.node;
|
|
170
|
+
}
|
|
171
|
+
if (Object.keys(grouped).length === 0)
|
|
172
|
+
continue;
|
|
173
|
+
const declTag = FUNCTION_DECL_TAGS.find((t) => grouped[t] !== undefined);
|
|
174
|
+
if (declTag !== undefined) {
|
|
175
|
+
const declNode = nodeMap[declTag];
|
|
176
|
+
const declKey = `${declNode.startIndex}:${declNode.endIndex}`;
|
|
177
|
+
if (seenFnDeclNodes.has(declKey))
|
|
178
|
+
continue; // dedup named-ctor double-match
|
|
179
|
+
seenFnDeclNodes.add(declKey);
|
|
180
|
+
const bodyNode = findFunctionBody(declNode);
|
|
181
|
+
attachArityMetadata(grouped, declNode);
|
|
182
|
+
// Structural receiver chain for a call whose receiver is itself an
|
|
183
|
+
// expression, so resolution can type it by folding over structure
|
|
184
|
+
// instead of re-parsing the receiver's source text. Self-gating: a
|
|
185
|
+
// non-call match, an absent receiver, or a chain with no nameable base
|
|
186
|
+
// all leave `grouped` untouched.
|
|
187
|
+
(0, receiver_chain_captures_js_1.synthesizeReceiverChainCapture)(grouped, nodeMap['@reference.receiver']);
|
|
188
|
+
out.push(grouped);
|
|
189
|
+
if (bodyNode !== null) {
|
|
190
|
+
// The READ-side half of the bare-name field discipline (#2807 review).
|
|
191
|
+
// Rides the SAME synthesized match as `@scope.function` so the mask
|
|
192
|
+
// lands on this member's Function scope; outside the `@scope.`
|
|
193
|
+
// namespace so `anchorCaptureFor` cannot mistake it for the anchor.
|
|
194
|
+
const mask = dartShadowedFieldsCapture(bodyNode, memo);
|
|
195
|
+
out.push({
|
|
196
|
+
'@scope.function': spanCapture('@scope.function', declNode, bodyNode),
|
|
197
|
+
...(mask === undefined ? {} : { '@receiver-owner.shadowed-fields': mask }),
|
|
198
|
+
});
|
|
199
|
+
for (const cm of (0, receiver_binding_js_1.synthesizeDartReceiverBinding)(declNode, bodyNode))
|
|
200
|
+
out.push(cm);
|
|
201
|
+
}
|
|
202
|
+
for (const cm of (0, signature_bindings_js_1.synthesizeDartSignatureBindings)(declNode, bodyNode))
|
|
203
|
+
out.push(cm);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
// Class fields: emit the Property declaration AND a class-scope type
|
|
207
|
+
// binding (so `receiver.field.method()` chains resolve the field type).
|
|
208
|
+
if (grouped['@declaration.property'] !== undefined &&
|
|
209
|
+
grouped['@declaration.name'] !== undefined) {
|
|
210
|
+
const propNode = nodeMap['@declaration.property'];
|
|
211
|
+
const fieldType = extractFieldType(propNode);
|
|
212
|
+
const fieldName = grouped['@declaration.name'].text;
|
|
213
|
+
if (fieldType !== null) {
|
|
214
|
+
grouped['@declaration.field-type'] = (0, ast_helpers_js_1.syntheticCapture)('@declaration.field-type', propNode, fieldType);
|
|
215
|
+
}
|
|
216
|
+
// Structural receiver chain for a call whose receiver is itself an
|
|
217
|
+
// expression, so resolution can type it by folding over structure
|
|
218
|
+
// instead of re-parsing the receiver's source text. Self-gating: a
|
|
219
|
+
// non-call match, an absent receiver, or a chain with no nameable base
|
|
220
|
+
// all leave `grouped` untouched.
|
|
221
|
+
(0, receiver_chain_captures_js_1.synthesizeReceiverChainCapture)(grouped, nodeMap['@reference.receiver']);
|
|
222
|
+
out.push(grouped);
|
|
223
|
+
if (fieldType !== null) {
|
|
224
|
+
out.push({
|
|
225
|
+
'@type-binding.annotation': (0, ast_helpers_js_1.nodeToCapture)('@type-binding.annotation', propNode),
|
|
226
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', propNode, fieldName),
|
|
227
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', propNode, fieldType),
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
// No written type, so the field's type comes from the constructor its
|
|
232
|
+
// initializer calls (#2807). `constructor-inferred` is the weakest
|
|
233
|
+
// source, and the annotated branch above already returned, so an
|
|
234
|
+
// annotated field is untouched either way.
|
|
235
|
+
const callee = dartFieldConstructorCallee(nodeMap['@declaration.name']);
|
|
236
|
+
if (callee !== null) {
|
|
237
|
+
out.push({
|
|
238
|
+
'@type-binding.constructor': (0, ast_helpers_js_1.nodeToCapture)('@type-binding.constructor', propNode),
|
|
239
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', propNode, fieldName),
|
|
240
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', propNode, callee.text),
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
// Structural receiver chain for a call whose receiver is itself an
|
|
247
|
+
// expression, so resolution can type it by folding over structure
|
|
248
|
+
// instead of re-parsing the receiver's source text. Self-gating: a
|
|
249
|
+
// non-call match, an absent receiver, or a chain with no nameable base
|
|
250
|
+
// all leave `grouped` untouched.
|
|
251
|
+
(0, receiver_chain_captures_js_1.synthesizeReceiverChainCapture)(grouped, nodeMap['@reference.receiver']);
|
|
252
|
+
out.push(grouped);
|
|
253
|
+
}
|
|
254
|
+
// ── Pass B: tree-walked references, type inference, heritage ────────────
|
|
255
|
+
const seenReadSpans = new Set();
|
|
256
|
+
(0, ast_helpers_js_1.walkNamedTree)(root, (node) => {
|
|
257
|
+
if (node.type === 'selector') {
|
|
258
|
+
emitSelectorReference(node, out, seenReadSpans);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (node.type === 'cascade_section') {
|
|
262
|
+
emitCascadeReference(node, out);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (node.type === 'initialized_variable_definition') {
|
|
266
|
+
emitVarTypeBinding(node, out);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
if (node.type === 'class_definition') {
|
|
270
|
+
emitHeritage(node, out);
|
|
271
|
+
emitDartFieldAssignmentBindings(node, out, memo);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (node.type === 'extension_declaration') {
|
|
275
|
+
emitExtensionImplementsHeritage(node, out);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
out.push(...(0, callable_flow_captures_js_1.synthesizeCallableFlowCaptures)(root, DART_CALLABLE_CAPTURE_OPTIONS));
|
|
280
|
+
return out;
|
|
281
|
+
}
|
|
282
|
+
function dartCallableCallee(selector) {
|
|
283
|
+
if (selector.namedChild(0)?.type !== 'argument_part')
|
|
284
|
+
return null;
|
|
285
|
+
const previous = selector.previousNamedSibling;
|
|
286
|
+
if (previous?.type === 'identifier')
|
|
287
|
+
return previous;
|
|
288
|
+
if (previous?.type !== 'selector')
|
|
289
|
+
return null;
|
|
290
|
+
const inner = previous.namedChild(0);
|
|
291
|
+
return inner !== null && ASSIGNABLE_SELECTORS.has(inner.type) ? selectorName(inner) : null;
|
|
292
|
+
}
|
|
293
|
+
// ─── Function scope synthesis ───────────────────────────────────────────────
|
|
294
|
+
/**
|
|
295
|
+
* The sibling `function_body` of a declaration, or null (abstract/bodyless).
|
|
296
|
+
*
|
|
297
|
+
* The body is the next named sibling of the declaration's *statement-level*
|
|
298
|
+
* node. For methods/operators the `@declaration` anchor IS the `method_signature`
|
|
299
|
+
* (body is its sibling). For a constructor the anchor is the INNER
|
|
300
|
+
* `constructor_signature`, whose body is a sibling of the WRAPPING
|
|
301
|
+
* `method_signature` (AST: `class_body > method_signature > constructor_signature`,
|
|
302
|
+
* then `function_body`) — so walk up to the `method_signature` wrapper first.
|
|
303
|
+
* Top-level `function_signature` (parent `program`) and abstract `declaration`
|
|
304
|
+
* nodes are unaffected.
|
|
305
|
+
*/
|
|
306
|
+
function findFunctionBody(declNode) {
|
|
307
|
+
// A closure literal carries its body as a CHILD (function_expression_body),
|
|
308
|
+
// unlike a Dart declaration whose body is the next named SIBLING. Without
|
|
309
|
+
// this branch the caller synthesizes no @scope.function for a closure at all,
|
|
310
|
+
// so a closure binding has no scope to own its callable def and can never be
|
|
311
|
+
// a call SOURCE (#2699 S4 — this is why Dart alone showed zero child scopes).
|
|
312
|
+
if (declNode.type === 'function_expression') {
|
|
313
|
+
const body = declNode.namedChildren.find((c) => c.type === 'function_expression_body');
|
|
314
|
+
return body ?? null;
|
|
315
|
+
}
|
|
316
|
+
const node = declNode.parent !== null && declNode.parent.type === 'method_signature'
|
|
317
|
+
? declNode.parent
|
|
318
|
+
: declNode;
|
|
319
|
+
const next = node.nextNamedSibling;
|
|
320
|
+
return next !== null && next.type === 'function_body' ? next : null;
|
|
321
|
+
}
|
|
322
|
+
/** A capture whose range spans two nodes (Dart has no node wrapping both a
|
|
323
|
+
* signature and its sibling body). */
|
|
324
|
+
function spanCapture(name, startNode, endNode) {
|
|
325
|
+
return {
|
|
326
|
+
name,
|
|
327
|
+
range: {
|
|
328
|
+
startLine: startNode.startPosition.row + 1,
|
|
329
|
+
startCol: startNode.startPosition.column,
|
|
330
|
+
endLine: endNode.endPosition.row + 1,
|
|
331
|
+
endCol: endNode.endPosition.column,
|
|
332
|
+
},
|
|
333
|
+
text: '',
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
function attachArityMetadata(grouped, declNode) {
|
|
337
|
+
const meta = (0, arity_metadata_js_1.computeDartArityMetadata)(declNode);
|
|
338
|
+
if (meta.parameterCount !== undefined) {
|
|
339
|
+
grouped['@declaration.parameter-count'] = (0, ast_helpers_js_1.syntheticCapture)('@declaration.parameter-count', declNode, String(meta.parameterCount));
|
|
340
|
+
}
|
|
341
|
+
if (meta.requiredParameterCount !== undefined) {
|
|
342
|
+
grouped['@declaration.required-parameter-count'] = (0, ast_helpers_js_1.syntheticCapture)('@declaration.required-parameter-count', declNode, String(meta.requiredParameterCount));
|
|
343
|
+
}
|
|
344
|
+
if (meta.parameterTypes !== undefined) {
|
|
345
|
+
grouped['@declaration.parameter-types'] = (0, ast_helpers_js_1.syntheticCapture)('@declaration.parameter-types', declNode, JSON.stringify(meta.parameterTypes));
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/** The declared type of a class field (`Address address = …` → `Address`). */
|
|
349
|
+
function extractFieldType(declNode) {
|
|
350
|
+
for (let i = 0; i < declNode.namedChildCount; i++) {
|
|
351
|
+
const c = declNode.namedChild(i);
|
|
352
|
+
if (c !== null && (c.type === 'type_identifier' || c.type === 'nullable_type')) {
|
|
353
|
+
return c.text.replace(/\?+$/, '');
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
// ─── References: calls + member reads (postfix chains) ──────────────────────
|
|
359
|
+
const ASSIGNABLE_SELECTORS = new Set([
|
|
360
|
+
'unconditional_assignable_selector',
|
|
361
|
+
'conditional_assignable_selector',
|
|
362
|
+
]);
|
|
363
|
+
/** Last named `identifier` child of an assignable/cascade selector. */
|
|
364
|
+
function selectorName(inner) {
|
|
365
|
+
for (let i = inner.namedChildCount - 1; i >= 0; i--) {
|
|
366
|
+
const c = inner.namedChild(i);
|
|
367
|
+
if (c !== null && c.type === 'identifier')
|
|
368
|
+
return c;
|
|
369
|
+
}
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
372
|
+
/** Count call arguments under a `selector(argument_part(arguments(…)))`. */
|
|
373
|
+
function countArgs(argPart) {
|
|
374
|
+
const args = argPart.namedChild(0);
|
|
375
|
+
if (args === null)
|
|
376
|
+
return 0;
|
|
377
|
+
let n = 0;
|
|
378
|
+
for (let i = 0; i < args.namedChildCount; i++) {
|
|
379
|
+
const c = args.namedChild(i);
|
|
380
|
+
if (c !== null && (c.type === 'argument' || c.type === 'named_argument'))
|
|
381
|
+
n++;
|
|
382
|
+
}
|
|
383
|
+
return n;
|
|
384
|
+
}
|
|
385
|
+
/** Receiver text preceding a member-call/read selector (the postfix chain
|
|
386
|
+
* head plus any intermediate selectors): `user.address.save()` → `user.address`. */
|
|
387
|
+
function computeReceiverText(nameSelector) {
|
|
388
|
+
const selectors = [];
|
|
389
|
+
let cur = nameSelector.previousNamedSibling;
|
|
390
|
+
let head = null;
|
|
391
|
+
while (cur !== null) {
|
|
392
|
+
if (cur.type === 'selector') {
|
|
393
|
+
selectors.push(cur);
|
|
394
|
+
cur = cur.previousNamedSibling;
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
head = cur;
|
|
398
|
+
break;
|
|
399
|
+
}
|
|
400
|
+
if (head === null)
|
|
401
|
+
return null;
|
|
402
|
+
if (head.type !== 'identifier' && head.type !== 'this' && head.type !== 'super')
|
|
403
|
+
return null;
|
|
404
|
+
selectors.reverse();
|
|
405
|
+
let text = head.text;
|
|
406
|
+
for (const s of selectors)
|
|
407
|
+
text += s.text;
|
|
408
|
+
return text;
|
|
409
|
+
}
|
|
410
|
+
function emitSelectorReference(selector, out, seenReadSpans) {
|
|
411
|
+
const inner = selector.namedChild(0);
|
|
412
|
+
if (inner === null)
|
|
413
|
+
return;
|
|
414
|
+
// A `selector(argument_part)` is the call marker; the callee is the
|
|
415
|
+
// immediately-preceding sibling.
|
|
416
|
+
if (inner.type === 'argument_part') {
|
|
417
|
+
const prev = selector.previousNamedSibling;
|
|
418
|
+
if (prev === null)
|
|
419
|
+
return;
|
|
420
|
+
const arity = countArgs(inner);
|
|
421
|
+
if (prev.type === 'identifier') {
|
|
422
|
+
const name = prev.text;
|
|
423
|
+
if (built_ins_js_1.DART_BUILT_INS.has(name))
|
|
424
|
+
return; // legacy suppresses built-in-named calls
|
|
425
|
+
// Dart has no `new`: an UpperCamelCase callee is a constructor call by
|
|
426
|
+
// convention (types are UpperCamelCase) — tag it so `constructorCallTargetsClass`
|
|
427
|
+
// links `Foo()` to the Class node (the legacy DAG emits that edge even for an
|
|
428
|
+
// implicit constructor). A lowercase callee is an ordinary free function call.
|
|
429
|
+
const tag = /^[A-Z]/.test(name) ? '@reference.call.constructor' : '@reference.call.free';
|
|
430
|
+
out.push({
|
|
431
|
+
[tag]: (0, ast_helpers_js_1.nodeToCapture)(tag, prev),
|
|
432
|
+
'@reference.name': (0, ast_helpers_js_1.nodeToCapture)('@reference.name', prev),
|
|
433
|
+
'@reference.arity': (0, ast_helpers_js_1.syntheticCapture)('@reference.arity', prev, String(arity)),
|
|
434
|
+
});
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
if (prev.type === 'selector') {
|
|
438
|
+
const prevInner = prev.namedChild(0);
|
|
439
|
+
if (prevInner === null)
|
|
440
|
+
return;
|
|
441
|
+
if (ASSIGNABLE_SELECTORS.has(prevInner.type)) {
|
|
442
|
+
const nameId = selectorName(prevInner);
|
|
443
|
+
if (nameId === null)
|
|
444
|
+
return;
|
|
445
|
+
if (built_ins_js_1.DART_BUILT_INS.has(nameId.text))
|
|
446
|
+
return; // legacy suppresses built-in-named calls
|
|
447
|
+
const recv = computeReceiverText(prev);
|
|
448
|
+
const cm = {
|
|
449
|
+
'@reference.call.member': (0, ast_helpers_js_1.nodeToCapture)('@reference.call.member', nameId),
|
|
450
|
+
'@reference.name': (0, ast_helpers_js_1.nodeToCapture)('@reference.name', nameId),
|
|
451
|
+
'@reference.arity': (0, ast_helpers_js_1.syntheticCapture)('@reference.arity', nameId, String(arity)),
|
|
452
|
+
...(recv !== null
|
|
453
|
+
? { '@reference.receiver': (0, ast_helpers_js_1.syntheticCapture)('@reference.receiver', prev, recv) }
|
|
454
|
+
: {}),
|
|
455
|
+
};
|
|
456
|
+
out.push(cm);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
// A member access selector that is NOT immediately followed by a call is a
|
|
462
|
+
// field read (`user.address` in `user.address.save()`).
|
|
463
|
+
if (ASSIGNABLE_SELECTORS.has(inner.type)) {
|
|
464
|
+
const next = selector.nextNamedSibling;
|
|
465
|
+
const isCall = next !== null && next.type === 'selector' && next.namedChild(0)?.type === 'argument_part';
|
|
466
|
+
if (isCall)
|
|
467
|
+
return;
|
|
468
|
+
const nameId = selectorName(inner);
|
|
469
|
+
if (nameId === null)
|
|
470
|
+
return;
|
|
471
|
+
const recv = computeReceiverText(selector);
|
|
472
|
+
if (recv === null)
|
|
473
|
+
return;
|
|
474
|
+
const spanKey = `${nameId.startIndex}-${nameId.endIndex}`;
|
|
475
|
+
if (seenReadSpans.has(spanKey))
|
|
476
|
+
return;
|
|
477
|
+
seenReadSpans.add(spanKey);
|
|
478
|
+
out.push({
|
|
479
|
+
'@reference.read.member': (0, ast_helpers_js_1.nodeToCapture)('@reference.read.member', nameId),
|
|
480
|
+
'@reference.name': (0, ast_helpers_js_1.nodeToCapture)('@reference.name', nameId),
|
|
481
|
+
'@reference.receiver': (0, ast_helpers_js_1.syntheticCapture)('@reference.receiver', selector, recv),
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Cascade call `receiver..method(args)` — Dart's `cascade_section` holds a
|
|
487
|
+
* `cascade_selector` + `argument_part` as DIRECT children (no `selector`
|
|
488
|
+
* wrapper, so `emitSelectorReference` never sees it). The legacy DAG matches
|
|
489
|
+
* `(cascade_section (cascade_selector (identifier)) (argument_part))` and
|
|
490
|
+
* classifies cascade calls as FREE calls — mirror that for parity. A property
|
|
491
|
+
* cascade (`..field = x`, no `argument_part`) is not a call and is skipped.
|
|
492
|
+
*/
|
|
493
|
+
function emitCascadeReference(cascade, out) {
|
|
494
|
+
let selectorNode = null;
|
|
495
|
+
let argPart = null;
|
|
496
|
+
for (let i = 0; i < cascade.namedChildCount; i++) {
|
|
497
|
+
const c = cascade.namedChild(i);
|
|
498
|
+
if (c === null)
|
|
499
|
+
continue;
|
|
500
|
+
if (c.type === 'cascade_selector')
|
|
501
|
+
selectorNode = c;
|
|
502
|
+
else if (c.type === 'argument_part')
|
|
503
|
+
argPart = c;
|
|
504
|
+
}
|
|
505
|
+
if (selectorNode === null || argPart === null)
|
|
506
|
+
return;
|
|
507
|
+
const nameId = selectorName(selectorNode);
|
|
508
|
+
if (nameId === null || built_ins_js_1.DART_BUILT_INS.has(nameId.text))
|
|
509
|
+
return;
|
|
510
|
+
const arity = countArgs(argPart);
|
|
511
|
+
out.push({
|
|
512
|
+
'@reference.call.free': (0, ast_helpers_js_1.nodeToCapture)('@reference.call.free', nameId),
|
|
513
|
+
'@reference.name': (0, ast_helpers_js_1.nodeToCapture)('@reference.name', nameId),
|
|
514
|
+
'@reference.arity': (0, ast_helpers_js_1.syntheticCapture)('@reference.arity', nameId, String(arity)),
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
// ─── Local-variable constructor / call-result type inference ────────────────
|
|
518
|
+
/**
|
|
519
|
+
* Is `node` the callee of a construction / free call written directly at this
|
|
520
|
+
* position — a bare identifier whose next named sibling is a `selector`
|
|
521
|
+
* carrying an `argument_part` (`Outer()`)?
|
|
522
|
+
*
|
|
523
|
+
* Dart has no `new` keyword, so a constructor call and a free call are the same
|
|
524
|
+
* shape; the resolver decides which by looking the name up. Anything else — a
|
|
525
|
+
* literal, a member call, an index — is NOT this shape and is left alone rather
|
|
526
|
+
* than guessed at.
|
|
527
|
+
*/
|
|
528
|
+
function isDirectConstruction(node) {
|
|
529
|
+
if (node === null || node.type !== 'identifier')
|
|
530
|
+
return false;
|
|
531
|
+
const next = node.nextNamedSibling;
|
|
532
|
+
return next !== null && next.type === 'selector' && next.namedChild(0)?.type === 'argument_part';
|
|
533
|
+
}
|
|
534
|
+
/** Find the callee identifier of a `var x = Callee(…)` / `await Callee(…)`
|
|
535
|
+
* initializer (a direct free-call / constructor); returns null for member
|
|
536
|
+
* calls or non-call values. */
|
|
537
|
+
function findDirectCallValue(initVarDef) {
|
|
538
|
+
const firstValue = initVarDef.childForFieldName('value');
|
|
539
|
+
if (firstValue === null)
|
|
540
|
+
return null;
|
|
541
|
+
if (firstValue.type === 'identifier') {
|
|
542
|
+
return isDirectConstruction(firstValue) ? firstValue : null;
|
|
543
|
+
}
|
|
544
|
+
if (firstValue.type === 'unary_expression' || firstValue.type === 'await_expression') {
|
|
545
|
+
let aw = firstValue;
|
|
546
|
+
if (aw.type === 'unary_expression') {
|
|
547
|
+
const inner = aw.namedChild(0);
|
|
548
|
+
if (inner === null)
|
|
549
|
+
return null;
|
|
550
|
+
aw = inner;
|
|
551
|
+
}
|
|
552
|
+
if (aw.type === 'await_expression') {
|
|
553
|
+
// `namedChild(0)` is the awaited callee; its next named sibling is
|
|
554
|
+
// `namedChild(1)`, so `isDirectConstruction` asks exactly the same
|
|
555
|
+
// question this branch used to spell out.
|
|
556
|
+
const id = aw.namedChild(0);
|
|
557
|
+
if (isDirectConstruction(id))
|
|
558
|
+
return id;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
return null;
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Callee identifier of a class field initialized by a direct constructor call —
|
|
565
|
+
* `var b = Outer();` / `final b = Outer();` — or `null` for anything else.
|
|
566
|
+
*
|
|
567
|
+
* Dart spells a class field as `declaration(<keyword>, initialized_identifier_list(
|
|
568
|
+
* initialized_identifier))`, NOT the `initialized_variable_definition` that
|
|
569
|
+
* `emitVarTypeBinding` handles — that is the LOCAL form. So an unannotated field
|
|
570
|
+
* had no type binding and could not act as a call receiver (#2807), even though
|
|
571
|
+
* its annotated twin resolved fine.
|
|
572
|
+
*
|
|
573
|
+
* Takes the field's own `@declaration.name` node, whose next named sibling IS
|
|
574
|
+
* the initializer — `initialized_identifier(<name> <value> …)`. Deliberately NOT
|
|
575
|
+
* a search down from the `@declaration.property` node: one `declaration` can
|
|
576
|
+
* hold SEVERAL declarators (`var a = X(), b = Y();`), which the query matches
|
|
577
|
+
* once each with the same property node, so a first-descendant search hands
|
|
578
|
+
* every declarator the FIRST one's initializer and types `b` as `X`.
|
|
579
|
+
*/
|
|
580
|
+
function dartFieldConstructorCallee(nameNode) {
|
|
581
|
+
const value = nameNode.nextNamedSibling;
|
|
582
|
+
return isDirectConstruction(value) ? value : null;
|
|
583
|
+
}
|
|
584
|
+
function emitVarTypeBinding(initVarDef, out) {
|
|
585
|
+
const nameNode = initVarDef.childForFieldName('name');
|
|
586
|
+
if (nameNode === null)
|
|
587
|
+
return;
|
|
588
|
+
const calleeId = findDirectCallValue(initVarDef);
|
|
589
|
+
if (calleeId === null)
|
|
590
|
+
return;
|
|
591
|
+
out.push({
|
|
592
|
+
'@type-binding.constructor': (0, ast_helpers_js_1.nodeToCapture)('@type-binding.constructor', initVarDef),
|
|
593
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', initVarDef, nameNode.text),
|
|
594
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', initVarDef, calleeId.text),
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
// ─── Heritage ───────────────────────────────────────────────────────────────
|
|
598
|
+
/**
|
|
599
|
+
* Type an inference-typed field from a constructor call ASSIGNED to it —
|
|
600
|
+
* `var r; C() { r = Outer(); }` and `this.r = Outer();` (#2807).
|
|
601
|
+
*
|
|
602
|
+
* Dart is the one language here that writes a field with NO receiver prefix, so
|
|
603
|
+
* `r = Outer()` is syntactically identical to assigning a constructor-local. The
|
|
604
|
+
* discriminator is the class's own declared field set: a bare name binds only
|
|
605
|
+
* when the enclosing class declares it AND the enclosing member binds no name of
|
|
606
|
+
* its own that would shadow it (`collectDartBodyShadows` — parameters, locals,
|
|
607
|
+
* closure parameters, catch bindings, loop variables), which is exactly when
|
|
608
|
+
* Dart itself resolves `r` to the field. A `this.`-prefixed write is unambiguous
|
|
609
|
+
* and needs neither test.
|
|
610
|
+
*
|
|
611
|
+
* Emitted as `constructor-inferred`, the weakest source, so a field that also
|
|
612
|
+
* carries an annotation keeps it. The narrow `@type-binding.dart-field` marker
|
|
613
|
+
* rides the name node for `dartBindingScopeFor` to hoist on — the binding has to
|
|
614
|
+
* land on the Class scope, since the assignment sits inside a constructor's own
|
|
615
|
+
* Function scope where `typeOfMemberOnClass` never looks.
|
|
616
|
+
*/
|
|
617
|
+
function emitDartFieldAssignmentBindings(classNode, out, memo) {
|
|
618
|
+
const body = (0, ast_helpers_js_1.findChild)(classNode, 'class_body');
|
|
619
|
+
if (body === null)
|
|
620
|
+
return;
|
|
621
|
+
// `namedChildren` allocates a fresh wrapper array on every access
|
|
622
|
+
// (node-tree-sitter), and the loop below walks the same list — read it once.
|
|
623
|
+
const members = body.namedChildren;
|
|
624
|
+
const fields = dartClassFieldNames(body, memo);
|
|
625
|
+
if (fields.size === 0)
|
|
626
|
+
return;
|
|
627
|
+
for (const member of members) {
|
|
628
|
+
if (member === null || member.type !== 'function_body')
|
|
629
|
+
continue;
|
|
630
|
+
// A STATIC member's body can never write this class's INSTANCE fields.
|
|
631
|
+
// Dart's static scope holds only the class's static members, so a bare
|
|
632
|
+
// `z = Outer()` inside `static void make()` binds a LIBRARY-level `z` (or is
|
|
633
|
+
// a compile error) — never the same-named instance field. Binding it anyway
|
|
634
|
+
// did not merely add an edge: the write landed on the Class scope at the
|
|
635
|
+
// same `constructor-inferred` strength as the constructor's own, and the
|
|
636
|
+
// `>=` tie-break in `scope-extractor` let it DISPLACE the correct type, so
|
|
637
|
+
// `z.inner()` resolved to the wrong class (#2807 review). The instance
|
|
638
|
+
// static-vs-instance collision TypeScript and JavaScript allow cannot arise
|
|
639
|
+
// in Dart — one class may not declare a static and an instance member of the
|
|
640
|
+
// same name — so this is the only shape the defect takes here.
|
|
641
|
+
//
|
|
642
|
+
// Grammar: every class-member body is a `function_body` whose PREVIOUS named
|
|
643
|
+
// sibling is a `method_signature` (method, constructor, factory, getter,
|
|
644
|
+
// setter, operator, `async`), and `static` is an anonymous direct child of
|
|
645
|
+
// that signature, ahead of the inner `*_signature` node. Detection is the
|
|
646
|
+
// shared `hasKeyword` on child TEXT, never `child.type === 'static'`, which
|
|
647
|
+
// a grammar bump silently breaks — the same rule TypeScript's
|
|
648
|
+
// `isStaticMethodThis` follows.
|
|
649
|
+
//
|
|
650
|
+
// A body whose signature cannot be read at all (a null or unexpected
|
|
651
|
+
// previous sibling — parse recovery) DECLINES to bind: staticness is
|
|
652
|
+
// undecidable there, and a missed field type costs an edge while a wrong one
|
|
653
|
+
// destroys a correct binding.
|
|
654
|
+
const signature = member.previousNamedSibling;
|
|
655
|
+
if (signature === null || signature.type !== 'method_signature')
|
|
656
|
+
continue;
|
|
657
|
+
if ((0, helpers_js_1.hasKeyword)(signature, 'static'))
|
|
658
|
+
continue;
|
|
659
|
+
// Still lazy per assignment, but the memo is now FILE-wide and shared with
|
|
660
|
+
// Pass A's read-side mask, which asks the same question of the same body.
|
|
661
|
+
// The laziness that used to matter here (87-100% of eagerly built sets were
|
|
662
|
+
// discarded, ~15% of total Dart emission) no longer buys much for a class
|
|
663
|
+
// that declares fields — Pass A has already forced those bodies — so this
|
|
664
|
+
// reads the memo rather than paying a second walk. It still short-circuits
|
|
665
|
+
// for a body whose class declares no fields, since `fields.size === 0`
|
|
666
|
+
// returned above before either pass touched it.
|
|
667
|
+
//
|
|
668
|
+
// Not visible to `bench/scope-capture`, which is a RATIO gate — this work is
|
|
669
|
+
// linear, so a constant factor leaves the ratio at 1.0.
|
|
670
|
+
const shadowsOf = () => dartBodyShadows(member, memo);
|
|
671
|
+
(0, ast_helpers_js_1.walkNamedTree)(member, (node) => {
|
|
672
|
+
if (node.type !== 'assignment_expression')
|
|
673
|
+
return;
|
|
674
|
+
const target = node.namedChild(0);
|
|
675
|
+
if (target === null || target.type !== 'assignable_expression')
|
|
676
|
+
return;
|
|
677
|
+
const first = target.namedChild(0);
|
|
678
|
+
if (first === null)
|
|
679
|
+
return;
|
|
680
|
+
let fieldNameNode = null;
|
|
681
|
+
if (first.type === 'identifier' && target.namedChildCount === 1) {
|
|
682
|
+
// Bare `r = …`: a field only when declared here and not shadowed. The
|
|
683
|
+
// `fields` test runs FIRST so the shadow set is only ever built for a
|
|
684
|
+
// name the class actually declares.
|
|
685
|
+
if (!fields.has(first.text) || shadowsOf().has(first.text))
|
|
686
|
+
return;
|
|
687
|
+
fieldNameNode = first;
|
|
688
|
+
}
|
|
689
|
+
else if (first.type === 'this') {
|
|
690
|
+
const selector = target.namedChild(1);
|
|
691
|
+
if (selector === null || selector.type !== 'unconditional_assignable_selector')
|
|
692
|
+
return;
|
|
693
|
+
const nameNode = selector.namedChild(0);
|
|
694
|
+
if (nameNode === null || nameNode.type !== 'identifier')
|
|
695
|
+
return;
|
|
696
|
+
fieldNameNode = nameNode;
|
|
697
|
+
}
|
|
698
|
+
else {
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
701
|
+
if (fieldNameNode === null)
|
|
702
|
+
return;
|
|
703
|
+
// RHS must be a direct construction; anything else is left alone rather
|
|
704
|
+
// than guessed at.
|
|
705
|
+
const callee = node.namedChild(1);
|
|
706
|
+
if (!isDirectConstruction(callee))
|
|
707
|
+
return;
|
|
708
|
+
out.push({
|
|
709
|
+
'@type-binding.constructor': (0, ast_helpers_js_1.nodeToCapture)('@type-binding.constructor', node),
|
|
710
|
+
'@type-binding.dart-field': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.dart-field', fieldNameNode, '1'),
|
|
711
|
+
'@type-binding.name': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.name', fieldNameNode, fieldNameNode.text),
|
|
712
|
+
'@type-binding.type': (0, ast_helpers_js_1.syntheticCapture)('@type-binding.type', callee, callee.text),
|
|
713
|
+
});
|
|
714
|
+
});
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
const nodeSpanKey = (node) => `${node.startIndex}:${node.endIndex}`;
|
|
718
|
+
/**
|
|
719
|
+
* The names a `class_body` declares as INSTANCE-or-static fields, from
|
|
720
|
+
* `declaration(… initialized_identifier_list … initialized_identifier)` — the
|
|
721
|
+
* shape every stored Dart field takes, annotated or not.
|
|
722
|
+
*/
|
|
723
|
+
function dartClassFieldNames(classBody, memo) {
|
|
724
|
+
const key = nodeSpanKey(classBody);
|
|
725
|
+
const cached = memo.fieldsByClassBody.get(key);
|
|
726
|
+
if (cached !== undefined)
|
|
727
|
+
return cached;
|
|
728
|
+
const fields = new Set();
|
|
729
|
+
for (const member of classBody.namedChildren) {
|
|
730
|
+
if (member === null || member.type !== 'declaration')
|
|
731
|
+
continue;
|
|
732
|
+
const list = (0, ast_helpers_js_1.findChild)(member, 'initialized_identifier_list');
|
|
733
|
+
if (list === null)
|
|
734
|
+
continue;
|
|
735
|
+
for (const init of list.namedChildren) {
|
|
736
|
+
if (init === null || init.type !== 'initialized_identifier')
|
|
737
|
+
continue;
|
|
738
|
+
const nameNode = init.namedChild(0);
|
|
739
|
+
if (nameNode !== null && nameNode.type === 'identifier')
|
|
740
|
+
fields.add(nameNode.text);
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
memo.fieldsByClassBody.set(key, fields);
|
|
744
|
+
return fields;
|
|
745
|
+
}
|
|
746
|
+
function dartBodyShadows(bodyNode, memo) {
|
|
747
|
+
const key = nodeSpanKey(bodyNode);
|
|
748
|
+
const cached = memo.shadowsByBody.get(key);
|
|
749
|
+
if (cached !== undefined)
|
|
750
|
+
return cached;
|
|
751
|
+
const shadows = collectDartBodyShadows(bodyNode);
|
|
752
|
+
memo.shadowsByBody.set(key, shadows);
|
|
753
|
+
return shadows;
|
|
754
|
+
}
|
|
755
|
+
/**
|
|
756
|
+
* The READ half of the bare-name field discipline: the field names a member
|
|
757
|
+
* body REBINDS, published on that member's Function scope as
|
|
758
|
+
* `Scope.ownsReceivers` (#2701) so the receiver walk stops there instead of
|
|
759
|
+
* reaching the Class scope (#2807 review).
|
|
760
|
+
*
|
|
761
|
+
* `emitDartFieldAssignmentBindings` above declines to WRITE a binding for a name
|
|
762
|
+
* the body shadows, but the shadow set gated writes only. A bare-name READ of a
|
|
763
|
+
* shadowing binder the resolver cannot type — `for (final conn in xs) {
|
|
764
|
+
* conn.inner(); }`, where the element type of `xs` is not modelled — therefore
|
|
765
|
+
* walked straight past the local and hit the class field binding this same
|
|
766
|
+
* feature mints, resolving `conn.inner()` to the CONSTRUCTOR's type. That turns
|
|
767
|
+
* "no edge" into a WRONG edge, the one failure mode
|
|
768
|
+
* `scope-resolution/passes/compound-receiver.ts` says must never happen, and it
|
|
769
|
+
* was introduced by the write side rather than pre-existing: delete the
|
|
770
|
+
* constructor and the same read emits nothing.
|
|
771
|
+
*
|
|
772
|
+
* `ownsReceivers` is the right primitive because the walk consults
|
|
773
|
+
* `typeBindings` FIRST at every scope (`scope/walkers.ts`) and only then honours
|
|
774
|
+
* the mask. A shadow the resolver CAN type still wins — an annotated parameter
|
|
775
|
+
* `void probe(Beta conn)` keeps `Beta`, because
|
|
776
|
+
* `synthesizeDartSignatureBindings` anchors parameter bindings on this same
|
|
777
|
+
* body node, so they land on this same Function scope. The mask only fires
|
|
778
|
+
* where the alternative was a fabricated type.
|
|
779
|
+
*
|
|
780
|
+
* ── SCOPE OF THE MASK, AND ITS ACCEPTED COSTS ────────────────────────────────
|
|
781
|
+
*
|
|
782
|
+
* `shadows ∩ fields`, and nothing wider. Three consequences are taken knowingly
|
|
783
|
+
* rather than hidden:
|
|
784
|
+
*
|
|
785
|
+
* 1. NOT every locally bound name is masked — only ones the enclosing class
|
|
786
|
+
* also declares as a field. A library-level `var logger = Logger();`
|
|
787
|
+
* shadowed by a loop variable of the same name still resolves against the
|
|
788
|
+
* library binding and can still produce the wrong edge. That is the general
|
|
789
|
+
* form of the same defect and arguably the more correct fix, but it changes
|
|
790
|
+
* resolution for code this feature never touched; it is recorded here as a
|
|
791
|
+
* known limitation rather than implemented.
|
|
792
|
+
* 2. The mask is BODY-WIDE, exactly as `collectDartBodyShadows` is on the write
|
|
793
|
+
* side. A member that binds `conn` anywhere — a nested closure, one `case`
|
|
794
|
+
* arm — masks `conn` for the whole member, so a read of the genuine field
|
|
795
|
+
* elsewhere in that member loses its edge. Deliberate symmetry: the write
|
|
796
|
+
* side already declines body-wide, and losing an edge is the error this
|
|
797
|
+
* whole line of work chooses over inventing one.
|
|
798
|
+
* 3. `fields` is EVERY field the class declares, not only the ones the
|
|
799
|
+
* constructor-write feature types. An ANNOTATED field shadowed by a binder
|
|
800
|
+
* is masked too, so this reaches resolution that predates #2807 — and it is
|
|
801
|
+
* meant to: which name a body's bare read refers to is a fact about Dart, not
|
|
802
|
+
* about how the field acquired its type. `mixin` bodies are reached for the
|
|
803
|
+
* same reason (the grammar gives a mixin a `class_body` as well), even though
|
|
804
|
+
* `emitDartFieldAssignmentBindings` mints nothing for them. `extension`
|
|
805
|
+
* bodies are a different node (`extension_body`) and are left alone.
|
|
806
|
+
*
|
|
807
|
+
* Returns `undefined` — not an empty marker — when nothing is masked, so the
|
|
808
|
+
* emitted capture set is unchanged for every body that does not shadow a field.
|
|
809
|
+
* Names are sorted so the capture text (and every fingerprint over it) is
|
|
810
|
+
* order-stable.
|
|
811
|
+
*/
|
|
812
|
+
function dartShadowedFieldsCapture(bodyNode, memo) {
|
|
813
|
+
// Only a CLASS-MEMBER body can shadow a field: `function_body` whose parent is
|
|
814
|
+
// the `class_body`. A closure's `function_expression_body` and a top-level
|
|
815
|
+
// function are both excluded, and neither needs the mask — a closure's binders
|
|
816
|
+
// are already in its enclosing member's body-wide shadow set, and the walk
|
|
817
|
+
// passes through the enclosing member's Function scope on its way out.
|
|
818
|
+
if (bodyNode.type !== 'function_body')
|
|
819
|
+
return undefined;
|
|
820
|
+
const classBody = bodyNode.parent;
|
|
821
|
+
if (classBody === null || classBody.type !== 'class_body')
|
|
822
|
+
return undefined;
|
|
823
|
+
const fields = dartClassFieldNames(classBody, memo);
|
|
824
|
+
if (fields.size === 0)
|
|
825
|
+
return undefined;
|
|
826
|
+
const shadows = dartBodyShadows(bodyNode, memo);
|
|
827
|
+
if (shadows.size === 0)
|
|
828
|
+
return undefined;
|
|
829
|
+
const masked = [];
|
|
830
|
+
for (const name of fields) {
|
|
831
|
+
if (shadows.has(name))
|
|
832
|
+
masked.push(name);
|
|
833
|
+
}
|
|
834
|
+
if (masked.length === 0)
|
|
835
|
+
return undefined;
|
|
836
|
+
masked.sort();
|
|
837
|
+
return (0, ast_helpers_js_1.syntheticCapture)('@receiver-owner.shadowed-fields', bodyNode, JSON.stringify(masked));
|
|
838
|
+
}
|
|
839
|
+
/**
|
|
840
|
+
* Every name BOUND by one class-member body — the shadow set the bare-name
|
|
841
|
+
* branch of `emitDartFieldAssignmentBindings` tests against.
|
|
842
|
+
*
|
|
843
|
+
* A local `var` is only ONE of Dart's binders, and a bare `r = Outer()` writes
|
|
844
|
+
* whichever binder wins, so a set built from local declarations alone made a
|
|
845
|
+
* write to any OTHER binder look like a field write. `void reset(Alpha r) { r =
|
|
846
|
+
* Alpha(); }` in a class with a field `r` retyped the FIELD to `Alpha` —
|
|
847
|
+
* fabricating an edge and displacing the type the constructor had correctly
|
|
848
|
+
* given it. Formal parameters are the sharpest case because they are not even
|
|
849
|
+
* inside the body: `function_body` is a SIBLING of the `method_signature` that
|
|
850
|
+
* carries them, so no walk of the body can ever see one.
|
|
851
|
+
*
|
|
852
|
+
* Dart 3 patterns are the SAME defect a second time: `var (r, n) = …;`,
|
|
853
|
+
* `if (o case Beta r)`, `case Beta r:`, `for (var (r, _) in xs)`, list / map /
|
|
854
|
+
* object / rest / cast / null-check / null-assert patterns and pattern
|
|
855
|
+
* assignments all bind `r` through node types no earlier list named, so each of
|
|
856
|
+
* them let a write retype the field. `addDartBinderName` now enumerates the
|
|
857
|
+
* pattern family from the grammar rather than from reported shapes.
|
|
858
|
+
*
|
|
859
|
+
* Deliberately over-approximate in the shadow direction. The set is body-wide
|
|
860
|
+
* (a binder in a nested closure, a `case` arm or a collection-literal element
|
|
861
|
+
* shadows for the whole body), a parameter shape whose name cannot be read
|
|
862
|
+
* contributes nothing rather than being guessed at, and a bare name inside a
|
|
863
|
+
* pattern shadows whether it binds or merely references a constant. All err
|
|
864
|
+
* toward DECLINING to bind, which is the right error: a missed field type costs
|
|
865
|
+
* an edge, a wrong one produces an edge to the wrong class and destroys a
|
|
866
|
+
* correct binding — the failure mode this whole line of work exists to avoid
|
|
867
|
+
* (see `scope-resolution/passes/compound-receiver.ts`).
|
|
868
|
+
*/
|
|
869
|
+
function collectDartBodyShadows(bodyNode) {
|
|
870
|
+
const shadows = new Set();
|
|
871
|
+
// The enclosing function's own formal parameters live OUTSIDE the body, on
|
|
872
|
+
// the `method_signature` sibling that precedes it — the shape every class
|
|
873
|
+
// member takes (method, constructor, factory, static, getter, setter,
|
|
874
|
+
// operator, `async`/`async*`).
|
|
875
|
+
const signature = bodyNode.previousNamedSibling;
|
|
876
|
+
if (signature !== null && signature.type === 'method_signature') {
|
|
877
|
+
(0, ast_helpers_js_1.walkNamedTree)(signature, (n) => addDartBinderName(n, shadows));
|
|
878
|
+
}
|
|
879
|
+
(0, ast_helpers_js_1.walkNamedTree)(bodyNode, (n) => addDartBinderName(n, shadows));
|
|
880
|
+
return shadows;
|
|
881
|
+
}
|
|
882
|
+
/**
|
|
883
|
+
* Record the name `node` binds, if it binds one.
|
|
884
|
+
*
|
|
885
|
+
* The `case` list is the whole point of this function and the reason it is
|
|
886
|
+
* separate: an INCOMPLETE list of binder forms is the exact defect this file has
|
|
887
|
+
* now shipped twice (formal parameters, then every Dart 3 pattern). It is
|
|
888
|
+
* enumerated against `vendor/tree-sitter-dart/grammar.js`, not against the
|
|
889
|
+
* shapes a bug report happened to carry.
|
|
890
|
+
*/
|
|
891
|
+
function addDartBinderName(node, out) {
|
|
892
|
+
switch (node.type) {
|
|
893
|
+
// `var s;`, `final r = 1;`, and the FIRST declarator of `var a = 1, b = 2;`.
|
|
894
|
+
// `for_loop_parts` carries the for-IN variable on the same `name` field
|
|
895
|
+
// (`for (var r in xs)`); the C-style form instead nests a
|
|
896
|
+
// `local_variable_declaration` the walk reaches on its own.
|
|
897
|
+
case 'initialized_variable_definition':
|
|
898
|
+
case 'for_loop_parts': {
|
|
899
|
+
const nameNode = node.childForFieldName('name');
|
|
900
|
+
if (nameNode !== null)
|
|
901
|
+
out.add(nameNode.text);
|
|
902
|
+
return;
|
|
903
|
+
}
|
|
904
|
+
// Formal parameters — of the enclosing member, of a closure
|
|
905
|
+
// (`function_expression`), and of a nested `local_function_declaration`.
|
|
906
|
+
case 'formal_parameter': {
|
|
907
|
+
const name = dartParameterName(node);
|
|
908
|
+
if (name !== null)
|
|
909
|
+
out.add(name);
|
|
910
|
+
return;
|
|
911
|
+
}
|
|
912
|
+
// `on E catch (e, stack)` — every identifier in the list is a binding.
|
|
913
|
+
case 'catch_parameters': {
|
|
914
|
+
for (const child of node.namedChildren) {
|
|
915
|
+
if (child !== null && child.type === 'identifier')
|
|
916
|
+
out.add(child.text);
|
|
917
|
+
}
|
|
918
|
+
return;
|
|
919
|
+
}
|
|
920
|
+
// Second and later declarators of `var a = 1, b = 2;` — fieldless, so the
|
|
921
|
+
// name is the first named child. (A class field is this node type too, but
|
|
922
|
+
// only ever under `initialized_identifier_list`, which no body contains.)
|
|
923
|
+
case 'initialized_identifier': {
|
|
924
|
+
const first = node.namedChild(0);
|
|
925
|
+
if (first !== null && first.type === 'identifier')
|
|
926
|
+
out.add(first.text);
|
|
927
|
+
return;
|
|
928
|
+
}
|
|
929
|
+
// ── Dart 3 patterns ──────────────────────────────────────────────────────
|
|
930
|
+
//
|
|
931
|
+
// EVERY pattern node the grammar emits, and every one of them takes its
|
|
932
|
+
// DIRECT `identifier` children. The grammar rules that would carry a binder
|
|
933
|
+
// are `_pattern_field`, `_map_pattern_entry`, `_list_pattern_element`,
|
|
934
|
+
// `_parenthesized_pattern`, `_outer_pattern`, `_guarded_pattern` and the
|
|
935
|
+
// logical/relational tiers — ALL hidden (`_`-prefixed), so they emit no node
|
|
936
|
+
// of their own and inline their children onto whichever visible pattern node
|
|
937
|
+
// encloses them. Reading direct children is therefore what actually sees a
|
|
938
|
+
// binder; there is no field to ask for (`variable_pattern`,
|
|
939
|
+
// `pattern_variable_declaration` and `constant_pattern` declare none).
|
|
940
|
+
//
|
|
941
|
+
// The first two are where a binder truly lands, and are alone sufficient:
|
|
942
|
+
// `variable_pattern` — `Beta s` / `final s` / `var s`.
|
|
943
|
+
// `constant_pattern` — a BARE name (`(s, n)`, `[s, t]`, `{'k': s}`,
|
|
944
|
+
// `Point(:s)`, `...s`, `(s)`). Dart itself decides bare-name-binds-vs-
|
|
945
|
+
// references-a-constant from the enclosing `final`/`var`, and
|
|
946
|
+
// tree-sitter gives both the same node, so `case kLimit:` shadows too.
|
|
947
|
+
// Over-shadowing a constant reference costs an edge; the other
|
|
948
|
+
// direction fabricates one.
|
|
949
|
+
// The containers after them are DEFENCE, not routing — the walk reaches
|
|
950
|
+
// nested patterns on its own. They matter because the hidden `_pattern_field`
|
|
951
|
+
// already drops a NON-binder label identifier straight onto `record_pattern`
|
|
952
|
+
// / `object_pattern` (and a key onto `map_pattern`), which is proof that this
|
|
953
|
+
// grammar inlines identifiers onto containers. If a grammar revision ever
|
|
954
|
+
// inlines a real binder the same way, it is shadowed here on arrival instead
|
|
955
|
+
// of becoming the third instance of this bug.
|
|
956
|
+
//
|
|
957
|
+
// DELIBERATELY EXCLUDED — `pattern_variable_declaration`, `pattern_assignment`
|
|
958
|
+
// and `for_loop_parts` hold the pattern and the `=`/`in` RHS at the SAME
|
|
959
|
+
// child level (`var [s, t] = xs` → `identifier xs` is a direct child), so
|
|
960
|
+
// taking their direct identifiers would shadow the SOURCE expression's name,
|
|
961
|
+
// which binds nothing. Their pattern child is a case below. Also excluded:
|
|
962
|
+
// `type_identifier` (never an `identifier`, so `Beta` in `Beta s` and `Point`
|
|
963
|
+
// in `Point(…)` cannot be mistaken for binders), `qualified` inside a
|
|
964
|
+
// `constant_pattern` (`Colors.red` nests one level deeper — a qualified name
|
|
965
|
+
// is always a constant reference), and relational/equality operands
|
|
966
|
+
// (`case > kLimit`), which the hidden tier drops onto the enclosing
|
|
967
|
+
// STATEMENT rather than any pattern node.
|
|
968
|
+
case 'variable_pattern':
|
|
969
|
+
case 'constant_pattern':
|
|
970
|
+
case 'record_pattern':
|
|
971
|
+
case 'list_pattern':
|
|
972
|
+
case 'map_pattern':
|
|
973
|
+
case 'object_pattern':
|
|
974
|
+
case 'rest_pattern':
|
|
975
|
+
case 'cast_pattern':
|
|
976
|
+
case 'null_check_pattern':
|
|
977
|
+
case 'null_assert_pattern': {
|
|
978
|
+
for (const child of node.namedChildren) {
|
|
979
|
+
if (child !== null && child.type === 'identifier')
|
|
980
|
+
out.add(child.text);
|
|
981
|
+
}
|
|
982
|
+
return;
|
|
983
|
+
}
|
|
984
|
+
default:
|
|
985
|
+
return;
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
/** The name a `formal_parameter` binds, across every shape the grammar gives it. */
|
|
989
|
+
function dartParameterName(param) {
|
|
990
|
+
// `Alpha r`, `final Alpha r`, `void Function(int) r`, `{required Beta r}`,
|
|
991
|
+
// `[Delta r]` — all carry an explicit `name` field.
|
|
992
|
+
const named = param.childForFieldName('name');
|
|
993
|
+
if (named !== null)
|
|
994
|
+
return named.text;
|
|
995
|
+
const only = param.namedChild(0);
|
|
996
|
+
if (only === null)
|
|
997
|
+
return null;
|
|
998
|
+
// An untyped closure parameter (`(r) { … }`) is a bare identifier with no
|
|
999
|
+
// field to read it from.
|
|
1000
|
+
if (only.type === 'identifier')
|
|
1001
|
+
return only.text;
|
|
1002
|
+
// `this.r` / `super.r` bind a parameter NAMED `r` that is initialized from
|
|
1003
|
+
// the field — a later bare `r = …` writes that parameter, not the field, so
|
|
1004
|
+
// these shadow exactly like any other.
|
|
1005
|
+
if (only.type === 'constructor_param' || only.type === 'super_formal_parameter') {
|
|
1006
|
+
for (let i = only.namedChildCount - 1; i >= 0; i--) {
|
|
1007
|
+
const child = only.namedChild(i);
|
|
1008
|
+
if (child !== null && child.type === 'identifier')
|
|
1009
|
+
return child.text;
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
return null;
|
|
1013
|
+
}
|
|
1014
|
+
function emitHeritage(classNode, out) {
|
|
1015
|
+
const nameNode = classNode.childForFieldName('name');
|
|
1016
|
+
if (nameNode === null)
|
|
1017
|
+
return;
|
|
1018
|
+
const className = nameNode.text;
|
|
1019
|
+
const superclass = classNode.childForFieldName('superclass');
|
|
1020
|
+
if (superclass !== null) {
|
|
1021
|
+
// `extends Base` — the direct `type_identifier` child of `superclass`
|
|
1022
|
+
// (the `mixins` node, if present, nests separately). Routed through the
|
|
1023
|
+
// generic inherits pre-pass → EXTENDS (the base resolves to a class).
|
|
1024
|
+
for (let i = 0; i < superclass.namedChildCount; i++) {
|
|
1025
|
+
const c = superclass.namedChild(i);
|
|
1026
|
+
if (c !== null && c.type === 'type_identifier') {
|
|
1027
|
+
out.push({
|
|
1028
|
+
'@reference.inherits': (0, ast_helpers_js_1.nodeToCapture)('@reference.inherits', c),
|
|
1029
|
+
'@reference.name': (0, ast_helpers_js_1.nodeToCapture)('@reference.name', c),
|
|
1030
|
+
});
|
|
1031
|
+
break;
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
// `with M1, M2` — mixin application → IMPLEMENTS (Dart mixin dispatch).
|
|
1035
|
+
const mixins = (0, ast_helpers_js_1.findChild)(superclass, 'mixins');
|
|
1036
|
+
if (mixins !== null) {
|
|
1037
|
+
emitHeritageMarkers(mixins, 'with', className, out);
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
// `implements I1, I2` — Dart `implements <class>` is IMPLEMENTS regardless
|
|
1041
|
+
// of the target's symbol kind, so it cannot use the target-kind pre-pass.
|
|
1042
|
+
const interfaces = classNode.childForFieldName('interfaces');
|
|
1043
|
+
if (interfaces !== null) {
|
|
1044
|
+
emitHeritageMarkers(interfaces, 'implements', className, out);
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
function emitExtensionImplementsHeritage(extensionNode, out) {
|
|
1048
|
+
const nameNode = extensionNode.childForFieldName('name');
|
|
1049
|
+
if (nameNode === null)
|
|
1050
|
+
return;
|
|
1051
|
+
const bodyStart = extensionNode.text.indexOf('{');
|
|
1052
|
+
const header = bodyStart === -1 ? extensionNode.text : extensionNode.text.slice(0, bodyStart);
|
|
1053
|
+
const implementsIndex = header.indexOf('implements');
|
|
1054
|
+
if (implementsIndex === -1)
|
|
1055
|
+
return;
|
|
1056
|
+
const className = nameNode.text;
|
|
1057
|
+
const interfaces = header.slice(implementsIndex + 'implements'.length);
|
|
1058
|
+
for (const rawInterface of splitTopLevelCommaList(interfaces)) {
|
|
1059
|
+
const target = /^[ \t]*([A-Za-z_$][A-Za-z0-9_$]*)/.exec(rawInterface)?.[1];
|
|
1060
|
+
if (target === undefined)
|
|
1061
|
+
continue;
|
|
1062
|
+
const payload = (0, heritage_marker_js_1.encodeMarker)('heritage', ['implements', target, className]);
|
|
1063
|
+
out.push({ '@import.heritage': (0, ast_helpers_js_1.syntheticCapture)('@import.heritage', nameNode, payload) });
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
function splitTopLevelCommaList(text) {
|
|
1067
|
+
const parts = [];
|
|
1068
|
+
let start = 0;
|
|
1069
|
+
let angleDepth = 0;
|
|
1070
|
+
for (let i = 0; i < text.length; i++) {
|
|
1071
|
+
const ch = text[i];
|
|
1072
|
+
if (ch === '<') {
|
|
1073
|
+
angleDepth++;
|
|
1074
|
+
continue;
|
|
1075
|
+
}
|
|
1076
|
+
if (ch === '>' && angleDepth > 0) {
|
|
1077
|
+
angleDepth--;
|
|
1078
|
+
continue;
|
|
1079
|
+
}
|
|
1080
|
+
if (ch === ',' && angleDepth === 0) {
|
|
1081
|
+
parts.push(text.slice(start, i));
|
|
1082
|
+
start = i + 1;
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
parts.push(text.slice(start));
|
|
1086
|
+
return parts;
|
|
1087
|
+
}
|
|
1088
|
+
function emitHeritageMarkers(container, kind, className, out) {
|
|
1089
|
+
for (let i = 0; i < container.namedChildCount; i++) {
|
|
1090
|
+
const c = container.namedChild(i);
|
|
1091
|
+
if (c === null || c.type !== 'type_identifier')
|
|
1092
|
+
continue;
|
|
1093
|
+
const payload = (0, heritage_marker_js_1.encodeMarker)('heritage', [kind, c.text, className]);
|
|
1094
|
+
out.push({ '@import.heritage': (0, ast_helpers_js_1.syntheticCapture)('@import.heritage', c, payload) });
|
|
1095
|
+
}
|
|
1096
|
+
}
|