cgraphx 2.0.1 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.claude-template/FLOW-MAP.md +7 -5
- package/dist/.claude-template/commands/end.md +1 -1
- package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +2 -1
- package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +4 -2
- package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +5 -2
- package/dist/.claude-template/skills/iboc-check/SKILL.md +116 -0
- package/dist/.claude-template/skills/iboc-check/filler-prompt.md +75 -0
- package/dist/.claude-template/skills/implementation/SKILL.md +7 -0
- package/dist/.claude-template/skills/init-project-guides/SKILL.md +1 -1
- package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
- package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
- package/dist/.claude-template/skills/write-api/assets/template-request.bru +3 -3
- package/dist/.claude-template/skills/write-api/references/bru-format.md +6 -6
- package/dist/.claude-template/skills/write-delivery-guide/SKILL.md +97 -0
- package/dist/.claude-template/skills/write-delivery-guide/template-change-type.md +120 -0
- package/dist/.claude-template/skills/write-delivery-guide/template-multi-role-flow.md +148 -0
- package/dist/.claude-template/skills/write-unit-test-code/SKILL.md +23 -6
- package/dist/core/code/engine/cli/analyze-config.js +320 -0
- package/dist/core/code/engine/cli/analyze.js +1086 -0
- package/dist/core/code/engine/cli/cli-message.js +83 -0
- package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
- package/dist/core/code/engine/cli/embedding-dims.js +43 -0
- package/dist/core/code/engine/cli/format-elapsed.js +12 -0
- package/dist/core/code/engine/cli/help-i18n.js +144 -0
- package/dist/core/code/engine/cli/i18n/en.js +110 -0
- package/dist/core/code/engine/cli/i18n/index.js +47 -0
- package/dist/core/code/engine/cli/i18n/resources.js +9 -0
- package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
- package/dist/core/code/engine/cli/lazy-action.js +67 -0
- package/dist/core/code/engine/cli/optional-grammars.js +136 -0
- package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
- package/dist/core/code/engine/cli/status.js +156 -0
- package/dist/core/code/engine/cli/tool.js +384 -0
- package/dist/core/code/engine/config/ignore-service.js +511 -0
- package/dist/core/code/engine/config/supported-languages.js +17 -0
- package/dist/core/code/engine/core/analysis-features.js +64 -0
- package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
- package/dist/core/code/engine/core/git-staleness.js +180 -0
- package/dist/core/code/engine/core/graph/graph.js +180 -0
- package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
- package/dist/core/code/engine/core/graph/types.js +2 -0
- package/dist/core/code/engine/core/index-freshness.js +12 -0
- package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
- package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
- package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
- package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
- package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
- package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
- package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
- package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
- package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
- package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
- package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
- package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
- package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
- package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
- package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
- package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
- package/dist/core/code/engine/core/ingestion/constants.js +26 -0
- package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
- package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
- package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
- package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
- package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
- package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
- package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
- package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
- package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
- package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
- package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
- package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
- package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
- package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
- package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
- package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
- package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
- package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
- package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
- package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
- package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
- package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
- package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
- package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
- package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
- package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
- package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
- package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
- package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
- package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
- package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
- package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
- package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
- package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
- package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
- package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
- package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
- package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
- package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
- package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
- package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
- package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
- package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
- package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
- package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
- package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
- package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
- package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
- package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
- package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
- package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
- package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
- package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
- package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
- package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
- package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
- package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
- package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
- package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
- package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
- package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
- package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
- package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
- package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
- package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
- package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
- package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
- package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
- package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
- package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
- package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
- package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
- package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
- package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
- package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
- package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
- package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
- package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
- package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
- package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
- package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
- package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
- package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
- package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
- package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
- package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
- package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
- package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
- package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
- package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
- package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
- package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
- package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
- package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
- package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
- package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
- package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
- package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
- package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
- package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
- package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
- package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
- package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
- package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
- package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
- package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
- package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
- package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
- package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
- package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
- package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
- package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
- package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
- package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
- package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
- package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
- package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
- package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
- package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
- package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
- package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
- package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
- package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
- package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
- package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
- package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
- package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
- package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
- package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
- package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
- package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
- package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
- package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
- package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
- package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
- package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
- package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
- package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
- package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
- package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
- package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
- package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
- package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
- package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
- package/dist/core/code/engine/core/lbug/native-check.js +435 -0
- package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
- package/dist/core/code/engine/core/lbug/query-params.js +25 -0
- package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
- package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
- package/dist/core/code/engine/core/lbug/schema.js +771 -0
- package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
- package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
- package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
- package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
- package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
- package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
- package/dist/core/code/engine/core/logger.js +339 -0
- package/dist/core/code/engine/core/platform/capabilities.js +91 -0
- package/dist/core/code/engine/core/run-analyze.js +1098 -0
- package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
- package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
- package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
- package/dist/core/code/engine/lib/utils.js +121 -0
- package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
- package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
- package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
- package/dist/core/code/engine/mcp/local/limits.js +15 -0
- package/dist/core/code/engine/mcp/local/line-display.js +6 -0
- package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
- package/dist/core/code/engine/storage/branch-index.js +72 -0
- package/dist/core/code/engine/storage/file-hash.js +95 -0
- package/dist/core/code/engine/storage/fs-atomic.js +34 -0
- package/dist/core/code/engine/storage/git.js +555 -0
- package/dist/core/code/engine/storage/index-lock.js +664 -0
- package/dist/core/code/engine/storage/parse-cache.js +650 -0
- package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
- package/dist/core/code/engine/storage/repo-manager.js +1061 -0
- package/dist/core/code/engine/storage/scope-index-store.js +247 -0
- package/dist/core/code/engine/types/pipeline.js +2 -0
- package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
- package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
- package/dist/core/code/shared/graph/types.js +8 -0
- package/dist/core/code/shared/index.js +105 -0
- package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
- package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
- package/dist/core/code/shared/integrations/retry.js +70 -0
- package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
- package/dist/core/code/shared/language-detection.js +162 -0
- package/dist/core/code/shared/languages.js +27 -0
- package/dist/core/code/shared/lbug/schema-constants.js +98 -0
- package/dist/core/code/shared/mro-strategy.js +2 -0
- package/dist/core/code/shared/pipeline.js +5 -0
- package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
- package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
- package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
- package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
- package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
- package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
- package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
- package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
- package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
- package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
- package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
- package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
- package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
- package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
- package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
- package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
- package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
- package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
- package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
- package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
- package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
- package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
- package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
- package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
- package/dist/core/code/shared/scope-resolution/types.js +25 -0
- package/dist/core/code/shared/test-helpers.js +17 -0
- package/dist/core/code/vendor/leiden/index.cjs +355 -0
- package/dist/core/code/vendor/leiden/utils.cjs +419 -0
- package/dist/core/features/scanner.d.ts +2 -0
- package/dist/core/features/scanner.d.ts.map +1 -1
- package/dist/core/features/scanner.js +27 -6
- package/dist/core/features/scanner.js.map +1 -1
- package/dist/core/timeline/cli.d.ts.map +1 -1
- package/dist/core/timeline/cli.js +13 -6
- package/dist/core/timeline/cli.js.map +1 -1
- package/dist/core/timeline/debris.d.ts +20 -0
- package/dist/core/timeline/debris.d.ts.map +1 -0
- package/dist/core/timeline/debris.js +124 -0
- package/dist/core/timeline/debris.js.map +1 -0
- package/dist/core/timeline/hook-runner.d.ts.map +1 -1
- package/dist/core/timeline/hook-runner.js +3 -1
- package/dist/core/timeline/hook-runner.js.map +1 -1
- package/dist/core/timeline/hooks.d.ts.map +1 -1
- package/dist/core/timeline/hooks.js +13 -5
- package/dist/core/timeline/hooks.js.map +1 -1
- package/dist/core/timeline/installer.d.ts +2 -0
- package/dist/core/timeline/installer.d.ts.map +1 -1
- package/dist/core/timeline/installer.js +12 -0
- package/dist/core/timeline/installer.js.map +1 -1
- package/dist/core/timeline/project-root.d.ts +21 -0
- package/dist/core/timeline/project-root.d.ts.map +1 -0
- package/dist/core/timeline/project-root.js +83 -0
- package/dist/core/timeline/project-root.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NO_IPDOM = void 0;
|
|
4
|
+
exports.computePostDominators = computePostDominators;
|
|
5
|
+
exports.postDominates = postDominates;
|
|
6
|
+
exports.isExitReachableFromAllBlocks = isExitReachableFromAllBlocks;
|
|
7
|
+
/**
|
|
8
|
+
* Sentinel `ipdom` value: the block has no immediate post-dominator. True for
|
|
9
|
+
* the EXIT block itself (the reverse-CFG root) and for any block that cannot
|
|
10
|
+
* reach EXIT. Chosen as -1 so the {@link postDominates} climb terminates
|
|
11
|
+
* naturally instead of self-looping on the root.
|
|
12
|
+
*/
|
|
13
|
+
exports.NO_IPDOM = -1;
|
|
14
|
+
/**
|
|
15
|
+
* Compute the immediate-post-dominator tree for one function's CFG. See the
|
|
16
|
+
* module doc for the purity/determinism contract and EXIT-root assumptions.
|
|
17
|
+
*/
|
|
18
|
+
function computePostDominators(cfg) {
|
|
19
|
+
const n = cfg.blocks.length;
|
|
20
|
+
const exit = cfg.exitIndex;
|
|
21
|
+
if (n === 0 || exit < 0 || exit >= n) {
|
|
22
|
+
return { ipdom: new Array(n).fill(exports.NO_IPDOM) };
|
|
23
|
+
}
|
|
24
|
+
// Forward adjacency (sorted for deterministic intersect order). The reverse
|
|
25
|
+
// CFG, on which we compute dominators, flips these: a node's reverse-CFG
|
|
26
|
+
// successors are its CFG predecessors, and its reverse-CFG predecessors
|
|
27
|
+
// (the "preds" CHK intersects over) are its CFG successors.
|
|
28
|
+
const cfgPreds = Array.from({ length: n }, () => []);
|
|
29
|
+
const cfgSuccs = Array.from({ length: n }, () => []);
|
|
30
|
+
for (const e of cfg.edges) {
|
|
31
|
+
if (e.from < 0 || e.from >= n || e.to < 0 || e.to >= n)
|
|
32
|
+
continue;
|
|
33
|
+
cfgSuccs[e.from].push(e.to);
|
|
34
|
+
cfgPreds[e.to].push(e.from);
|
|
35
|
+
}
|
|
36
|
+
for (const l of cfgPreds)
|
|
37
|
+
l.sort((a, b) => a - b);
|
|
38
|
+
for (const l of cfgSuccs)
|
|
39
|
+
l.sort((a, b) => a - b);
|
|
40
|
+
// Postorder of the reverse CFG from EXIT (traversing CFG-predecessor edges).
|
|
41
|
+
// Iterative DFS with an explicit phase stack; children pushed in sorted order
|
|
42
|
+
// for determinism. postNum is the CHK comparison key: higher = closer to root.
|
|
43
|
+
const postNum = new Array(n).fill(-1);
|
|
44
|
+
const postorder = [];
|
|
45
|
+
const visited = new Array(n).fill(false);
|
|
46
|
+
const stack = [{ node: exit, childIdx: 0 }];
|
|
47
|
+
visited[exit] = true;
|
|
48
|
+
while (stack.length) {
|
|
49
|
+
const top = stack[stack.length - 1];
|
|
50
|
+
const revSuccs = cfgPreds[top.node]; // reverse-CFG successors
|
|
51
|
+
if (top.childIdx < revSuccs.length) {
|
|
52
|
+
const next = revSuccs[top.childIdx];
|
|
53
|
+
top.childIdx += 1;
|
|
54
|
+
if (!visited[next]) {
|
|
55
|
+
visited[next] = true;
|
|
56
|
+
stack.push({ node: next, childIdx: 0 });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
postNum[top.node] = postorder.length;
|
|
61
|
+
postorder.push(top.node);
|
|
62
|
+
stack.pop();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const rpo = [...postorder].reverse();
|
|
66
|
+
// CHK fixpoint. ipdom[exit] = exit DURING computation (the root dominates
|
|
67
|
+
// itself, so the intersect climb has a common terminus); it is reset to
|
|
68
|
+
// NO_IPDOM before returning so callers' climbs terminate at the root.
|
|
69
|
+
const ipdom = new Array(n).fill(exports.NO_IPDOM);
|
|
70
|
+
ipdom[exit] = exit;
|
|
71
|
+
const intersect = (a, b) => {
|
|
72
|
+
let f1 = a;
|
|
73
|
+
let f2 = b;
|
|
74
|
+
while (f1 !== f2) {
|
|
75
|
+
while (postNum[f1] < postNum[f2])
|
|
76
|
+
f1 = ipdom[f1];
|
|
77
|
+
while (postNum[f2] < postNum[f1])
|
|
78
|
+
f2 = ipdom[f2];
|
|
79
|
+
}
|
|
80
|
+
return f1;
|
|
81
|
+
};
|
|
82
|
+
let changed = true;
|
|
83
|
+
while (changed) {
|
|
84
|
+
changed = false;
|
|
85
|
+
for (const b of rpo) {
|
|
86
|
+
if (b === exit)
|
|
87
|
+
continue;
|
|
88
|
+
// CHK "predecessors in the reverse CFG" = this block's CFG successors.
|
|
89
|
+
// Fold only those already processed (ipdom assigned); RPO guarantees at
|
|
90
|
+
// least one for every block reverse-reachable from EXIT.
|
|
91
|
+
let newIpdom = exports.NO_IPDOM;
|
|
92
|
+
for (const s of cfgSuccs[b]) {
|
|
93
|
+
if (ipdom[s] !== exports.NO_IPDOM) {
|
|
94
|
+
newIpdom = newIpdom === exports.NO_IPDOM ? s : intersect(s, newIpdom);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (newIpdom !== exports.NO_IPDOM && ipdom[b] !== newIpdom) {
|
|
98
|
+
ipdom[b] = newIpdom;
|
|
99
|
+
changed = true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
ipdom[exit] = exports.NO_IPDOM; // root: no post-dominator above it
|
|
104
|
+
return { ipdom };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Does block `p` post-dominate block `b`? Climbs the post-dom tree from `b`
|
|
108
|
+
* toward EXIT and tests membership of `p`. Reflexive: a block post-dominates
|
|
109
|
+
* itself. A block with no post-dominator (EXIT, or one that cannot reach EXIT)
|
|
110
|
+
* is post-dominated only by itself. The step guard is purely defensive — the
|
|
111
|
+
* `ipdom` chain is a tree and always terminates at {@link NO_IPDOM}.
|
|
112
|
+
*/
|
|
113
|
+
function postDominates(tree, p, b) {
|
|
114
|
+
const { ipdom } = tree;
|
|
115
|
+
const n = ipdom.length;
|
|
116
|
+
if (p < 0 || b < 0 || p >= n || b >= n)
|
|
117
|
+
return false;
|
|
118
|
+
let cur = b;
|
|
119
|
+
let steps = 0;
|
|
120
|
+
while (cur !== exports.NO_IPDOM && steps <= n) {
|
|
121
|
+
if (cur === p)
|
|
122
|
+
return true;
|
|
123
|
+
cur = ipdom[cur];
|
|
124
|
+
steps += 1;
|
|
125
|
+
}
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Precondition for SOUND post-dominance (#2188 review): EXIT must be reachable
|
|
130
|
+
* (forward) from every block that is itself reachable from ENTRY. When it
|
|
131
|
+
* fails — an entry-reachable region that cannot reach EXIT, e.g. a
|
|
132
|
+
* non-terminating loop or a multi-terminal CFG a future language visitor might
|
|
133
|
+
* emit — the EXIT-rooted reverse walk degenerates (every such block gets
|
|
134
|
+
* {@link NO_IPDOM}), which both DROPS real control dependences and INVENTS
|
|
135
|
+
* spurious ones (the unsoundness documented in the module header). Consumers
|
|
136
|
+
* ({@link emitFileCdg}) check this and skip CDG for the function rather than
|
|
137
|
+
* persist an unsound projection — CFG and REACHING_DEF, which do not depend on
|
|
138
|
+
* post-dominance, are unaffected.
|
|
139
|
+
*
|
|
140
|
+
* The current TS visitor always satisfies this (every loop is given a
|
|
141
|
+
* structural `header → loopExit` edge, keeping EXIT reverse-reachable), so this
|
|
142
|
+
* is a guard for future visitors and hand-built CFGs, not a behavior change
|
|
143
|
+
* today. Pure and O(V+E).
|
|
144
|
+
*/
|
|
145
|
+
function isExitReachableFromAllBlocks(cfg) {
|
|
146
|
+
const n = cfg.blocks.length;
|
|
147
|
+
if (n === 0)
|
|
148
|
+
return true;
|
|
149
|
+
const { entryIndex, exitIndex } = cfg;
|
|
150
|
+
if (entryIndex < 0 || entryIndex >= n || exitIndex < 0 || exitIndex >= n)
|
|
151
|
+
return false;
|
|
152
|
+
const succ = Array.from({ length: n }, () => []);
|
|
153
|
+
const pred = Array.from({ length: n }, () => []);
|
|
154
|
+
for (const e of cfg.edges) {
|
|
155
|
+
if (e.from < 0 || e.from >= n || e.to < 0 || e.to >= n)
|
|
156
|
+
continue;
|
|
157
|
+
succ[e.from].push(e.to);
|
|
158
|
+
pred[e.to].push(e.from);
|
|
159
|
+
}
|
|
160
|
+
const reach = (start, adj) => {
|
|
161
|
+
const seen = new Uint8Array(n);
|
|
162
|
+
const stack = [start];
|
|
163
|
+
seen[start] = 1;
|
|
164
|
+
while (stack.length > 0) {
|
|
165
|
+
const b = stack.pop();
|
|
166
|
+
for (const next of adj[b]) {
|
|
167
|
+
if (!seen[next]) {
|
|
168
|
+
seen[next] = 1;
|
|
169
|
+
stack.push(next);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return seen;
|
|
174
|
+
};
|
|
175
|
+
const fromEntry = reach(entryIndex, succ); // forward-reachable from ENTRY
|
|
176
|
+
const canReachExit = reach(exitIndex, pred); // can reach EXIT (reverse from EXIT)
|
|
177
|
+
for (let i = 0; i < n; i++) {
|
|
178
|
+
if (fromEntry[i] && !canReachExit[i])
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* REACHING_DEF reason codec (PDG FU-B-2) — the ONE shared encoder/decoder for
|
|
4
|
+
* the source-level annotation carried on a persisted `REACHING_DEF` edge's
|
|
5
|
+
* `reason` column.
|
|
6
|
+
*
|
|
7
|
+
* A `REACHING_DEF` edge is `(defBlock:BasicBlock)->(useBlock:BasicBlock)` for one
|
|
8
|
+
* binding. The persisted columns (`from,to,type,confidence,reason,step`) are
|
|
9
|
+
* DEDUPED to `(defBlock, useBlock, bindingIdx)` (emit.ts), so the persisted
|
|
10
|
+
* edge cannot, by itself, recover the def→use chain WITHIN a coalesced
|
|
11
|
+
* straight-line BasicBlock: lines 7-9 of `chainCompute` collapse to one block
|
|
12
|
+
* and `a@7 -> b@8 -> c@9` become block-self edges with no line information. This
|
|
13
|
+
* codec ANNOTATES each edge with the ORDERED LIST of (defLine, useLine) source
|
|
14
|
+
* lines for that (block-pair, binding) group — the full set of def→use steps the
|
|
15
|
+
* solver produced for it — so the statement-granular intra-block chain is
|
|
16
|
+
* recoverable at projection time (pdg-impact.ts) WITHOUT widening the dedup key:
|
|
17
|
+
* the edge COUNT is unchanged (still one edge per group), only the `reason`
|
|
18
|
+
* carries the pair LIST (RD/taint substrate + cfg-bench budgets protected — the
|
|
19
|
+
* cfg-bench canon does not include the persisted `reason`).
|
|
20
|
+
*
|
|
21
|
+
* Carrying the FULL list (not just the FIRST pair) is what makes a SAME-BINDING
|
|
22
|
+
* reassignment chain recoverable: `acc = f(acc); acc = g(acc); acc = h(acc)`
|
|
23
|
+
* coalesces into one block, and ALL of `acc@24->acc@25`, `acc@25->acc@26`,
|
|
24
|
+
* `acc@26->acc@27` share the one `(self-block, self-block, accIdx)` group. A
|
|
25
|
+
* first-pair-only annotation could chain `24->25` but never reach `26`; the full
|
|
26
|
+
* list lets the projection walk the whole chain to fixpoint.
|
|
27
|
+
*
|
|
28
|
+
* ## Wire format (version `1`)
|
|
29
|
+
*
|
|
30
|
+
* ```
|
|
31
|
+
* <name> (legacy / pre-FU-B-2 — bare name)
|
|
32
|
+
* <name>|1:<d1>:<u1> (FU-B-2, single pair)
|
|
33
|
+
* <name>|1:<d1>:<u1>;<d2>:<u2>;... (FU-B-2, ordered pair LIST)
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* The binding NAME comes FIRST, verbatim, so the established read paths keep
|
|
37
|
+
* working with a trivial change: `pdg_query` mode:'flows' filters the variable
|
|
38
|
+
* by `r.reason = $variable OR r.reason STARTS WITH $variable|` and projects the
|
|
39
|
+
* name via {@link decodeReachingDefReason}. Source identifiers never contain `|`
|
|
40
|
+
* (the structural separator), so the name is unambiguously the substring before
|
|
41
|
+
* the first `|`; an un-annotated reason has no `|` and decodes to itself with no
|
|
42
|
+
* line info. Within the annotation, `;` separates pairs and `:` separates the
|
|
43
|
+
* version + the two lines of each pair. `<defLine>`/`<useLine>` are 1-based
|
|
44
|
+
* decimal source lines.
|
|
45
|
+
*
|
|
46
|
+
* ## Delimiter / round-trip discipline (mirrors call-summary-codec KTD6)
|
|
47
|
+
*
|
|
48
|
+
* Every structural character (`|`, `:`, `;`, the version digit, decimal digits)
|
|
49
|
+
* is printable ASCII, so the encoding survives `escapeCSVField ∘ sanitizeUTF8`
|
|
50
|
+
* (csv-generator.ts) byte-exact. The decoder NEVER throws — anything not a
|
|
51
|
+
* well-formed version-`1` annotation degrades to "name only, no pairs" (the sound
|
|
52
|
+
* default: the projection then falls back to block-start granularity exactly as
|
|
53
|
+
* before FU-B-2). A malformed individual pair within an otherwise-well-formed
|
|
54
|
+
* list is dropped; the well-formed pairs are kept.
|
|
55
|
+
*/
|
|
56
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
+
exports.REACHING_DEF_REASON_CODEC_VERSION = void 0;
|
|
58
|
+
exports.encodeReachingDefReasonPairs = encodeReachingDefReasonPairs;
|
|
59
|
+
exports.encodeReachingDefReason = encodeReachingDefReason;
|
|
60
|
+
exports.decodeReachingDefReason = decodeReachingDefReason;
|
|
61
|
+
/** One-character format version prefix. Bump on any wire-format change. */
|
|
62
|
+
exports.REACHING_DEF_REASON_CODEC_VERSION = '1';
|
|
63
|
+
/**
|
|
64
|
+
* Structural separator between the binding name and the versioned annotation.
|
|
65
|
+
* Source identifiers cannot contain it, so the name is the substring before the
|
|
66
|
+
* first occurrence (and a name with no occurrence is a legacy bare-name reason).
|
|
67
|
+
*/
|
|
68
|
+
const NAME_SEP = '|';
|
|
69
|
+
/** Separator between consecutive (defLine:useLine) pairs in the annotation. */
|
|
70
|
+
const PAIR_SEP = ';';
|
|
71
|
+
/** Whether a (defLine, useLine) pair is a well-formed 1-based-or-0 integer pair. */
|
|
72
|
+
function isValidPair(defLine, useLine) {
|
|
73
|
+
return Number.isInteger(defLine) && Number.isInteger(useLine) && defLine >= 0 && useLine >= 0;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Encode a binding name + its ordered (defLine, useLine) step list into the
|
|
77
|
+
* versioned `reason` wire string. Deterministic; never throws. Malformed /
|
|
78
|
+
* negative pairs are dropped (defensive — the solver always passes 1-based
|
|
79
|
+
* integers); if NO valid pair survives the result degrades to the bare name
|
|
80
|
+
* (legacy form) so a malformed annotation never fabricates bad lines. The name
|
|
81
|
+
* is written verbatim FIRST (see the module doc), so a name that —
|
|
82
|
+
* pathologically — already contains `|` would be re-decoded with a truncated
|
|
83
|
+
* name; binding names are source identifiers, which never contain `|`, so this
|
|
84
|
+
* cannot occur for real input (and would only lose line precision, never corrupt
|
|
85
|
+
* the substrate).
|
|
86
|
+
*/
|
|
87
|
+
function encodeReachingDefReasonPairs(name, pairs) {
|
|
88
|
+
const valid = pairs.filter((p) => isValidPair(p.defLine, p.useLine));
|
|
89
|
+
if (valid.length === 0)
|
|
90
|
+
return name;
|
|
91
|
+
const body = valid.map((p) => `${p.defLine}:${p.useLine}`).join(PAIR_SEP);
|
|
92
|
+
return `${name}${NAME_SEP}${exports.REACHING_DEF_REASON_CODEC_VERSION}:${body}`;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Single-pair convenience over {@link encodeReachingDefReasonPairs} — kept for
|
|
96
|
+
* call sites and tests that carry exactly one def→use step.
|
|
97
|
+
*/
|
|
98
|
+
function encodeReachingDefReason(name, defLine, useLine) {
|
|
99
|
+
return encodeReachingDefReasonPairs(name, [{ defLine, useLine }]);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Decode a REACHING_DEF `reason` wire string into its binding name + (when
|
|
103
|
+
* present) the FU-B-2 def/use source-line pair LIST. Never throws — a non-string,
|
|
104
|
+
* an un-annotated bare name, or a malformed annotation all yield `{ name, pairs:
|
|
105
|
+
* [] }` (the sound default: the consumer falls back to block-start granularity).
|
|
106
|
+
* A well-formed `<name>|1:<d1>:<u1>;<d2>:<u2>;...` yields every well-formed pair
|
|
107
|
+
* (a single malformed pair is dropped, the rest kept); `defLine`/`useLine` mirror
|
|
108
|
+
* the first pair for back-compat consumers.
|
|
109
|
+
*/
|
|
110
|
+
function decodeReachingDefReason(reason) {
|
|
111
|
+
const raw = typeof reason === 'string' ? reason : '';
|
|
112
|
+
const sep = raw.indexOf(NAME_SEP);
|
|
113
|
+
if (sep === -1)
|
|
114
|
+
return { name: raw, pairs: [] };
|
|
115
|
+
const name = raw.slice(0, sep);
|
|
116
|
+
const annotation = raw.slice(sep + 1);
|
|
117
|
+
// Annotation is `<version>:<d1>:<u1>;<d2>:<u2>;...`. Split off the version
|
|
118
|
+
// prefix once: the first colon ends the version token; the remainder is the
|
|
119
|
+
// `;`-separated pair body.
|
|
120
|
+
const firstColon = annotation.indexOf(':');
|
|
121
|
+
if (firstColon === -1 || annotation.slice(0, firstColon) !== exports.REACHING_DEF_REASON_CODEC_VERSION) {
|
|
122
|
+
return { name, pairs: [] };
|
|
123
|
+
}
|
|
124
|
+
const body = annotation.slice(firstColon + 1);
|
|
125
|
+
const pairs = [];
|
|
126
|
+
for (const chunk of body.split(PAIR_SEP)) {
|
|
127
|
+
const parts = chunk.split(':');
|
|
128
|
+
if (parts.length !== 2)
|
|
129
|
+
continue; // malformed pair — drop it, keep the rest
|
|
130
|
+
const defLine = Number(parts[0]);
|
|
131
|
+
const useLine = Number(parts[1]);
|
|
132
|
+
if (!isValidPair(defLine, useLine))
|
|
133
|
+
continue;
|
|
134
|
+
pairs.push({ defLine, useLine });
|
|
135
|
+
}
|
|
136
|
+
if (pairs.length === 0)
|
|
137
|
+
return { name, pairs: [] };
|
|
138
|
+
return { name, pairs, defLine: pairs[0].defLine, useLine: pairs[0].useLine };
|
|
139
|
+
}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pure graph sub-stages for the reaching-definitions solvers (#2201 review R4).
|
|
4
|
+
*
|
|
5
|
+
* Extracted from reaching-defs.ts to keep that module focused on the
|
|
6
|
+
* orchestrator, the dense oracle, the statement sweep, and the dispatcher.
|
|
7
|
+
* Everything here is a pure function of plain arrays — no CFG, no harvest, no
|
|
8
|
+
* solver state — so this module has NO dependency on reaching-defs.ts (a strict
|
|
9
|
+
* one-way import) and each stage is independently testable. The SSA pipeline
|
|
10
|
+
* (dominators → dominance frontiers → Tarjan SCC → reach-set condensation)
|
|
11
|
+
* implements Cooper-Harvey-Kennedy + Cytron + Tarjan; reverse-post-order, the
|
|
12
|
+
* loop-reachability check, and the def-set/lattice primitives are shared with
|
|
13
|
+
* the dense GEN/KILL solver and the dispatcher.
|
|
14
|
+
*
|
|
15
|
+
* These are held byte-identical to their former inline form by the differential
|
|
16
|
+
* equivalence fuzz (test/unit/cfg/reaching-defs-equivalence.test.ts) — any diff
|
|
17
|
+
* after extraction is an extraction bug, never the oracle.
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.reversePostOrder = reversePostOrder;
|
|
21
|
+
exports.buildDominators = buildDominators;
|
|
22
|
+
exports.buildDominanceFrontiers = buildDominanceFrontiers;
|
|
23
|
+
exports.tarjanScc = tarjanScc;
|
|
24
|
+
exports.condenseReachingSets = condenseReachingSets;
|
|
25
|
+
exports.hasReachableLoop = hasReachableLoop;
|
|
26
|
+
exports.unionSets = unionSets;
|
|
27
|
+
exports.latticeEquals = latticeEquals;
|
|
28
|
+
/**
|
|
29
|
+
* RPO over blocks reachable from `entry`; unreachable blocks appended by index.
|
|
30
|
+
* Returns the order AND the reachability bitmap the DFS already computed, so a
|
|
31
|
+
* caller needing "is every block reachable?" reuses this pass instead of a
|
|
32
|
+
* separate BFS (#2201 review R8 — the SSA path's reachability gate).
|
|
33
|
+
*
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
function reversePostOrder(entry, succs, n) {
|
|
37
|
+
const visited = new Array(n).fill(false);
|
|
38
|
+
const post = [];
|
|
39
|
+
// Iterative DFS with an explicit phase stack (children pushed in reverse so
|
|
40
|
+
// they pop in sorted order — determinism).
|
|
41
|
+
const stack = [{ node: entry, childIdx: 0 }];
|
|
42
|
+
visited[entry] = true;
|
|
43
|
+
while (stack.length) {
|
|
44
|
+
const top = stack[stack.length - 1];
|
|
45
|
+
const children = succs[top.node];
|
|
46
|
+
if (top.childIdx < children.length) {
|
|
47
|
+
const next = children[top.childIdx];
|
|
48
|
+
top.childIdx += 1;
|
|
49
|
+
if (!visited[next]) {
|
|
50
|
+
visited[next] = true;
|
|
51
|
+
stack.push({ node: next, childIdx: 0 });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
post.push(top.node);
|
|
56
|
+
stack.pop();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const order = post.reverse();
|
|
60
|
+
for (let b = 0; b < n; b++)
|
|
61
|
+
if (!visited[b])
|
|
62
|
+
order.push(b);
|
|
63
|
+
return { order, visited };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Immediate dominators (Cooper-Harvey-Kennedy; correct on irreducible CFGs).
|
|
67
|
+
* `rpo` is the reverse-post-order rooted at the synthetic start `S`, `dPredsX`
|
|
68
|
+
* the dominator-graph predecessors (incl. S→entry). Returns idom[b] for every
|
|
69
|
+
* node in [0, nx); idom[S] === S.
|
|
70
|
+
*
|
|
71
|
+
* @internal
|
|
72
|
+
*/
|
|
73
|
+
function buildDominators(rpo, dPredsX, S, nx) {
|
|
74
|
+
const rpoIdx = new Array(nx);
|
|
75
|
+
rpo.forEach((b, i) => (rpoIdx[b] = i));
|
|
76
|
+
const idom = new Array(nx).fill(-1);
|
|
77
|
+
idom[S] = S;
|
|
78
|
+
const intersect = (a, b) => {
|
|
79
|
+
while (a !== b) {
|
|
80
|
+
while (rpoIdx[a] > rpoIdx[b])
|
|
81
|
+
a = idom[a];
|
|
82
|
+
while (rpoIdx[b] > rpoIdx[a])
|
|
83
|
+
b = idom[b];
|
|
84
|
+
}
|
|
85
|
+
return a;
|
|
86
|
+
};
|
|
87
|
+
for (let changed = true; changed;) {
|
|
88
|
+
changed = false;
|
|
89
|
+
for (const b of rpo) {
|
|
90
|
+
if (b === S)
|
|
91
|
+
continue;
|
|
92
|
+
let nd = -1;
|
|
93
|
+
for (const p of dPredsX[b])
|
|
94
|
+
if (idom[p] !== -1)
|
|
95
|
+
nd = nd === -1 ? p : intersect(nd, p);
|
|
96
|
+
if (nd !== -1 && idom[b] !== nd) {
|
|
97
|
+
idom[b] = nd;
|
|
98
|
+
changed = true;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return idom;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Dominance frontiers (Cytron). df[b] is the set of nodes where b's dominance
|
|
106
|
+
* ends — the φ-placement targets for any binding defined in b.
|
|
107
|
+
*
|
|
108
|
+
* @internal
|
|
109
|
+
*/
|
|
110
|
+
function buildDominanceFrontiers(dPredsX, idom, nx) {
|
|
111
|
+
const df = Array.from({ length: nx }, () => new Set());
|
|
112
|
+
for (let b = 0; b < nx; b++) {
|
|
113
|
+
const dp = dPredsX[b];
|
|
114
|
+
if (dp.length < 2)
|
|
115
|
+
continue;
|
|
116
|
+
for (const p of dp) {
|
|
117
|
+
let runner = p;
|
|
118
|
+
while (runner !== idom[b] && runner !== -1) {
|
|
119
|
+
df[runner].add(b);
|
|
120
|
+
runner = idom[runner];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return df;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Tarjan strongly-connected components over the value-graph operand edges
|
|
128
|
+
* (`nodeOps[node]` = operand node ids). Iterative (explicit work stack — the
|
|
129
|
+
* graph can be deep). SCCs are emitted in REVERSE topological order, so an
|
|
130
|
+
* SCC's operand SCCs are numbered before it — the property
|
|
131
|
+
* {@link condenseReachingSets} relies on for its single forward pass.
|
|
132
|
+
*
|
|
133
|
+
* @internal
|
|
134
|
+
*/
|
|
135
|
+
function tarjanScc(nodeOps) {
|
|
136
|
+
const N = nodeOps.length;
|
|
137
|
+
const sccOf = new Array(N).fill(-1);
|
|
138
|
+
const sccMembers = [];
|
|
139
|
+
const index = new Array(N).fill(-1);
|
|
140
|
+
const low = new Array(N).fill(0);
|
|
141
|
+
const onStk = new Array(N).fill(false);
|
|
142
|
+
const tarjanStk = [];
|
|
143
|
+
let counter = 0;
|
|
144
|
+
for (let start = 0; start < N; start++) {
|
|
145
|
+
if (index[start] !== -1)
|
|
146
|
+
continue;
|
|
147
|
+
const work = [{ node: start, oi: 0 }];
|
|
148
|
+
index[start] = low[start] = counter++;
|
|
149
|
+
tarjanStk.push(start);
|
|
150
|
+
onStk[start] = true;
|
|
151
|
+
while (work.length) {
|
|
152
|
+
const top = work[work.length - 1];
|
|
153
|
+
const ops = nodeOps[top.node];
|
|
154
|
+
if (top.oi < ops.length) {
|
|
155
|
+
const w = ops[top.oi++];
|
|
156
|
+
if (index[w] === -1) {
|
|
157
|
+
index[w] = low[w] = counter++;
|
|
158
|
+
tarjanStk.push(w);
|
|
159
|
+
onStk[w] = true;
|
|
160
|
+
work.push({ node: w, oi: 0 });
|
|
161
|
+
}
|
|
162
|
+
else if (onStk[w] && index[w] < low[top.node]) {
|
|
163
|
+
low[top.node] = index[w];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
if (low[top.node] === index[top.node]) {
|
|
168
|
+
const members = [];
|
|
169
|
+
let w;
|
|
170
|
+
do {
|
|
171
|
+
w = tarjanStk.pop();
|
|
172
|
+
onStk[w] = false;
|
|
173
|
+
sccOf[w] = sccMembers.length;
|
|
174
|
+
members.push(w);
|
|
175
|
+
} while (w !== top.node);
|
|
176
|
+
sccMembers.push(members);
|
|
177
|
+
}
|
|
178
|
+
work.pop();
|
|
179
|
+
if (work.length) {
|
|
180
|
+
const par = work[work.length - 1].node;
|
|
181
|
+
if (low[top.node] < low[par])
|
|
182
|
+
low[par] = low[top.node];
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return { sccOf, sccMembers };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Reaching def-key set per SCC via condensation (cycle-safe union). Tarjan emits
|
|
191
|
+
* SCCs in reverse topological order, so a single forward pass over SCCs resolves
|
|
192
|
+
* every union: an SCC's reaching set is its members' own leaf keys plus the
|
|
193
|
+
* already-computed reaching sets of its cross-SCC operands.
|
|
194
|
+
*
|
|
195
|
+
* Alias fast path (#2201 review R2): an SCC with NO own leaf keys whose cross-SCC
|
|
196
|
+
* operands all resolve to a SINGLE source SCC has exactly that source's reaching
|
|
197
|
+
* set — share it BY REFERENCE instead of copying element-by-element (the O(defs²)
|
|
198
|
+
* cost at wide-fan-in φ merges). Safe: the returned sets are read-only after this
|
|
199
|
+
* pass, and contents are identical (set iteration order is irrelevant — the
|
|
200
|
+
* sweep sorts each use's keys before emission, KTD6).
|
|
201
|
+
*
|
|
202
|
+
* @internal
|
|
203
|
+
*/
|
|
204
|
+
function condenseReachingSets(sccMembers, sccOf, nodeKeys, nodeOps) {
|
|
205
|
+
const reachByScc = new Array(sccMembers.length);
|
|
206
|
+
for (let s = 0; s < sccMembers.length; s++) {
|
|
207
|
+
const members = sccMembers[s];
|
|
208
|
+
let aliasTarget = -1; // the unique cross-SCC source SCC, or -1 if none/many
|
|
209
|
+
let hasOwnKeys = false;
|
|
210
|
+
let multiSource = false;
|
|
211
|
+
for (const node of members) {
|
|
212
|
+
if (nodeKeys[node]) {
|
|
213
|
+
hasOwnKeys = true;
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
for (const w of nodeOps[node]) {
|
|
217
|
+
const ws = sccOf[w];
|
|
218
|
+
if (ws === s)
|
|
219
|
+
continue; // intra-SCC operand: same set being built, adds nothing
|
|
220
|
+
if (aliasTarget === -1)
|
|
221
|
+
aliasTarget = ws;
|
|
222
|
+
else if (aliasTarget !== ws) {
|
|
223
|
+
multiSource = true;
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (multiSource)
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
if (!hasOwnKeys && !multiSource && aliasTarget !== -1) {
|
|
231
|
+
reachByScc[s] = reachByScc[aliasTarget]; // zero-copy share
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
// General case: union own leaf keys + every distinct cross-SCC operand set.
|
|
235
|
+
const set = new Set();
|
|
236
|
+
for (const node of members) {
|
|
237
|
+
const keys = nodeKeys[node];
|
|
238
|
+
if (keys)
|
|
239
|
+
for (const k of keys)
|
|
240
|
+
set.add(k);
|
|
241
|
+
for (const w of nodeOps[node]) {
|
|
242
|
+
const ws = sccOf[w];
|
|
243
|
+
if (ws !== s)
|
|
244
|
+
for (const k of reachByScc[ws])
|
|
245
|
+
set.add(k);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
reachByScc[s] = set;
|
|
249
|
+
}
|
|
250
|
+
return reachByScc;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* True iff a cycle is reachable from `entry` (the CFG has a loop). Iterative DFS
|
|
254
|
+
* with a gray/black coloring; a gray successor is a back-edge. O(V+E). Used by
|
|
255
|
+
* the production dispatcher to decide SSA-vs-dense.
|
|
256
|
+
*
|
|
257
|
+
* @internal
|
|
258
|
+
*/
|
|
259
|
+
function hasReachableLoop(entry, succs, n) {
|
|
260
|
+
const color = new Uint8Array(n); // 0 white, 1 gray, 2 black
|
|
261
|
+
const stack = [{ node: entry, i: 0 }];
|
|
262
|
+
color[entry] = 1;
|
|
263
|
+
while (stack.length) {
|
|
264
|
+
const top = stack[stack.length - 1];
|
|
265
|
+
const ss = succs[top.node];
|
|
266
|
+
if (top.i < ss.length) {
|
|
267
|
+
const next = ss[top.i++];
|
|
268
|
+
if (color[next] === 1)
|
|
269
|
+
return true;
|
|
270
|
+
if (color[next] === 0) {
|
|
271
|
+
color[next] = 1;
|
|
272
|
+
stack.push({ node: next, i: 0 });
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
color[top.node] = 2;
|
|
277
|
+
stack.pop();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Order-stable union of two def-sets (shares `a` when `b` adds nothing).
|
|
284
|
+
*
|
|
285
|
+
* @internal
|
|
286
|
+
*/
|
|
287
|
+
function unionSets(a, b) {
|
|
288
|
+
let target = a;
|
|
289
|
+
let copied = false;
|
|
290
|
+
for (const key of b) {
|
|
291
|
+
if (!target.has(key)) {
|
|
292
|
+
if (!copied) {
|
|
293
|
+
target = new Set(a);
|
|
294
|
+
copied = true;
|
|
295
|
+
}
|
|
296
|
+
target.add(key);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return target;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Per-binding lattice equality with a reference fast path (sets only ever grow).
|
|
303
|
+
*
|
|
304
|
+
* @internal
|
|
305
|
+
*/
|
|
306
|
+
function latticeEquals(a, b) {
|
|
307
|
+
if (a === b)
|
|
308
|
+
return true;
|
|
309
|
+
if (a.size !== b.size)
|
|
310
|
+
return false;
|
|
311
|
+
for (const [k, bSet] of b) {
|
|
312
|
+
const aSet = a.get(k);
|
|
313
|
+
if (aSet === bSet)
|
|
314
|
+
continue;
|
|
315
|
+
if (!aSet || aSet.size !== bSet.size)
|
|
316
|
+
return false;
|
|
317
|
+
for (const v of bSet)
|
|
318
|
+
if (!aSet.has(v))
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
return true;
|
|
322
|
+
}
|