cgraphx 2.0.2 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/code/engine/cli/analyze-config.js +320 -0
- package/dist/core/code/engine/cli/analyze.js +1086 -0
- package/dist/core/code/engine/cli/cli-message.js +83 -0
- package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
- package/dist/core/code/engine/cli/embedding-dims.js +43 -0
- package/dist/core/code/engine/cli/format-elapsed.js +12 -0
- package/dist/core/code/engine/cli/help-i18n.js +144 -0
- package/dist/core/code/engine/cli/i18n/en.js +110 -0
- package/dist/core/code/engine/cli/i18n/index.js +47 -0
- package/dist/core/code/engine/cli/i18n/resources.js +9 -0
- package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
- package/dist/core/code/engine/cli/lazy-action.js +67 -0
- package/dist/core/code/engine/cli/optional-grammars.js +136 -0
- package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
- package/dist/core/code/engine/cli/status.js +156 -0
- package/dist/core/code/engine/cli/tool.js +384 -0
- package/dist/core/code/engine/config/ignore-service.js +511 -0
- package/dist/core/code/engine/config/supported-languages.js +17 -0
- package/dist/core/code/engine/core/analysis-features.js +64 -0
- package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
- package/dist/core/code/engine/core/git-staleness.js +180 -0
- package/dist/core/code/engine/core/graph/graph.js +180 -0
- package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
- package/dist/core/code/engine/core/graph/types.js +2 -0
- package/dist/core/code/engine/core/index-freshness.js +12 -0
- package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
- package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
- package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
- package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
- package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
- package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
- package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
- package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
- package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
- package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
- package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
- package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
- package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
- package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
- package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
- package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
- package/dist/core/code/engine/core/ingestion/constants.js +26 -0
- package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
- package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
- package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
- package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
- package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
- package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
- package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
- package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
- package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
- package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
- package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
- package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
- package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
- package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
- package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
- package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
- package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
- package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
- package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
- package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
- package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
- package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
- package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
- package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
- package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
- package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
- package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
- package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
- package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
- package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
- package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
- package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
- package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
- package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
- package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
- package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
- package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
- package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
- package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
- package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
- package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
- package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
- package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
- package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
- package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
- package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
- package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
- package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
- package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
- package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
- package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
- package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
- package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
- package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
- package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
- package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
- package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
- package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
- package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
- package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
- package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
- package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
- package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
- package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
- package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
- package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
- package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
- package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
- package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
- package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
- package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
- package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
- package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
- package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
- package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
- package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
- package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
- package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
- package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
- package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
- package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
- package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
- package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
- package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
- package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
- package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
- package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
- package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
- package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
- package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
- package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
- package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
- package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
- package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
- package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
- package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
- package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
- package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
- package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
- package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
- package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
- package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
- package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
- package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
- package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
- package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
- package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
- package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
- package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
- package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
- package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
- package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
- package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
- package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
- package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
- package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
- package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
- package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
- package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
- package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
- package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
- package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
- package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
- package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
- package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
- package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
- package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
- package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
- package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
- package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
- package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
- package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
- package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
- package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
- package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
- package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
- package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
- package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
- package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
- package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
- package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
- package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
- package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
- package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
- package/dist/core/code/engine/core/lbug/native-check.js +435 -0
- package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
- package/dist/core/code/engine/core/lbug/query-params.js +25 -0
- package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
- package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
- package/dist/core/code/engine/core/lbug/schema.js +771 -0
- package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
- package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
- package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
- package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
- package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
- package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
- package/dist/core/code/engine/core/logger.js +339 -0
- package/dist/core/code/engine/core/platform/capabilities.js +91 -0
- package/dist/core/code/engine/core/run-analyze.js +1098 -0
- package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
- package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
- package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
- package/dist/core/code/engine/lib/utils.js +121 -0
- package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
- package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
- package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
- package/dist/core/code/engine/mcp/local/limits.js +15 -0
- package/dist/core/code/engine/mcp/local/line-display.js +6 -0
- package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
- package/dist/core/code/engine/storage/branch-index.js +72 -0
- package/dist/core/code/engine/storage/file-hash.js +95 -0
- package/dist/core/code/engine/storage/fs-atomic.js +34 -0
- package/dist/core/code/engine/storage/git.js +555 -0
- package/dist/core/code/engine/storage/index-lock.js +664 -0
- package/dist/core/code/engine/storage/parse-cache.js +650 -0
- package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
- package/dist/core/code/engine/storage/repo-manager.js +1061 -0
- package/dist/core/code/engine/storage/scope-index-store.js +247 -0
- package/dist/core/code/engine/types/pipeline.js +2 -0
- package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
- package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
- package/dist/core/code/shared/graph/types.js +8 -0
- package/dist/core/code/shared/index.js +105 -0
- package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
- package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
- package/dist/core/code/shared/integrations/retry.js +70 -0
- package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
- package/dist/core/code/shared/language-detection.js +162 -0
- package/dist/core/code/shared/languages.js +27 -0
- package/dist/core/code/shared/lbug/schema-constants.js +98 -0
- package/dist/core/code/shared/mro-strategy.js +2 -0
- package/dist/core/code/shared/pipeline.js +5 -0
- package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
- package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
- package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
- package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
- package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
- package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
- package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
- package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
- package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
- package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
- package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
- package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
- package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
- package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
- package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
- package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
- package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
- package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
- package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
- package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
- package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
- package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
- package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
- package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
- package/dist/core/code/shared/scope-resolution/types.js +25 -0
- package/dist/core/code/shared/test-helpers.js +17 -0
- package/dist/core/code/vendor/leiden/index.cjs +355 -0
- package/dist/core/code/vendor/leiden/utils.cjs +419 -0
- package/dist/core/timeline/cli.d.ts.map +1 -1
- package/dist/core/timeline/cli.js +13 -6
- package/dist/core/timeline/cli.js.map +1 -1
- package/dist/core/timeline/debris.d.ts +20 -0
- package/dist/core/timeline/debris.d.ts.map +1 -0
- package/dist/core/timeline/debris.js +124 -0
- package/dist/core/timeline/debris.js.map +1 -0
- package/dist/core/timeline/hook-runner.d.ts.map +1 -1
- package/dist/core/timeline/hook-runner.js +3 -1
- package/dist/core/timeline/hook-runner.js.map +1 -1
- package/dist/core/timeline/hooks.d.ts.map +1 -1
- package/dist/core/timeline/hooks.js +13 -5
- package/dist/core/timeline/hooks.js.map +1 -1
- package/dist/core/timeline/installer.d.ts +2 -0
- package/dist/core/timeline/installer.d.ts.map +1 -1
- package/dist/core/timeline/installer.js +12 -0
- package/dist/core/timeline/installer.js.map +1 -1
- package/dist/core/timeline/project-root.d.ts +21 -0
- package/dist/core/timeline/project-root.d.ts.map +1 -0
- package/dist/core/timeline/project-root.js +83 -0
- package/dist/core/timeline/project-root.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,955 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectGoInterfaceImplementations = detectGoInterfaceImplementations;
|
|
4
|
+
const ids_js_1 = require("../../scope-resolution/graph-bridge/ids.js");
|
|
5
|
+
const walkers_js_1 = require("../../scope-resolution/scope/walkers.js");
|
|
6
|
+
const package_clause_js_1 = require("./package-clause.js");
|
|
7
|
+
const generic_type_parameters_js_1 = require("./generic-type-parameters.js");
|
|
8
|
+
function detectGoInterfaceImplementations(parsedFiles, _indexes, _model) {
|
|
9
|
+
return detectGoInterfaceImplementationsFromIndexes(buildDetectionIndexes(parsedFiles, _indexes));
|
|
10
|
+
}
|
|
11
|
+
function buildDetectionIndexes(parsedFiles, indexes) {
|
|
12
|
+
const interfaces = [];
|
|
13
|
+
const structsById = new Map();
|
|
14
|
+
const methodsByOwner = new Map();
|
|
15
|
+
const effectiveMethodsByStructId = new Map();
|
|
16
|
+
const interfaceById = new Map();
|
|
17
|
+
const interfaceOwnMethodsById = new Map();
|
|
18
|
+
const embeddedSitesByInterfaceId = new Map();
|
|
19
|
+
const parentStructIdsByStructId = new Map();
|
|
20
|
+
const valueMethodsByStructId = new Map();
|
|
21
|
+
const structIdsByMethodName = new Map();
|
|
22
|
+
const signatureContextByDefId = new Map();
|
|
23
|
+
const interfaceIdByScopeId = new Map();
|
|
24
|
+
const structIdByScopeId = new Map();
|
|
25
|
+
const typeParametersByInterfaceId = new Map();
|
|
26
|
+
const signatureContextByFilePath = new Map();
|
|
27
|
+
for (const parsed of parsedFiles) {
|
|
28
|
+
const signatureContext = signatureContextForFile(parsed, indexes);
|
|
29
|
+
signatureContextByFilePath.set(parsed.filePath, signatureContext);
|
|
30
|
+
for (const def of parsed.localDefs) {
|
|
31
|
+
signatureContextByDefId.set(def.nodeId, signatureContext);
|
|
32
|
+
if (def.type === 'Interface') {
|
|
33
|
+
interfaces.push(def);
|
|
34
|
+
interfaceById.set(def.nodeId, def);
|
|
35
|
+
const typeParameters = (0, generic_type_parameters_js_1.readGoTypeParameters)(def);
|
|
36
|
+
if (typeParameters !== undefined) {
|
|
37
|
+
typeParametersByInterfaceId.set(def.nodeId, typeParameters);
|
|
38
|
+
}
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (def.type === 'Struct') {
|
|
42
|
+
structsById.set(def.nodeId, def);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (def.type !== 'Method' && def.type !== 'Function')
|
|
46
|
+
continue;
|
|
47
|
+
if (def.ownerId === undefined)
|
|
48
|
+
continue;
|
|
49
|
+
// POINTER-receiver methods count toward the method set (#2813).
|
|
50
|
+
//
|
|
51
|
+
// Go's rule is per-type, and there are two types here: the method set of
|
|
52
|
+
// `T` holds only its value-receiver methods, while the method set of `*T`
|
|
53
|
+
// holds BOTH. #1966 kept only the value-receiver half, which makes the
|
|
54
|
+
// `T` answer exactly right — and the `*T` answer permanently empty, so a
|
|
55
|
+
// struct whose methods all read `func (r *T)` satisfied nothing and got
|
|
56
|
+
// no IMPLEMENTS edge at all.
|
|
57
|
+
//
|
|
58
|
+
// That is the shape idiomatic Go actually writes: methods take pointer
|
|
59
|
+
// receivers so they can mutate, and `*T` is what gets stored in an
|
|
60
|
+
// interface-typed field. Excluding it did not make the graph
|
|
61
|
+
// conservative, it made it silent — every call through such a field
|
|
62
|
+
// resolved to the interface DECLARATION and `impact()` on the
|
|
63
|
+
// implementation reported zero callers, indistinguishable from a symbol
|
|
64
|
+
// that genuinely has none.
|
|
65
|
+
//
|
|
66
|
+
// GitNexus models one Struct node per type with no separate `*T` node, so
|
|
67
|
+
// the two method sets cannot both be represented. This picks the `*T`
|
|
68
|
+
// reading: the graph now answers "which types provide this interface's
|
|
69
|
+
// behaviour", and no longer proves `var x I = T{}` invalid. That trade is
|
|
70
|
+
// deliberate — blast radius is what every consumer of IMPLEMENTS asks for
|
|
71
|
+
// (verified: MRO/METHOD_IMPLEMENTS derivation, community clustering, the
|
|
72
|
+
// receiver-dispatch fan-out index, and the epistemic heritage probe; none
|
|
73
|
+
// performs value-assignability checking).
|
|
74
|
+
//
|
|
75
|
+
// `goReceiverKind` is still stamped in method-owners.ts and is the hook a
|
|
76
|
+
// future value/pointer-aware model would read; it is deliberately no
|
|
77
|
+
// longer a filter here.
|
|
78
|
+
const simpleName = (0, ids_js_1.simpleQualifiedName)(def);
|
|
79
|
+
if (simpleName === undefined || simpleName.length === 0)
|
|
80
|
+
continue;
|
|
81
|
+
addMethod(methodsByOwner, def.ownerId, methodSetKey(simpleName, def, signatureContextByDefId), def);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Built from the nodeId-keyed map, so a def that appears in two ParsedFiles is
|
|
85
|
+
// one interface here just as it is one there — not a name collision with
|
|
86
|
+
// itself.
|
|
87
|
+
const interfacesByQualifiedName = new Map();
|
|
88
|
+
for (const iface of interfaceById.values()) {
|
|
89
|
+
const name = iface.qualifiedName;
|
|
90
|
+
if (name === undefined || name.length === 0)
|
|
91
|
+
continue;
|
|
92
|
+
interfacesByQualifiedName.set(name, interfacesByQualifiedName.has(name) ? null : iface);
|
|
93
|
+
}
|
|
94
|
+
for (const parsed of parsedFiles) {
|
|
95
|
+
for (const scope of parsed.scopes) {
|
|
96
|
+
const iface = scope.ownedDefs.find((def) => def.type === 'Interface');
|
|
97
|
+
if (iface !== undefined)
|
|
98
|
+
interfaceIdByScopeId.set(scope.id, iface.nodeId);
|
|
99
|
+
const struct = scope.ownedDefs.find((def) => def.type === 'Struct');
|
|
100
|
+
if (struct !== undefined)
|
|
101
|
+
structIdByScopeId.set(scope.id, struct.nodeId);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
for (const parsed of parsedFiles) {
|
|
105
|
+
const childScopesByParent = new Map();
|
|
106
|
+
for (const scope of parsed.scopes) {
|
|
107
|
+
if (scope.parent === null)
|
|
108
|
+
continue;
|
|
109
|
+
const children = childScopesByParent.get(scope.parent) ?? [];
|
|
110
|
+
children.push(scope);
|
|
111
|
+
childScopesByParent.set(scope.parent, children);
|
|
112
|
+
}
|
|
113
|
+
for (const scope of parsed.scopes) {
|
|
114
|
+
const ifaceId = interfaceIdByScopeId.get(scope.id);
|
|
115
|
+
if (ifaceId === undefined)
|
|
116
|
+
continue;
|
|
117
|
+
const methods = new Map();
|
|
118
|
+
for (const childScope of childScopesByParent.get(scope.id) ?? []) {
|
|
119
|
+
for (const def of childScope.ownedDefs) {
|
|
120
|
+
if (def.type !== 'Method' && def.type !== 'Function')
|
|
121
|
+
continue;
|
|
122
|
+
const simpleName = (0, ids_js_1.simpleQualifiedName)(def);
|
|
123
|
+
if (simpleName === undefined || simpleName.length === 0)
|
|
124
|
+
continue;
|
|
125
|
+
// Same key function as the struct side — an interface requiring an
|
|
126
|
+
// unexported `seal()` must only be satisfied from its own package.
|
|
127
|
+
addMethodOverload(methods, methodSetKey(simpleName, def, signatureContextByDefId), def);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
interfaceOwnMethodsById.set(ifaceId, methods);
|
|
131
|
+
}
|
|
132
|
+
for (const site of parsed.referenceSites) {
|
|
133
|
+
if (site.kind !== 'inherits')
|
|
134
|
+
continue;
|
|
135
|
+
const ifaceId = interfaceIdByScopeId.get(site.inScope);
|
|
136
|
+
if (ifaceId !== undefined) {
|
|
137
|
+
const sites = embeddedSitesByInterfaceId.get(ifaceId) ?? [];
|
|
138
|
+
sites.push(site);
|
|
139
|
+
embeddedSitesByInterfaceId.set(ifaceId, sites);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const structId = structIdByScopeId.get(site.inScope);
|
|
143
|
+
if (structId === undefined)
|
|
144
|
+
continue;
|
|
145
|
+
const parent = (0, walkers_js_1.resolveInheritanceBaseInScope)(site.inScope, site.name, indexes);
|
|
146
|
+
if (parent === undefined || parent.type !== 'Struct')
|
|
147
|
+
continue;
|
|
148
|
+
// `embeddedAsPointer` is the capture-layer record of `*T` vs `T`; the two
|
|
149
|
+
// promote different method sets (go.dev/ref/spec#Struct_types).
|
|
150
|
+
addParentStruct(parentStructIdsByStructId, structId, parent.nodeId, site.embeddedAsPointer === true);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const structMethodSetCache = new Map();
|
|
154
|
+
for (const structId of structsById.keys()) {
|
|
155
|
+
const dual = collectStructMethodSet(structId, {
|
|
156
|
+
parentStructIdsByStructId,
|
|
157
|
+
methodsByOwner,
|
|
158
|
+
}, new Set(), structMethodSetCache);
|
|
159
|
+
if (dual === undefined)
|
|
160
|
+
continue;
|
|
161
|
+
// `pointer` is MS(*T) and is the superset, so it drives candidate lookup:
|
|
162
|
+
// a type that implements only in pointer form is still an implementor.
|
|
163
|
+
effectiveMethodsByStructId.set(structId, dual.pointer);
|
|
164
|
+
valueMethodsByStructId.set(structId, dual.value);
|
|
165
|
+
for (const methodName of dual.pointer.keys()) {
|
|
166
|
+
addStructMethodCandidate(structIdsByMethodName, methodName, structId);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
interfaces,
|
|
171
|
+
structsById,
|
|
172
|
+
methodsByOwner,
|
|
173
|
+
effectiveMethodsByStructId,
|
|
174
|
+
interfacesByQualifiedName,
|
|
175
|
+
interfaceOwnMethodsById,
|
|
176
|
+
embeddedSitesByInterfaceId,
|
|
177
|
+
parentStructIdsByStructId,
|
|
178
|
+
structIdsByMethodName,
|
|
179
|
+
valueMethodsByStructId,
|
|
180
|
+
signatureContextByDefId,
|
|
181
|
+
typeParametersByInterfaceId,
|
|
182
|
+
// Gated on the repo declaring at least one generic interface. A Go codebase
|
|
183
|
+
// with none — the overwhelming majority — never runs the harvest at all,
|
|
184
|
+
// which matters because the spellings it would scan (`[]byte`,
|
|
185
|
+
// `map[string]X`) are among the commonest types in the language.
|
|
186
|
+
instantiationsByInterfaceId: typeParametersByInterfaceId.size === 0
|
|
187
|
+
? new Map()
|
|
188
|
+
: collectGoInstantiations(parsedFiles, signatureContextByFilePath, typeParametersByInterfaceId, interfacesByQualifiedName, indexes),
|
|
189
|
+
scopeIndexes: indexes,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Every distinct instantiation of a generic interface written anywhere in the
|
|
194
|
+
* program, resolved and deduplicated in one pass.
|
|
195
|
+
*
|
|
196
|
+
* Go records no instantiation anywhere on the DECLARATION — `Repo[User]` exists
|
|
197
|
+
* only where it is written — so the sites are the field/parameter/variable type
|
|
198
|
+
* spellings the capture layer already preserved: `TypeRef.declaredSpelling`
|
|
199
|
+
* (which keeps the arguments `rawName` drops), and the def-side `declaredType` /
|
|
200
|
+
* `parameterTypes` / `returnType`.
|
|
201
|
+
*
|
|
202
|
+
* A spelling is scanned rather than parsed as a whole, so decorated and nested
|
|
203
|
+
* forms yield their inner instantiations too: `[]Repo[User]`, `*Repo[User]` and
|
|
204
|
+
* `map[string]Repo[User]` all yield `Repo[User]`, and `Outer[Repo[User]]` yields
|
|
205
|
+
* both — each of which really is an instantiation present in the program. False
|
|
206
|
+
* bases (`map[` scans as base `map`) resolve to no interface and drop out.
|
|
207
|
+
*/
|
|
208
|
+
function collectGoInstantiations(parsedFiles, signatureContextByFilePath, typeParametersByInterfaceId, interfacesByQualifiedName, indexes) {
|
|
209
|
+
// One map where there were two on the same key: the inner map's KEY is the
|
|
210
|
+
// joined argument list, so holding it is the deduplication.
|
|
211
|
+
const argsByInterfaceId = new Map();
|
|
212
|
+
// A base name resolves once per scope. The bracket gate below cannot filter
|
|
213
|
+
// Go's commonest types — `map[string]string` scans as base `map` — so the
|
|
214
|
+
// FALSE bases dominate this pass, and each one otherwise re-walks the whole
|
|
215
|
+
// scope chain for a name that will never bind.
|
|
216
|
+
const basesInScope = new Map();
|
|
217
|
+
const resolveBase = (baseName, inScope) => {
|
|
218
|
+
// NUL-joined for the same reason `methodSetKey` is: it cannot occur in Go
|
|
219
|
+
// source, so no two (scope, name) pairs can collide on one key.
|
|
220
|
+
const key = `${inScope}\u0000${baseName}`;
|
|
221
|
+
const memo = basesInScope.get(key);
|
|
222
|
+
if (memo !== undefined)
|
|
223
|
+
return memo ?? undefined;
|
|
224
|
+
const iface = resolveGoInstantiationBase(baseName, inScope, interfacesByQualifiedName, indexes);
|
|
225
|
+
basesInScope.set(key, iface ?? null);
|
|
226
|
+
return iface;
|
|
227
|
+
};
|
|
228
|
+
const record = (spelling, inScope, context) => {
|
|
229
|
+
// Cheap gate first: most Go type spellings have no bracket at all, and the
|
|
230
|
+
// scan below is the only per-spelling cost this pass adds.
|
|
231
|
+
if (spelling === undefined || !spelling.includes('['))
|
|
232
|
+
return;
|
|
233
|
+
for (const { baseName, rawArgs } of parseGoInstantiationSpellings(spelling)) {
|
|
234
|
+
const iface = resolveBase(baseName, inScope);
|
|
235
|
+
if (iface === undefined)
|
|
236
|
+
continue;
|
|
237
|
+
const typeParameters = typeParametersByInterfaceId.get(iface.nodeId);
|
|
238
|
+
// A partial or over-long argument list is not a valid instantiation
|
|
239
|
+
// ("For a generic type, all type arguments must always be provided
|
|
240
|
+
// explicitly" — go.dev/ref/spec#Instantiations), so there is nothing to
|
|
241
|
+
// substitute and the site is dropped.
|
|
242
|
+
if (typeParameters === undefined || typeParameters.length !== rawArgs.length)
|
|
243
|
+
continue;
|
|
244
|
+
const normalizedArgs = normalizeGoTypeArguments(rawArgs, context);
|
|
245
|
+
if (normalizedArgs === undefined)
|
|
246
|
+
continue;
|
|
247
|
+
let byArgs = argsByInterfaceId.get(iface.nodeId);
|
|
248
|
+
if (byArgs === undefined) {
|
|
249
|
+
byArgs = new Map();
|
|
250
|
+
argsByInterfaceId.set(iface.nodeId, byArgs);
|
|
251
|
+
}
|
|
252
|
+
const key = normalizedArgs.join(',');
|
|
253
|
+
if (!byArgs.has(key))
|
|
254
|
+
byArgs.set(key, normalizedArgs);
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
for (const parsed of parsedFiles) {
|
|
258
|
+
const context = signatureContextByFilePath.get(parsed.filePath);
|
|
259
|
+
if (context === undefined)
|
|
260
|
+
continue;
|
|
261
|
+
for (const scope of parsed.scopes) {
|
|
262
|
+
for (const binding of scope.typeBindings.values()) {
|
|
263
|
+
record(binding.declaredSpelling ?? binding.rawName, scope.id, context);
|
|
264
|
+
}
|
|
265
|
+
for (const def of scope.ownedDefs) {
|
|
266
|
+
record(def.declaredType, scope.id, context);
|
|
267
|
+
record(def.returnType, scope.id, context);
|
|
268
|
+
for (const parameterType of def.parameterTypes ?? []) {
|
|
269
|
+
record(parameterType, scope.id, context);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return argsByInterfaceId;
|
|
275
|
+
}
|
|
276
|
+
/** Every `Ident[…]` / `pkg.Ident[…]` application in a type spelling, with its
|
|
277
|
+
* top-level (comma-separated, delimiter-balanced) arguments. */
|
|
278
|
+
function parseGoInstantiationSpellings(spelling) {
|
|
279
|
+
const out = [];
|
|
280
|
+
const namePattern = /[A-Za-z_][A-Za-z0-9_.]*(?=\[)/g;
|
|
281
|
+
let match;
|
|
282
|
+
while ((match = namePattern.exec(spelling)) !== null) {
|
|
283
|
+
const open = match.index + match[0].length;
|
|
284
|
+
const close = (0, generic_type_parameters_js_1.matchingGoDelimiter)(spelling, open);
|
|
285
|
+
if (close === -1)
|
|
286
|
+
continue;
|
|
287
|
+
const rawArgs = (0, generic_type_parameters_js_1.splitTopLevelGoList)(spelling.slice(open + 1, close));
|
|
288
|
+
if (rawArgs.length === 0)
|
|
289
|
+
continue;
|
|
290
|
+
out.push({ baseName: match[0], rawArgs });
|
|
291
|
+
}
|
|
292
|
+
return out;
|
|
293
|
+
}
|
|
294
|
+
/** Normalize each type argument in the context of the file that WROTE it, or
|
|
295
|
+
* `undefined` when any of them carries an unresolvable import qualifier — a
|
|
296
|
+
* half-normalized argument list would compare against nothing meaningful. */
|
|
297
|
+
function normalizeGoTypeArguments(rawArgs, context) {
|
|
298
|
+
const normalizedArgs = [];
|
|
299
|
+
for (const rawArg of rawArgs) {
|
|
300
|
+
const normalized = normalizeSignatureType(rawArg, context);
|
|
301
|
+
if (normalized === undefined)
|
|
302
|
+
return undefined;
|
|
303
|
+
normalizedArgs.push(normalized);
|
|
304
|
+
}
|
|
305
|
+
return normalizedArgs;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Bind an instantiation's base name to the generic interface it names.
|
|
309
|
+
*
|
|
310
|
+
* Goes through `resolveInheritanceBaseInScope` first — the same real scope
|
|
311
|
+
* resolution the embedded-interface path uses — and falls back to a globally
|
|
312
|
+
* UNIQUE name match.
|
|
313
|
+
*/
|
|
314
|
+
function resolveGoInstantiationBase(baseName, inScope, interfacesByQualifiedName, indexes) {
|
|
315
|
+
const bound = (0, walkers_js_1.resolveInheritanceBaseInScope)(inScope, simpleTypeName(baseName), indexes);
|
|
316
|
+
if (bound !== undefined)
|
|
317
|
+
return bound.type === 'Interface' ? bound : undefined;
|
|
318
|
+
return uniqueInterfaceNamed(baseName, interfacesByQualifiedName);
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* The one interface a written name denotes by NAME ALONE — the fallback both
|
|
322
|
+
* name-match routes here share, once the real scope resolution above them has
|
|
323
|
+
* declined.
|
|
324
|
+
*
|
|
325
|
+
* Ambiguity drops the site rather than guessing: two same-named interfaces in
|
|
326
|
+
* different packages would otherwise cross-pollinate each other's
|
|
327
|
+
* instantiations, and a dropped site only costs fan-out that does not exist
|
|
328
|
+
* today anyway. A qualified spelling is tried under both its own name and its
|
|
329
|
+
* simple tail, and a hit under EACH is two matches, so it declines as well.
|
|
330
|
+
*
|
|
331
|
+
* One probe rather than a scan of every interface in the program, which is what
|
|
332
|
+
* made this quadratic: the bracket gate in `collectGoInstantiations` cannot
|
|
333
|
+
* filter `map[…]` or `[]T`, so a Go program pays this once per bracketed
|
|
334
|
+
* spelling it writes.
|
|
335
|
+
*/
|
|
336
|
+
function uniqueInterfaceNamed(name, interfacesByQualifiedName) {
|
|
337
|
+
const exact = interfacesByQualifiedName.get(name);
|
|
338
|
+
if (exact === null)
|
|
339
|
+
return undefined;
|
|
340
|
+
const simpleName = simpleTypeName(name);
|
|
341
|
+
if (simpleName === name)
|
|
342
|
+
return exact;
|
|
343
|
+
const simple = interfacesByQualifiedName.get(simpleName);
|
|
344
|
+
if (simple === null)
|
|
345
|
+
return undefined;
|
|
346
|
+
if (exact !== undefined && simple !== undefined)
|
|
347
|
+
return undefined;
|
|
348
|
+
return exact ?? simple;
|
|
349
|
+
}
|
|
350
|
+
function detectGoInterfaceImplementationsFromIndexes(indexes) {
|
|
351
|
+
const implementations = new Map();
|
|
352
|
+
const methodSetCache = new Map();
|
|
353
|
+
for (const iface of indexes.interfaces) {
|
|
354
|
+
const required = collectInterfaceMethodSet(iface, indexes, new Set(), methodSetCache);
|
|
355
|
+
if (required === undefined || required.size === 0)
|
|
356
|
+
continue;
|
|
357
|
+
if (!methodSetHasVerifiableSignatures(required))
|
|
358
|
+
continue;
|
|
359
|
+
// Hoisted, not recomputed per set: `substituteMethodSet` rewrites
|
|
360
|
+
// SIGNATURES and returns the identical key set, and `candidateStructIdsFor`
|
|
361
|
+
// keys off nothing but those method names — so every set below has exactly
|
|
362
|
+
// these candidates. Materialized because it is iterated once per
|
|
363
|
+
// instantiation and one of the branches behind it yields a live iterator.
|
|
364
|
+
const candidateStructIds = [...candidateStructIdsFor(required, indexes)];
|
|
365
|
+
// The declaration's own method set, then one per observed instantiation.
|
|
366
|
+
// The declaration set runs FIRST and unconditionally, so this is strictly
|
|
367
|
+
// additive: every implementor found before #2855 is still found, in the
|
|
368
|
+
// same order, and instantiation only ever appends.
|
|
369
|
+
const formByStructId = new Map();
|
|
370
|
+
for (const candidateSet of [required, ...instantiatedMethodSetsFor(iface, required, indexes)]) {
|
|
371
|
+
for (const structId of candidateStructIds) {
|
|
372
|
+
if (formByStructId.get(structId) === 'value')
|
|
373
|
+
continue;
|
|
374
|
+
const pointerSet = indexes.effectiveMethodsByStructId.get(structId);
|
|
375
|
+
if (pointerSet === undefined)
|
|
376
|
+
continue;
|
|
377
|
+
// MS(*T) is the superset: if it does not satisfy, neither does MS(T).
|
|
378
|
+
if (!methodSetSatisfies(pointerSet, candidateSet, indexes.signatureContextByDefId))
|
|
379
|
+
continue;
|
|
380
|
+
// Then ask the narrower question separately — does the VALUE type satisfy?
|
|
381
|
+
// This is the distinction `var x I = T{}` turns on, and it is a fact about
|
|
382
|
+
// the program, not a heuristic.
|
|
383
|
+
const valueSet = indexes.valueMethodsByStructId.get(structId);
|
|
384
|
+
const satisfiesByValue = valueSet !== undefined &&
|
|
385
|
+
methodSetSatisfies(valueSet, candidateSet, indexes.signatureContextByDefId);
|
|
386
|
+
formByStructId.set(structId, satisfiesByValue ? 'value' : 'pointer');
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
const implementors = [...formByStructId].map(([structDefId, receiverForm]) => ({ structDefId, receiverForm }));
|
|
390
|
+
if (implementors.length > 0)
|
|
391
|
+
implementations.set(iface.nodeId, implementors);
|
|
392
|
+
}
|
|
393
|
+
return implementations;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* The method set of each observed INSTANTIATION of a generic interface.
|
|
397
|
+
*
|
|
398
|
+
* Go spec, Instantiations: "A generic function or type is instantiated by
|
|
399
|
+
* substituting type arguments for the type parameters. … Each type argument is
|
|
400
|
+
* substituted for its corresponding type parameter in the generic declaration. …
|
|
401
|
+
* Instantiating a type results in a new non-generic named type." Combined with
|
|
402
|
+
* Type definitions ("Generic types must be instantiated when they are used") the
|
|
403
|
+
* consequence is that `Repo` is not a type at all and `Repo[User]` is — with
|
|
404
|
+
* method set `{ Save(x User) }` after substitution. Implementing an interface
|
|
405
|
+
* then asks whether a type "is an element of the type set of I", and Basic
|
|
406
|
+
* interfaces defines that type set as "the set of types which implement all of
|
|
407
|
+
* those methods". `UserRepo`, whose method set contains `Save(x User)`, is an
|
|
408
|
+
* element of `Repo[User]`'s type set — so it implements `Repo[User]`, and a call
|
|
409
|
+
* through a `Repo[User]`-typed field really can land on `UserRepo.Save`. Before
|
|
410
|
+
* this, it could not: the required parameter type stayed the type PARAMETER `T`,
|
|
411
|
+
* matched no implementor's `User`, and the interface got no IMPLEMENTS edge at
|
|
412
|
+
* all. That is the same false-silence shape as #2813/#2829, one abstraction up.
|
|
413
|
+
*
|
|
414
|
+
* SUBSTITUTION, NOT ERASURE. `Repo[Order]` instantiates to `Save(x Order)` and
|
|
415
|
+
* is NOT satisfied by a `Save(x User)` implementor. Treating `T` as a wildcard
|
|
416
|
+
* would satisfy both and mint an edge Go does not have; the whole point of
|
|
417
|
+
* #2829 was that an exact model beats an approximate one.
|
|
418
|
+
*
|
|
419
|
+
* WHAT THIS DELIBERATELY DOES NOT MODEL. GitNexus holds one node per generic
|
|
420
|
+
* DECLARATION, not one per instantiation, so an interface instantiated at two
|
|
421
|
+
* different arguments in the same program unions their implementors onto the one
|
|
422
|
+
* `Repo` node — `Repo[User]` and `Repo[Order]` in the same repo both fan out to
|
|
423
|
+
* every type satisfying either. That is the same one-node-per-declaration
|
|
424
|
+
* over-approximation every nominal language in the graph already carries (a
|
|
425
|
+
* Kotlin `class UserRepo : Repo<User>` yields `UserRepo IMPLEMENTS Repo`, argument
|
|
426
|
+
* discarded), and it is bounded by the arguments the program actually writes —
|
|
427
|
+
* strictly narrower than erasure, which admits arguments that appear nowhere.
|
|
428
|
+
*
|
|
429
|
+
* Constraints are out of reach by construction and that is correct: a generic
|
|
430
|
+
* interface used as a CONSTRAINT (`func F[T Repo[X]](…)`) is written in a type
|
|
431
|
+
* parameter list, which produces no type binding and no declared type, so no
|
|
432
|
+
* such site is ever harvested. Non-basic interfaces — the union/type-set kind
|
|
433
|
+
* that "may only be used as type constraints" (General interfaces) — declare no
|
|
434
|
+
* methods and are already dropped by the empty-method-set guard above.
|
|
435
|
+
*/
|
|
436
|
+
function instantiatedMethodSetsFor(iface, required, indexes) {
|
|
437
|
+
const typeParameters = indexes.typeParametersByInterfaceId.get(iface.nodeId);
|
|
438
|
+
if (typeParameters === undefined)
|
|
439
|
+
return [];
|
|
440
|
+
const instantiations = indexes.instantiationsByInterfaceId.get(iface.nodeId);
|
|
441
|
+
if (instantiations === undefined || instantiations.size === 0)
|
|
442
|
+
return [];
|
|
443
|
+
const indexByName = new Map(typeParameters.map((name, index) => [name, index]));
|
|
444
|
+
const sets = [];
|
|
445
|
+
for (const normalizedArgs of instantiations.values()) {
|
|
446
|
+
const substituted = substituteMethodSet(required, indexByName, normalizedArgs, indexes.signatureContextByDefId);
|
|
447
|
+
if (substituted !== undefined)
|
|
448
|
+
sets.push(substituted);
|
|
449
|
+
}
|
|
450
|
+
return sets;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Rewrite a required method set under one instantiation, or `undefined` when any
|
|
454
|
+
* signature in it cannot be normalized (an unresolved import qualifier) — a
|
|
455
|
+
* partially substituted set would compare a mix of instantiated and
|
|
456
|
+
* uninstantiated types, so the instantiation is dropped whole.
|
|
457
|
+
*
|
|
458
|
+
* The substituted defs carry a synthetic node id that is deliberately absent
|
|
459
|
+
* from `signatureContextByDefId`. Their parameter/return types come out of here
|
|
460
|
+
* ALREADY normalized — the type arguments in the context that WROTE them, the
|
|
461
|
+
* rest in the interface's own — and `normalizeSignatureType` with no context is
|
|
462
|
+
* the identity beyond whitespace, so the comparison in `signaturesCompatible`
|
|
463
|
+
* cannot re-qualify a spelling that is already fully qualified.
|
|
464
|
+
*/
|
|
465
|
+
function substituteMethodSet(required, indexByName, normalizedArgs, signatureContextByDefId) {
|
|
466
|
+
const out = new Map();
|
|
467
|
+
for (const [name, overloads] of required) {
|
|
468
|
+
const substitutedOverloads = [];
|
|
469
|
+
for (const def of overloads) {
|
|
470
|
+
const context = signatureContextByDefId.get(def.nodeId);
|
|
471
|
+
const parameterTypes = [];
|
|
472
|
+
for (const parameterType of def.parameterTypes ?? []) {
|
|
473
|
+
const substituted = substituteSignatureType(parameterType, indexByName, normalizedArgs, context);
|
|
474
|
+
if (substituted === undefined)
|
|
475
|
+
return undefined;
|
|
476
|
+
parameterTypes.push(substituted);
|
|
477
|
+
}
|
|
478
|
+
let returnType;
|
|
479
|
+
if (def.returnType !== undefined) {
|
|
480
|
+
returnType = substituteSignatureType(def.returnType, indexByName, normalizedArgs, context);
|
|
481
|
+
if (returnType === undefined)
|
|
482
|
+
return undefined;
|
|
483
|
+
}
|
|
484
|
+
substitutedOverloads.push({
|
|
485
|
+
...def,
|
|
486
|
+
nodeId: `${def.nodeId}\u0000instantiated`,
|
|
487
|
+
...(def.parameterTypes !== undefined ? { parameterTypes } : {}),
|
|
488
|
+
...(returnType !== undefined ? { returnType } : {}),
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
out.set(name, substitutedOverloads);
|
|
492
|
+
}
|
|
493
|
+
return out;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Placeholder for the type argument at position `i` while its enclosing type is
|
|
497
|
+
* normalized. NUL-delimited — the same separator `methodSetKey` already uses,
|
|
498
|
+
* and for the same reason: it cannot occur in Go source.
|
|
499
|
+
*
|
|
500
|
+
* Both halves of that choice are load-bearing. `qualifyGoSignatureTypes` rewrites
|
|
501
|
+
* only tokens matching `[A-Za-z_][A-Za-z0-9_]*`, which can start with neither NUL
|
|
502
|
+
* nor a digit, so the placeholder survives normalization untouched; and
|
|
503
|
+
* `normalizeSignatureType` strips `\s+` FIRST, so a whitespace-delimited
|
|
504
|
+
* placeholder would lose its delimiters and become indistinguishable from an
|
|
505
|
+
* array length (`[5]int`).
|
|
506
|
+
*/
|
|
507
|
+
const TYPE_PARAMETER_PLACEHOLDER = /\u0000(\d+)\u0000/g;
|
|
508
|
+
/**
|
|
509
|
+
* Substitute type arguments into one signature type, preserving Go's type
|
|
510
|
+
* identity rules for everything around them.
|
|
511
|
+
*
|
|
512
|
+
* Substitution happens BEFORE normalization and reinstatement AFTER, so the
|
|
513
|
+
* argument's own spelling is never re-qualified by the interface's package while
|
|
514
|
+
* the rest of the type still is: `[]T` in package `repo` with argument
|
|
515
|
+
* `internal/model.User` yields `[]internal/model.User`, not
|
|
516
|
+
* `[]repo.internal/model.User`. Pointer, slice, map and variadic shape survive
|
|
517
|
+
* because only the identifier token is replaced (`*T` -> `*model.User`), which is
|
|
518
|
+
* what makes `Save(x T)` and `Save(x *T)` stay different methods.
|
|
519
|
+
*/
|
|
520
|
+
function substituteSignatureType(typeName, indexByName, normalizedArgs, context) {
|
|
521
|
+
const placeheld = typeName.replace(/[A-Za-z_][A-Za-z0-9_]*/g, (token, offset, source) => {
|
|
522
|
+
// `pkg.T` names `T` in package `pkg`, never the type parameter `T`.
|
|
523
|
+
if (hasPackageQualifierDot(source, offset))
|
|
524
|
+
return token;
|
|
525
|
+
const index = indexByName.get(token);
|
|
526
|
+
return index === undefined ? token : `\u0000${index}\u0000`;
|
|
527
|
+
});
|
|
528
|
+
const normalized = normalizeSignatureType(placeheld, context);
|
|
529
|
+
if (normalized === undefined)
|
|
530
|
+
return undefined;
|
|
531
|
+
return normalized.replace(TYPE_PARAMETER_PLACEHOLDER, (_match, digits) => {
|
|
532
|
+
return normalizedArgs[Number(digits)] ?? _match;
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* The key a method occupies in a method set.
|
|
537
|
+
*
|
|
538
|
+
* Go spec, Uniqueness of identifiers: "Two identifiers are different if they are
|
|
539
|
+
* spelled differently, **or if they appear in different packages and are not
|
|
540
|
+
* exported**." So an UNEXPORTED method name is scoped to its declaring package —
|
|
541
|
+
* `seal` in package `sealed` is a different identifier from `seal` in package
|
|
542
|
+
* `foreign`, and a type outside `sealed` can never satisfy `interface { seal() }`.
|
|
543
|
+
* That is the whole basis of the sealed-interface idiom.
|
|
544
|
+
*
|
|
545
|
+
* Matching on the bare name made those types satisfy each other, which is a
|
|
546
|
+
* FALSE implementation rather than an over-approximation. Qualifying the key
|
|
547
|
+
* with the declaring package for unexported names makes the comparison exact.
|
|
548
|
+
*
|
|
549
|
+
* Exported names are deliberately left unqualified: the spec makes them the same
|
|
550
|
+
* identifier across packages, which is what allows cross-package interface
|
|
551
|
+
* satisfaction to work at all.
|
|
552
|
+
*/
|
|
553
|
+
function methodSetKey(simpleName, def, signatureContextByDefId) {
|
|
554
|
+
if (isExportedGoIdentifier(simpleName))
|
|
555
|
+
return simpleName;
|
|
556
|
+
const pkg = signatureContextByDefId.get(def.nodeId)?.packageQualifier;
|
|
557
|
+
return pkg === undefined ? simpleName : `${pkg}\u0000${simpleName}`;
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Go spec, Exported identifiers: exported iff the first character is a Unicode
|
|
561
|
+
* uppercase letter (category Lu). Method names always satisfy the second clause
|
|
562
|
+
* (they are method names), so the first character is the whole test.
|
|
563
|
+
*/
|
|
564
|
+
function isExportedGoIdentifier(name) {
|
|
565
|
+
const first = name.codePointAt(0);
|
|
566
|
+
if (first === undefined)
|
|
567
|
+
return false;
|
|
568
|
+
const ch = String.fromCodePoint(first);
|
|
569
|
+
return ch !== ch.toLowerCase() && ch === ch.toUpperCase();
|
|
570
|
+
}
|
|
571
|
+
function addMethod(methodsByOwner, ownerId, methodName, def) {
|
|
572
|
+
let methods = methodsByOwner.get(ownerId);
|
|
573
|
+
if (methods === undefined) {
|
|
574
|
+
methods = new Map();
|
|
575
|
+
methodsByOwner.set(ownerId, methods);
|
|
576
|
+
}
|
|
577
|
+
addMethodOverload(methods, methodName, def);
|
|
578
|
+
}
|
|
579
|
+
function addMethodOverload(methods, methodName, def) {
|
|
580
|
+
const overloads = methods.get(methodName) ?? [];
|
|
581
|
+
overloads.push(def);
|
|
582
|
+
methods.set(methodName, overloads);
|
|
583
|
+
}
|
|
584
|
+
function addStructMethodCandidate(structIdsByMethodName, methodName, structId) {
|
|
585
|
+
const structIds = structIdsByMethodName.get(methodName) ?? new Set();
|
|
586
|
+
structIds.add(structId);
|
|
587
|
+
structIdsByMethodName.set(methodName, structIds);
|
|
588
|
+
}
|
|
589
|
+
function addParentStruct(parentStructIdsByStructId, structId, parentStructId, asPointer) {
|
|
590
|
+
const parents = parentStructIdsByStructId.get(structId) ?? [];
|
|
591
|
+
parents.push({ structId: parentStructId, asPointer });
|
|
592
|
+
parentStructIdsByStructId.set(structId, parents);
|
|
593
|
+
}
|
|
594
|
+
function collectStructMethodSet(structId, indexes, visiting, cache) {
|
|
595
|
+
const entries = collectStructMethodEntries(structId, indexes, visiting, cache);
|
|
596
|
+
if (entries === undefined)
|
|
597
|
+
return undefined;
|
|
598
|
+
return {
|
|
599
|
+
value: methodEntriesToMethodSet(entries.value),
|
|
600
|
+
pointer: methodEntriesToMethodSet(entries.pointer),
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* Build MS(T) and MS(*T) together, applying the spec's promotion table exactly
|
|
605
|
+
* (go.dev/ref/spec#Method_sets, #Struct_types):
|
|
606
|
+
*
|
|
607
|
+
* declared receiver T -> in MS(T) and MS(*T)
|
|
608
|
+
* declared receiver *T -> in MS(*T) only
|
|
609
|
+
* S embeds T (value) -> MS(S) gets P's MS(T); MS(*S) gets P's MS(*T)
|
|
610
|
+
* S embeds *T (pointer) -> MS(S) AND MS(*S) both get P's MS(*T)
|
|
611
|
+
*
|
|
612
|
+
* The last row is the one that makes the embed FORM load-bearing: with
|
|
613
|
+
* `func (b *Base) Ping()`, `struct{ Base }` does not implement a `Ping`
|
|
614
|
+
* interface by value while `struct{ *Base }` does. Collapsing the forms gives
|
|
615
|
+
* both the same answer and one of them is then wrong.
|
|
616
|
+
*/
|
|
617
|
+
function collectStructMethodEntries(structId, indexes, visiting, cache) {
|
|
618
|
+
const cached = cache.get(structId);
|
|
619
|
+
if (cached !== undefined) {
|
|
620
|
+
return { value: cloneMethodEntries(cached.value), pointer: cloneMethodEntries(cached.pointer) };
|
|
621
|
+
}
|
|
622
|
+
if (visiting.has(structId))
|
|
623
|
+
return undefined;
|
|
624
|
+
visiting.add(structId);
|
|
625
|
+
const own = indexes.methodsByOwner.get(structId);
|
|
626
|
+
// MS(*T) holds every declared method; MS(T) drops the pointer-receiver ones.
|
|
627
|
+
const pointer = directMethodEntries(own);
|
|
628
|
+
const value = directMethodEntries(filterValueReceiverMethods(own));
|
|
629
|
+
for (const parent of indexes.parentStructIdsByStructId.get(structId) ?? []) {
|
|
630
|
+
const parentEntries = collectStructMethodEntries(parent.structId, indexes, visiting, cache);
|
|
631
|
+
if (parentEntries === undefined) {
|
|
632
|
+
visiting.delete(structId);
|
|
633
|
+
return undefined;
|
|
634
|
+
}
|
|
635
|
+
// Embedding by POINTER lifts the parent's pointer-receiver methods into the
|
|
636
|
+
// embedder's VALUE method set; embedding by value does not.
|
|
637
|
+
const promotedIntoValue = parent.asPointer ? parentEntries.pointer : parentEntries.value;
|
|
638
|
+
promoteEntries(value, promotedIntoValue);
|
|
639
|
+
promoteEntries(pointer, parentEntries.pointer);
|
|
640
|
+
}
|
|
641
|
+
visiting.delete(structId);
|
|
642
|
+
cache.set(structId, { value: cloneMethodEntries(value), pointer: cloneMethodEntries(pointer) });
|
|
643
|
+
return { value, pointer };
|
|
644
|
+
}
|
|
645
|
+
/** Merge one depth-level of promoted entries, preserving the shallowest-depth
|
|
646
|
+
* and ambiguity rules the selector spec defines. */
|
|
647
|
+
function promoteEntries(target, source) {
|
|
648
|
+
for (const [methodName, entry] of source) {
|
|
649
|
+
if (entry.ambiguous)
|
|
650
|
+
continue;
|
|
651
|
+
mergePromotedMethodEntry(target, methodName, {
|
|
652
|
+
overloads: entry.overloads,
|
|
653
|
+
depth: entry.depth + 1,
|
|
654
|
+
ambiguous: false,
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
/** MS(T) excludes methods declared with a `*T` receiver. */
|
|
659
|
+
function filterValueReceiverMethods(methods) {
|
|
660
|
+
if (methods === undefined)
|
|
661
|
+
return undefined;
|
|
662
|
+
const out = new Map();
|
|
663
|
+
for (const [name, overloads] of methods) {
|
|
664
|
+
const valueOnly = overloads.filter((def) => def.goReceiverKind !== 'pointer');
|
|
665
|
+
if (valueOnly.length > 0)
|
|
666
|
+
out.set(name, valueOnly);
|
|
667
|
+
}
|
|
668
|
+
return out;
|
|
669
|
+
}
|
|
670
|
+
function collectInterfaceMethodSet(iface, indexes, visiting, cache) {
|
|
671
|
+
const cached = cache.get(iface.nodeId);
|
|
672
|
+
// NOTE: Returns a direct reference to the cached map. Callers (the detection
|
|
673
|
+
// loop in detectGoInterfaceImplementationsFromIndexes) only READ the result
|
|
674
|
+
// (keys/values passed to candidateStructIdsFor and methodSetSatisfies). If a
|
|
675
|
+
// future caller needs to mutate the returned map, it must clone first — the
|
|
676
|
+
// cache entry is shared and must remain immutable after this function returns.
|
|
677
|
+
if (cached !== undefined)
|
|
678
|
+
return cached;
|
|
679
|
+
if (visiting.has(iface.nodeId))
|
|
680
|
+
return undefined;
|
|
681
|
+
visiting.add(iface.nodeId);
|
|
682
|
+
const ownMethods = indexes.methodsByOwner.get(iface.nodeId) ?? indexes.interfaceOwnMethodsById.get(iface.nodeId);
|
|
683
|
+
const merged = cloneMethodSet(ownMethods);
|
|
684
|
+
const embeddedInterfaces = embeddedInterfacesFor(iface, indexes);
|
|
685
|
+
if (embeddedInterfaces === undefined) {
|
|
686
|
+
visiting.delete(iface.nodeId);
|
|
687
|
+
return undefined;
|
|
688
|
+
}
|
|
689
|
+
for (const embeddedIface of embeddedInterfaces) {
|
|
690
|
+
const embeddedMethods = collectInterfaceMethodSet(embeddedIface, indexes, visiting, cache);
|
|
691
|
+
if (embeddedMethods === undefined) {
|
|
692
|
+
visiting.delete(iface.nodeId);
|
|
693
|
+
return undefined;
|
|
694
|
+
}
|
|
695
|
+
mergeMethodSet(merged, embeddedMethods);
|
|
696
|
+
}
|
|
697
|
+
visiting.delete(iface.nodeId);
|
|
698
|
+
// Store a clone in the cache so the returned `merged` reference is independent.
|
|
699
|
+
// This protects the cache from mutation if a caller modifies the return value.
|
|
700
|
+
cache.set(iface.nodeId, cloneMethodSet(merged));
|
|
701
|
+
return merged;
|
|
702
|
+
}
|
|
703
|
+
function embeddedInterfacesFor(iface, indexes) {
|
|
704
|
+
const embedded = [];
|
|
705
|
+
for (const site of indexes.embeddedSitesByInterfaceId.get(iface.nodeId) ?? []) {
|
|
706
|
+
const resolved = resolveEmbeddedInterface(site, indexes);
|
|
707
|
+
if (resolved === undefined)
|
|
708
|
+
return undefined;
|
|
709
|
+
embedded.push(resolved);
|
|
710
|
+
}
|
|
711
|
+
return embedded;
|
|
712
|
+
}
|
|
713
|
+
function candidateStructIdsFor(required, indexes) {
|
|
714
|
+
let result;
|
|
715
|
+
for (const name of required.keys()) {
|
|
716
|
+
const candidates = indexes.structIdsByMethodName.get(name);
|
|
717
|
+
if (candidates === undefined)
|
|
718
|
+
return [];
|
|
719
|
+
if (result === undefined) {
|
|
720
|
+
// First method name: start with its full candidate set (copy to avoid
|
|
721
|
+
// corrupting the shared index).
|
|
722
|
+
result = new Set(candidates);
|
|
723
|
+
}
|
|
724
|
+
else {
|
|
725
|
+
// Intersect: keep only struct IDs present in this method's candidate set.
|
|
726
|
+
// Iterate a snapshot to avoid mutating while iterating.
|
|
727
|
+
const toDelete = [];
|
|
728
|
+
for (const id of result) {
|
|
729
|
+
if (!candidates.has(id))
|
|
730
|
+
toDelete.push(id);
|
|
731
|
+
}
|
|
732
|
+
for (const id of toDelete)
|
|
733
|
+
result.delete(id);
|
|
734
|
+
}
|
|
735
|
+
if (result.size === 0)
|
|
736
|
+
return []; // Early exit: no struct has all required methods
|
|
737
|
+
}
|
|
738
|
+
return result === undefined ? indexes.structsById.keys() : result;
|
|
739
|
+
}
|
|
740
|
+
function resolveEmbeddedInterface(site, indexes) {
|
|
741
|
+
const bound = (0, walkers_js_1.resolveInheritanceBaseInScope)(site.inScope, site.name, indexes.scopeIndexes);
|
|
742
|
+
if (bound !== undefined)
|
|
743
|
+
return bound.type === 'Interface' ? bound : undefined;
|
|
744
|
+
return uniqueInterfaceNamed(site.name, indexes.interfacesByQualifiedName);
|
|
745
|
+
}
|
|
746
|
+
function simpleTypeName(name) {
|
|
747
|
+
const dot = name.lastIndexOf('.');
|
|
748
|
+
return dot === -1 ? name : name.slice(dot + 1);
|
|
749
|
+
}
|
|
750
|
+
function cloneMethodSet(methods) {
|
|
751
|
+
const clone = new Map();
|
|
752
|
+
if (methods === undefined)
|
|
753
|
+
return clone;
|
|
754
|
+
for (const [name, overloads] of methods) {
|
|
755
|
+
clone.set(name, [...overloads]);
|
|
756
|
+
}
|
|
757
|
+
return clone;
|
|
758
|
+
}
|
|
759
|
+
function directMethodEntries(methods) {
|
|
760
|
+
const entries = new Map();
|
|
761
|
+
if (methods === undefined)
|
|
762
|
+
return entries;
|
|
763
|
+
for (const [name, overloads] of methods) {
|
|
764
|
+
entries.set(name, { overloads: [...overloads], depth: 0, ambiguous: false });
|
|
765
|
+
}
|
|
766
|
+
return entries;
|
|
767
|
+
}
|
|
768
|
+
function cloneMethodEntries(entries) {
|
|
769
|
+
const clone = new Map();
|
|
770
|
+
for (const [name, entry] of entries) {
|
|
771
|
+
clone.set(name, { ...entry, overloads: [...entry.overloads] });
|
|
772
|
+
}
|
|
773
|
+
return clone;
|
|
774
|
+
}
|
|
775
|
+
function methodEntriesToMethodSet(entries) {
|
|
776
|
+
const methods = new Map();
|
|
777
|
+
for (const [name, entry] of entries) {
|
|
778
|
+
if (entry.ambiguous)
|
|
779
|
+
continue;
|
|
780
|
+
methods.set(name, [...entry.overloads]);
|
|
781
|
+
}
|
|
782
|
+
return methods;
|
|
783
|
+
}
|
|
784
|
+
function mergePromotedMethodEntry(target, methodName, candidate) {
|
|
785
|
+
const existing = target.get(methodName);
|
|
786
|
+
if (existing === undefined || candidate.depth < existing.depth) {
|
|
787
|
+
target.set(methodName, candidate);
|
|
788
|
+
return;
|
|
789
|
+
}
|
|
790
|
+
if (candidate.depth > existing.depth)
|
|
791
|
+
return;
|
|
792
|
+
target.set(methodName, { overloads: [], depth: candidate.depth, ambiguous: true });
|
|
793
|
+
}
|
|
794
|
+
function mergeMethodSet(target, source) {
|
|
795
|
+
for (const [name, overloads] of source) {
|
|
796
|
+
const existing = target.get(name) ?? [];
|
|
797
|
+
existing.push(...overloads);
|
|
798
|
+
target.set(name, existing);
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
function methodSetSatisfies(actual, required, signatureContextByDefId) {
|
|
802
|
+
for (const [name, requiredOverloads] of required) {
|
|
803
|
+
const actualOverloads = actual.get(name);
|
|
804
|
+
if (actualOverloads === undefined)
|
|
805
|
+
return false;
|
|
806
|
+
for (const requiredMethod of requiredOverloads) {
|
|
807
|
+
// Fast arity pre-filter: if the required method has a known parameter
|
|
808
|
+
// count, reject immediately when no actual overload matches it. This
|
|
809
|
+
// avoids the expensive signature normalization loop for obvious mismatches.
|
|
810
|
+
if (requiredMethod.parameterCount !== undefined) {
|
|
811
|
+
if (!actualOverloads.some((a) => a.parameterCount === requiredMethod.parameterCount)) {
|
|
812
|
+
return false;
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
if (!hasCompatibleMethod(actualOverloads, requiredMethod, signatureContextByDefId)) {
|
|
816
|
+
return false;
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
return true;
|
|
821
|
+
}
|
|
822
|
+
function hasCompatibleMethod(actualOverloads, requiredMethod, signatureContextByDefId) {
|
|
823
|
+
if (!hasVerifiableSignature(requiredMethod))
|
|
824
|
+
return false;
|
|
825
|
+
return actualOverloads.some((actualMethod) => signaturesCompatible(actualMethod, requiredMethod, signatureContextByDefId));
|
|
826
|
+
}
|
|
827
|
+
function methodSetHasVerifiableSignatures(methods) {
|
|
828
|
+
for (const overloads of methods.values()) {
|
|
829
|
+
if (!overloads.some(hasVerifiableSignature))
|
|
830
|
+
return false;
|
|
831
|
+
}
|
|
832
|
+
return true;
|
|
833
|
+
}
|
|
834
|
+
function hasVerifiableSignature(def) {
|
|
835
|
+
return (def.parameterCount !== undefined ||
|
|
836
|
+
def.requiredParameterCount !== undefined ||
|
|
837
|
+
(def.parameterTypes !== undefined && def.parameterTypes.length > 0) ||
|
|
838
|
+
def.returnType !== undefined);
|
|
839
|
+
}
|
|
840
|
+
function signaturesCompatible(actual, required, signatureContextByDefId) {
|
|
841
|
+
const actualContext = signatureContextByDefId.get(actual.nodeId);
|
|
842
|
+
const requiredContext = signatureContextByDefId.get(required.nodeId);
|
|
843
|
+
return (countsCompatible(actual.parameterCount, required.parameterCount) &&
|
|
844
|
+
countsCompatible(actual.requiredParameterCount, required.requiredParameterCount) &&
|
|
845
|
+
parameterTypesCompatible(actual.parameterTypes, required.parameterTypes, actualContext, requiredContext) &&
|
|
846
|
+
returnTypesCompatible(actual.returnType, required.returnType, actualContext, requiredContext));
|
|
847
|
+
}
|
|
848
|
+
function countsCompatible(actual, required) {
|
|
849
|
+
return actual === undefined || required === undefined || actual === required;
|
|
850
|
+
}
|
|
851
|
+
function parameterTypesCompatible(actual, required, actualContext, requiredContext) {
|
|
852
|
+
if (actual === undefined || required === undefined)
|
|
853
|
+
return true;
|
|
854
|
+
if (actual.length !== required.length)
|
|
855
|
+
return false;
|
|
856
|
+
return actual.every((type, index) => {
|
|
857
|
+
const actualType = normalizeSignatureType(type, actualContext);
|
|
858
|
+
const requiredType = normalizeSignatureType(required[index], requiredContext);
|
|
859
|
+
return actualType !== undefined && requiredType !== undefined && actualType === requiredType;
|
|
860
|
+
});
|
|
861
|
+
}
|
|
862
|
+
function returnTypesCompatible(actual, required, actualContext, requiredContext) {
|
|
863
|
+
if (required === undefined)
|
|
864
|
+
return actual === undefined;
|
|
865
|
+
if (actual === undefined)
|
|
866
|
+
return false;
|
|
867
|
+
const actualType = normalizeSignatureType(actual, actualContext);
|
|
868
|
+
const requiredType = normalizeSignatureType(required, requiredContext);
|
|
869
|
+
return actualType !== undefined && requiredType !== undefined && actualType === requiredType;
|
|
870
|
+
}
|
|
871
|
+
function normalizeSignatureType(typeName, context) {
|
|
872
|
+
// Go type identity includes pointer/slice/map/variadic shape and package
|
|
873
|
+
// qualifiers. Only erase whitespace and qualify bare local type names; stripping
|
|
874
|
+
// `*`, `[]`, `...`, or `pkg.` would make non-identical signatures compare equal.
|
|
875
|
+
const compact = typeName.replace(/\s+/g, '');
|
|
876
|
+
if (context === undefined)
|
|
877
|
+
return compact;
|
|
878
|
+
return qualifyGoSignatureTypes(compact, context);
|
|
879
|
+
}
|
|
880
|
+
function qualifyGoSignatureTypes(typeName, context) {
|
|
881
|
+
let unresolvedQualifier = false;
|
|
882
|
+
const qualified = typeName.replace(/[A-Za-z_][A-Za-z0-9_]*/g, (token, offset, source) => {
|
|
883
|
+
if (GO_BUILTIN_TYPES.has(token))
|
|
884
|
+
return token;
|
|
885
|
+
if (hasPackageQualifierDot(source, offset))
|
|
886
|
+
return token;
|
|
887
|
+
if (source[offset + token.length] === '.') {
|
|
888
|
+
const qualifier = context.importQualifiers.get(token);
|
|
889
|
+
if (qualifier !== undefined)
|
|
890
|
+
return qualifier;
|
|
891
|
+
unresolvedQualifier = true;
|
|
892
|
+
return token;
|
|
893
|
+
}
|
|
894
|
+
if (context.packageQualifier === undefined)
|
|
895
|
+
return token;
|
|
896
|
+
return `${context.packageQualifier}.${token}`;
|
|
897
|
+
});
|
|
898
|
+
return unresolvedQualifier ? undefined : qualified;
|
|
899
|
+
}
|
|
900
|
+
function hasPackageQualifierDot(source, offset) {
|
|
901
|
+
return source[offset - 1] === '.' && source[offset - 2] !== '.';
|
|
902
|
+
}
|
|
903
|
+
function signatureContextForFile(parsed, indexes) {
|
|
904
|
+
const importQualifiers = new Map();
|
|
905
|
+
const importEdges = indexes.imports?.get(parsed.moduleScope) ?? [];
|
|
906
|
+
for (const edge of importEdges) {
|
|
907
|
+
if (edge.kind !== 'namespace' || edge.targetFile === null)
|
|
908
|
+
continue;
|
|
909
|
+
const qualifier = packageQualifierForFile(edge.targetFile);
|
|
910
|
+
if (qualifier !== undefined)
|
|
911
|
+
importQualifiers.set(edge.localName, qualifier);
|
|
912
|
+
}
|
|
913
|
+
return {
|
|
914
|
+
packageQualifier: packageQualifierForFile(parsed.filePath),
|
|
915
|
+
importQualifiers,
|
|
916
|
+
};
|
|
917
|
+
}
|
|
918
|
+
/** The package directory, or `undefined` for a repo-root file.
|
|
919
|
+
*
|
|
920
|
+
* Shares `goPackageDir` with the package-clause resolver rather than repeating
|
|
921
|
+
* its normalize-and-slice (#2837): the two disagree only on how they spell "no
|
|
922
|
+
* directory", so the difference stays here, at the one call site that cares. */
|
|
923
|
+
function packageQualifierForFile(filePath) {
|
|
924
|
+
const packageDir = (0, package_clause_js_1.goPackageDir)(filePath);
|
|
925
|
+
return packageDir.length === 0 ? undefined : packageDir;
|
|
926
|
+
}
|
|
927
|
+
const GO_BUILTIN_TYPES = new Set([
|
|
928
|
+
'any',
|
|
929
|
+
'bool',
|
|
930
|
+
'byte',
|
|
931
|
+
'comparable',
|
|
932
|
+
'complex64',
|
|
933
|
+
'complex128',
|
|
934
|
+
'error',
|
|
935
|
+
'float32',
|
|
936
|
+
'float64',
|
|
937
|
+
'func',
|
|
938
|
+
'int',
|
|
939
|
+
'int8',
|
|
940
|
+
'int16',
|
|
941
|
+
'int32',
|
|
942
|
+
'int64',
|
|
943
|
+
'interface',
|
|
944
|
+
'map',
|
|
945
|
+
'rune',
|
|
946
|
+
'string',
|
|
947
|
+
'struct',
|
|
948
|
+
'uint',
|
|
949
|
+
'uint8',
|
|
950
|
+
'uint16',
|
|
951
|
+
'uint32',
|
|
952
|
+
'uint64',
|
|
953
|
+
'uintptr',
|
|
954
|
+
'chan',
|
|
955
|
+
]);
|