@lzehrung/codegraph 2.4.0 → 3.0.1
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/README.md +5 -4
- package/codegraph-skill/codegraph/SKILL.md +3 -3
- package/dist/agent/call-hierarchy.js +2 -4
- package/dist/agent/call-hierarchy.js.map +1 -1
- package/dist/agent/explore.d.ts +1 -1
- package/dist/agent/explore.d.ts.map +1 -1
- package/dist/agent/explore.js +3 -2
- package/dist/agent/explore.js.map +1 -1
- package/dist/agent/refactor-plan.js +2 -4
- package/dist/agent/refactor-plan.js.map +1 -1
- package/dist/agent/rename-preview.d.ts.map +1 -1
- package/dist/agent/rename-preview.js +58 -8
- package/dist/agent/rename-preview.js.map +1 -1
- package/dist/agent/search.js +2 -3
- package/dist/agent/search.js.map +1 -1
- package/dist/agent/semantic-symbols.d.ts.map +1 -1
- package/dist/agent/semantic-symbols.js +2 -3
- package/dist/agent/semantic-symbols.js.map +1 -1
- package/dist/agent/type-hierarchy.js +2 -4
- package/dist/agent/type-hierarchy.js.map +1 -1
- package/dist/agent/workspace-symbols.d.ts.map +1 -1
- package/dist/agent/workspace-symbols.js +2 -3
- package/dist/agent/workspace-symbols.js.map +1 -1
- package/dist/agent-tools.d.ts +0 -4
- package/dist/agent-tools.d.ts.map +1 -1
- package/dist/agent-tools.js +3 -6
- package/dist/agent-tools.js.map +1 -1
- package/dist/analysis-summary.d.ts +8 -4
- package/dist/analysis-summary.d.ts.map +1 -1
- package/dist/analysis-summary.js +15 -66
- package/dist/analysis-summary.js.map +1 -1
- package/dist/bin/cli.js +14417 -16886
- package/dist/bin/query-index-worker.js +229 -99
- package/dist/cli/command-table.d.ts.map +1 -1
- package/dist/cli/command-table.js +9 -17
- package/dist/cli/command-table.js.map +1 -1
- package/dist/cli/context.js +10 -10
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/drift.d.ts +0 -2
- package/dist/cli/drift.d.ts.map +1 -1
- package/dist/cli/drift.js +0 -1
- package/dist/cli/drift.js.map +1 -1
- package/dist/cli/graph-delta.d.ts +0 -2
- package/dist/cli/graph-delta.d.ts.map +1 -1
- package/dist/cli/graph-delta.js +0 -4
- package/dist/cli/graph-delta.js.map +1 -1
- package/dist/cli/graph.d.ts +0 -3
- package/dist/cli/graph.d.ts.map +1 -1
- package/dist/cli/graph.js +4 -14
- package/dist/cli/graph.js.map +1 -1
- package/dist/cli/help.d.ts +34 -34
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +6 -13
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/impact.d.ts +0 -2
- package/dist/cli/impact.d.ts.map +1 -1
- package/dist/cli/impact.js +0 -1
- package/dist/cli/impact.js.map +1 -1
- package/dist/cli/index.d.ts +0 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/inspect.d.ts +0 -2
- package/dist/cli/inspect.d.ts.map +1 -1
- package/dist/cli/inspect.js +5 -8
- package/dist/cli/inspect.js.map +1 -1
- package/dist/cli/invocation-context.d.ts +0 -3
- package/dist/cli/invocation-context.d.ts.map +1 -1
- package/dist/cli/invocation-context.js +4 -16
- package/dist/cli/invocation-context.js.map +1 -1
- package/dist/cli/navigation.d.ts +0 -2
- package/dist/cli/navigation.d.ts.map +1 -1
- package/dist/cli/navigation.js +0 -1
- package/dist/cli/navigation.js.map +1 -1
- package/dist/cli/options.d.ts.map +1 -1
- package/dist/cli/options.js +2 -12
- package/dist/cli/options.js.map +1 -1
- package/dist/cli/review.d.ts +0 -2
- package/dist/cli/review.d.ts.map +1 -1
- package/dist/cli/review.js +0 -5
- package/dist/cli/review.js.map +1 -1
- package/dist/cli/root-policy.d.ts +0 -2
- package/dist/cli/root-policy.d.ts.map +1 -1
- package/dist/cli/root-policy.js +0 -8
- package/dist/cli/root-policy.js.map +1 -1
- package/dist/cli/server.d.ts.map +1 -1
- package/dist/cli/server.js +0 -2
- package/dist/cli/server.js.map +1 -1
- package/dist/drift/git.d.ts.map +1 -1
- package/dist/drift/git.js +0 -1
- package/dist/drift/git.js.map +1 -1
- package/dist/drift/snapshot.d.ts.map +1 -1
- package/dist/drift/snapshot.js +0 -1
- package/dist/drift/snapshot.js.map +1 -1
- package/dist/drift/types.d.ts +0 -2
- package/dist/drift/types.d.ts.map +1 -1
- package/dist/drift/types.js.map +1 -1
- package/dist/duplicates/unit-cache.d.ts +0 -1
- package/dist/duplicates/unit-cache.d.ts.map +1 -1
- package/dist/duplicates/unit-cache.js +3 -11
- package/dist/duplicates/unit-cache.js.map +1 -1
- package/dist/duplicates/units.d.ts +5 -5
- package/dist/duplicates/units.d.ts.map +1 -1
- package/dist/duplicates/units.js +25 -88
- package/dist/duplicates/units.js.map +1 -1
- package/dist/graph-builder.d.ts +0 -6
- package/dist/graph-builder.d.ts.map +1 -1
- package/dist/graph-builder.js +2 -5
- package/dist/graph-builder.js.map +1 -1
- package/dist/graph-edge-collector.d.ts +1 -6
- package/dist/graph-edge-collector.d.ts.map +1 -1
- package/dist/graph-edge-collector.js +23 -21
- package/dist/graph-edge-collector.js.map +1 -1
- package/dist/graphs/edge-resolution.d.ts +1 -1
- package/dist/graphs/edge-resolution.d.ts.map +1 -1
- package/dist/graphs/edge-resolution.js +22 -98
- package/dist/graphs/edge-resolution.js.map +1 -1
- package/dist/graphs/specifiers.d.ts +4 -13
- package/dist/graphs/specifiers.d.ts.map +1 -1
- package/dist/graphs/specifiers.js +76 -173
- package/dist/graphs/specifiers.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts +12 -3
- package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/edge-passes.js +315 -177
- package/dist/graphs/symbol-graph-detailed/edge-passes.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/import-aliases.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/import-aliases.js +11 -0
- package/dist/graphs/symbol-graph-detailed/import-aliases.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts +25 -22
- package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/receiver-calls.js +216 -147
- package/dist/graphs/symbol-graph-detailed/receiver-calls.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed.js +80 -71
- package/dist/graphs/symbol-graph-detailed.js.map +1 -1
- package/dist/graphs/symbol-graph.d.ts +1 -1
- package/dist/graphs/symbol-graph.d.ts.map +1 -1
- package/dist/graphs/symbol-graph.js +12 -4
- package/dist/graphs/symbol-graph.js.map +1 -1
- package/dist/graphs/types.d.ts +0 -4
- package/dist/graphs/types.d.ts.map +1 -1
- package/dist/graphs.d.ts +1 -1
- package/dist/graphs.d.ts.map +1 -1
- package/dist/impact/analyzer.d.ts.map +1 -1
- package/dist/impact/analyzer.js +94 -1
- package/dist/impact/analyzer.js.map +1 -1
- package/dist/impact/call-compatibility.d.ts.map +1 -1
- package/dist/impact/call-compatibility.js +39 -43
- package/dist/impact/call-compatibility.js.map +1 -1
- package/dist/impact/transitive.d.ts +6 -2
- package/dist/impact/transitive.d.ts.map +1 -1
- package/dist/impact/transitive.js +23 -11
- package/dist/impact/transitive.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/indexer/build-cache/module-cache.d.ts +1 -1
- package/dist/indexer/build-cache/module-cache.d.ts.map +1 -1
- package/dist/indexer/build-cache/module-cache.js +67 -12
- package/dist/indexer/build-cache/module-cache.js.map +1 -1
- package/dist/indexer/build-cache/options.d.ts +17 -2
- package/dist/indexer/build-cache/options.d.ts.map +1 -1
- package/dist/indexer/build-cache/options.js +19 -29
- package/dist/indexer/build-cache/options.js.map +1 -1
- package/dist/indexer/build-cache/project-snapshot.d.ts +3 -4
- package/dist/indexer/build-cache/project-snapshot.d.ts.map +1 -1
- package/dist/indexer/build-cache/project-snapshot.js +53 -62
- package/dist/indexer/build-cache/project-snapshot.js.map +1 -1
- package/dist/indexer/build-cache/reports.d.ts +0 -2
- package/dist/indexer/build-cache/reports.d.ts.map +1 -1
- package/dist/indexer/build-cache/reports.js +0 -97
- package/dist/indexer/build-cache/reports.js.map +1 -1
- package/dist/indexer/build-cache.d.ts +1 -1
- package/dist/indexer/build-cache.d.ts.map +1 -1
- package/dist/indexer/build-cache.js +1 -1
- package/dist/indexer/build-cache.js.map +1 -1
- package/dist/indexer/build-index.d.ts.map +1 -1
- package/dist/indexer/build-index.js +72 -58
- package/dist/indexer/build-index.js.map +1 -1
- package/dist/indexer/build-workers.d.ts.map +1 -1
- package/dist/indexer/build-workers.js +9 -9
- package/dist/indexer/build-workers.js.map +1 -1
- package/dist/indexer/callable-identity.d.ts +24 -0
- package/dist/indexer/callable-identity.d.ts.map +1 -0
- package/dist/indexer/callable-identity.js +111 -0
- package/dist/indexer/callable-identity.js.map +1 -0
- package/dist/indexer/compilation-units.d.ts +2 -0
- package/dist/indexer/compilation-units.d.ts.map +1 -1
- package/dist/indexer/compilation-units.js +20 -18
- package/dist/indexer/compilation-units.js.map +1 -1
- package/dist/indexer/cpp-callables.d.ts +12 -7
- package/dist/indexer/cpp-callables.d.ts.map +1 -1
- package/dist/indexer/cpp-callables.js +42 -34
- package/dist/indexer/cpp-callables.js.map +1 -1
- package/dist/indexer/declaration-visibility.d.ts +7 -0
- package/dist/indexer/declaration-visibility.d.ts.map +1 -1
- package/dist/indexer/declaration-visibility.js +22 -0
- package/dist/indexer/declaration-visibility.js.map +1 -1
- package/dist/indexer/declarations.d.ts.map +1 -1
- package/dist/indexer/declarations.js +32 -7
- package/dist/indexer/declarations.js.map +1 -1
- package/dist/indexer/expand-star-imports.d.ts +6 -1
- package/dist/indexer/expand-star-imports.d.ts.map +1 -1
- package/dist/indexer/expand-star-imports.js +120 -48
- package/dist/indexer/expand-star-imports.js.map +1 -1
- package/dist/indexer/finalize.d.ts.map +1 -1
- package/dist/indexer/finalize.js +0 -1
- package/dist/indexer/finalize.js.map +1 -1
- package/dist/indexer/import-resolution-tables.d.ts +72 -0
- package/dist/indexer/import-resolution-tables.d.ts.map +1 -0
- package/dist/indexer/import-resolution-tables.js +147 -0
- package/dist/indexer/import-resolution-tables.js.map +1 -0
- package/dist/indexer/import-types.d.ts +18 -1
- package/dist/indexer/import-types.d.ts.map +1 -1
- package/dist/indexer/import-types.js.map +1 -1
- package/dist/indexer/imports/context.d.ts +6 -1
- package/dist/indexer/imports/context.d.ts.map +1 -1
- package/dist/indexer/imports/import-binding-tables.d.ts +3 -2
- package/dist/indexer/imports/import-binding-tables.d.ts.map +1 -1
- package/dist/indexer/imports/import-binding-tables.js +19 -22
- package/dist/indexer/imports/import-binding-tables.js.map +1 -1
- package/dist/indexer/imports/native-captures.d.ts.map +1 -1
- package/dist/indexer/imports/native-captures.js +10 -4
- package/dist/indexer/imports/native-captures.js.map +1 -1
- package/dist/indexer/imports/python.d.ts.map +1 -1
- package/dist/indexer/imports/python.js +46 -81
- package/dist/indexer/imports/python.js.map +1 -1
- package/dist/indexer/imports/text-import-extractors.d.ts.map +1 -1
- package/dist/indexer/imports/text-import-extractors.js +17 -7
- package/dist/indexer/imports/text-import-extractors.js.map +1 -1
- package/dist/indexer/imports.d.ts +3 -4
- package/dist/indexer/imports.d.ts.map +1 -1
- package/dist/indexer/imports.js +106 -81
- package/dist/indexer/imports.js.map +1 -1
- package/dist/indexer/incremental-plan.d.ts.map +1 -1
- package/dist/indexer/incremental-plan.js +27 -11
- package/dist/indexer/incremental-plan.js.map +1 -1
- package/dist/indexer/locals-and-exports.d.ts +1 -2
- package/dist/indexer/locals-and-exports.d.ts.map +1 -1
- package/dist/indexer/locals-and-exports.js +121 -43
- package/dist/indexer/locals-and-exports.js.map +1 -1
- package/dist/indexer/member-selection.d.ts +46 -0
- package/dist/indexer/member-selection.d.ts.map +1 -0
- package/dist/indexer/member-selection.js +169 -0
- package/dist/indexer/member-selection.js.map +1 -0
- package/dist/indexer/name-lookup-policies/c-family.d.ts +1 -1
- package/dist/indexer/name-lookup-policies/c-family.d.ts.map +1 -1
- package/dist/indexer/name-lookup-policies/c-family.js +30 -10
- package/dist/indexer/name-lookup-policies/c-family.js.map +1 -1
- package/dist/indexer/name-lookup-policies/implicit-self.d.ts.map +1 -1
- package/dist/indexer/name-lookup-policies/implicit-self.js +14 -8
- package/dist/indexer/name-lookup-policies/implicit-self.js.map +1 -1
- package/dist/indexer/name-lookup-policies/index.d.ts.map +1 -1
- package/dist/indexer/name-lookup-policies/index.js +29 -3
- package/dist/indexer/name-lookup-policies/index.js.map +1 -1
- package/dist/indexer/name-lookup-policies/php.d.ts.map +1 -1
- package/dist/indexer/name-lookup-policies/php.js +9 -2
- package/dist/indexer/name-lookup-policies/php.js.map +1 -1
- package/dist/indexer/name-resolution-types.d.ts +2 -0
- package/dist/indexer/name-resolution-types.d.ts.map +1 -1
- package/dist/indexer/name-resolution.d.ts +5 -0
- package/dist/indexer/name-resolution.d.ts.map +1 -1
- package/dist/indexer/name-resolution.js +17 -2
- package/dist/indexer/name-resolution.js.map +1 -1
- package/dist/indexer/navigation-cpp.d.ts +8 -0
- package/dist/indexer/navigation-cpp.d.ts.map +1 -1
- package/dist/indexer/navigation-cpp.js +283 -2
- package/dist/indexer/navigation-cpp.js.map +1 -1
- package/dist/indexer/navigation-goto.d.ts +11 -2
- package/dist/indexer/navigation-goto.d.ts.map +1 -1
- package/dist/indexer/navigation-goto.js +675 -333
- package/dist/indexer/navigation-goto.js.map +1 -1
- package/dist/indexer/navigation-local.d.ts +4 -1
- package/dist/indexer/navigation-local.d.ts.map +1 -1
- package/dist/indexer/navigation-local.js +43 -23
- package/dist/indexer/navigation-local.js.map +1 -1
- package/dist/indexer/navigation-provenance.d.ts +1 -1
- package/dist/indexer/navigation-provenance.d.ts.map +1 -1
- package/dist/indexer/navigation-provenance.js +4 -13
- package/dist/indexer/navigation-provenance.js.map +1 -1
- package/dist/indexer/navigation-references.d.ts +1 -1
- package/dist/indexer/navigation-references.d.ts.map +1 -1
- package/dist/indexer/navigation-references.js +44 -16
- package/dist/indexer/navigation-references.js.map +1 -1
- package/dist/indexer/navigation-resolve.d.ts +13 -0
- package/dist/indexer/navigation-resolve.d.ts.map +1 -1
- package/dist/indexer/navigation-resolve.js +158 -5
- package/dist/indexer/navigation-resolve.js.map +1 -1
- package/dist/indexer/navigation.d.ts +2 -1
- package/dist/indexer/navigation.d.ts.map +1 -1
- package/dist/indexer/navigation.js +82 -57
- package/dist/indexer/navigation.js.map +1 -1
- package/dist/indexer/parse-context.d.ts +2 -3
- package/dist/indexer/parse-context.d.ts.map +1 -1
- package/dist/indexer/parse-context.js +8 -21
- package/dist/indexer/parse-context.js.map +1 -1
- package/dist/indexer/reference-candidates.d.ts.map +1 -1
- package/dist/indexer/reference-candidates.js +13 -7
- package/dist/indexer/reference-candidates.js.map +1 -1
- package/dist/indexer/reference-context.d.ts.map +1 -1
- package/dist/indexer/reference-context.js +4 -1
- package/dist/indexer/reference-context.js.map +1 -1
- package/dist/indexer/scope-nodes.d.ts.map +1 -1
- package/dist/indexer/scope-nodes.js +5 -0
- package/dist/indexer/scope-nodes.js.map +1 -1
- package/dist/indexer/scope-types.d.ts +4 -0
- package/dist/indexer/scope-types.d.ts.map +1 -1
- package/dist/indexer/scope.d.ts +2 -3
- package/dist/indexer/scope.d.ts.map +1 -1
- package/dist/indexer/scope.js +85 -13
- package/dist/indexer/scope.js.map +1 -1
- package/dist/indexer/shared-owner-identity.js +1 -1
- package/dist/indexer/shared-owner-identity.js.map +1 -1
- package/dist/indexer/star-import-precedence.d.ts +6 -7
- package/dist/indexer/star-import-precedence.d.ts.map +1 -1
- package/dist/indexer/star-import-precedence.js +18 -12
- package/dist/indexer/star-import-precedence.js.map +1 -1
- package/dist/indexer/ts-callables.d.ts +15 -24
- package/dist/indexer/ts-callables.d.ts.map +1 -1
- package/dist/indexer/ts-callables.js +44 -75
- package/dist/indexer/ts-callables.js.map +1 -1
- package/dist/indexer/types.d.ts +23 -26
- package/dist/indexer/types.d.ts.map +1 -1
- package/dist/indexer/types.js +4 -0
- package/dist/indexer/types.js.map +1 -1
- package/dist/indexer.d.ts +2 -7
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js.map +1 -1
- package/dist/languages/all.d.ts +1 -0
- package/dist/languages/all.d.ts.map +1 -1
- package/dist/languages/all.js +1 -0
- package/dist/languages/all.js.map +1 -1
- package/dist/languages/callable-arity.d.ts +21 -0
- package/dist/languages/callable-arity.d.ts.map +1 -1
- package/dist/languages/callable-arity.js +17 -0
- package/dist/languages/callable-arity.js.map +1 -1
- package/dist/languages/definitions/terraform.d.ts +9 -0
- package/dist/languages/definitions/terraform.d.ts.map +1 -0
- package/dist/languages/definitions/terraform.js +84 -0
- package/dist/languages/definitions/terraform.js.map +1 -0
- package/dist/languages/definitions/zig.d.ts.map +1 -1
- package/dist/languages/definitions/zig.js +6 -0
- package/dist/languages/definitions/zig.js.map +1 -1
- package/dist/languages.d.ts +1 -0
- package/dist/languages.d.ts.map +1 -1
- package/dist/languages.js +1 -0
- package/dist/languages.js.map +1 -1
- package/dist/lifecycle/manifest.d.ts.map +1 -1
- package/dist/lifecycle/manifest.js +0 -1
- package/dist/lifecycle/manifest.js.map +1 -1
- package/dist/native/byte-index.d.ts +6 -0
- package/dist/native/byte-index.d.ts.map +1 -1
- package/dist/native/byte-index.js +11 -6
- package/dist/native/byte-index.js.map +1 -1
- package/dist/native/contracts.d.ts +2 -3
- package/dist/native/contracts.d.ts.map +1 -1
- package/dist/native/execution.d.ts +9 -9
- package/dist/native/execution.d.ts.map +1 -1
- package/dist/native/execution.js +37 -77
- package/dist/native/execution.js.map +1 -1
- package/dist/native/js-bridge.d.ts +2 -15
- package/dist/native/js-bridge.d.ts.map +1 -1
- package/dist/native/js-bridge.js +2 -15
- package/dist/native/js-bridge.js.map +1 -1
- package/dist/native/query-results.js +2 -2
- package/dist/native/query-results.js.map +1 -1
- package/dist/native/runtime.d.ts +12 -12
- package/dist/native/runtime.d.ts.map +1 -1
- package/dist/native/runtime.js +24 -69
- package/dist/native/runtime.js.map +1 -1
- package/dist/native/tree-sitter-native.d.ts +3 -3
- package/dist/native/tree-sitter-native.d.ts.map +1 -1
- package/dist/native/tree-sitter-native.js +2 -2
- package/dist/native/tree-sitter-native.js.map +1 -1
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +0 -4
- package/dist/presets.js.map +1 -1
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +2 -20
- package/dist/review.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +0 -5
- package/dist/session.js.map +1 -1
- package/dist/sql/navigation.js +1 -1
- package/dist/sql/navigation.js.map +1 -1
- package/dist/terraform/navigation.d.ts +20 -0
- package/dist/terraform/navigation.d.ts.map +1 -0
- package/dist/terraform/navigation.js +142 -0
- package/dist/terraform/navigation.js.map +1 -0
- package/dist/terraform/resolution.d.ts +82 -0
- package/dist/terraform/resolution.d.ts.map +1 -0
- package/dist/terraform/resolution.js +324 -0
- package/dist/terraform/resolution.js.map +1 -0
- package/dist/terraform/syntax.d.ts +109 -0
- package/dist/terraform/syntax.d.ts.map +1 -0
- package/dist/terraform/syntax.js +441 -0
- package/dist/terraform/syntax.js.map +1 -0
- package/dist/util/bloom-filter.d.ts +1 -0
- package/dist/util/bloom-filter.d.ts.map +1 -1
- package/dist/util/bloom-filter.js +3 -0
- package/dist/util/bloom-filter.js.map +1 -1
- package/dist/util/glob.d.ts +32 -0
- package/dist/util/glob.d.ts.map +1 -0
- package/dist/util/glob.js +137 -0
- package/dist/util/glob.js.map +1 -0
- package/dist/util/member-access-tables.d.ts.map +1 -1
- package/dist/util/member-access-tables.js +5 -0
- package/dist/util/member-access-tables.js.map +1 -1
- package/dist/util/member-access.d.ts.map +1 -1
- package/dist/util/member-access.js +5 -2
- package/dist/util/member-access.js.map +1 -1
- package/dist/util/project-files.d.ts +2 -10
- package/dist/util/project-files.d.ts.map +1 -1
- package/dist/util/project-files.js +32 -52
- package/dist/util/project-files.js.map +1 -1
- package/dist/util/python-type-checking.d.ts +18 -0
- package/dist/util/python-type-checking.d.ts.map +1 -0
- package/dist/util/python-type-checking.js +160 -0
- package/dist/util/python-type-checking.js.map +1 -0
- package/dist/util/resolution/jvm.d.ts +7 -3
- package/dist/util/resolution/jvm.d.ts.map +1 -1
- package/dist/util/resolution/jvm.js +56 -38
- package/dist/util/resolution/jvm.js.map +1 -1
- package/dist/util/resolution/rust.d.ts +0 -1
- package/dist/util/resolution/rust.d.ts.map +1 -1
- package/dist/util/resolution/rust.js +0 -9
- package/dist/util/resolution/rust.js.map +1 -1
- package/dist/util/resolution/specifier-targets.d.ts +44 -0
- package/dist/util/resolution/specifier-targets.d.ts.map +1 -0
- package/dist/util/resolution/specifier-targets.js +157 -0
- package/dist/util/resolution/specifier-targets.js.map +1 -0
- package/dist/util/resolution/terraform.d.ts +18 -0
- package/dist/util/resolution/terraform.d.ts.map +1 -0
- package/dist/util/resolution/terraform.js +64 -0
- package/dist/util/resolution/terraform.js.map +1 -0
- package/dist/util/resolution.d.ts.map +1 -1
- package/dist/util/resolution.js +5 -10
- package/dist/util/resolution.js.map +1 -1
- package/dist/util/specifiers.d.ts +9 -1
- package/dist/util/specifiers.d.ts.map +1 -1
- package/dist/util/specifiers.js +27 -8
- package/dist/util/specifiers.js.map +1 -1
- package/dist/util/trivia-tables.d.ts.map +1 -1
- package/dist/util/trivia-tables.js +9 -0
- package/dist/util/trivia-tables.js.map +1 -1
- package/dist/util/trivia.d.ts.map +1 -1
- package/dist/util/trivia.js +49 -30
- package/dist/util/trivia.js.map +1 -1
- package/dist/util/workspace.d.ts.map +1 -1
- package/dist/util/workspace.js +32 -4
- package/dist/util/workspace.js.map +1 -1
- package/package.json +6 -8
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import { findCommentEnd } from "../../impact/call-compatibility/text-scanner.js";
|
|
3
3
|
import { isGoExportedMemberName } from "../../indexer/declaration-visibility.js";
|
|
4
|
+
import { hasSeparateMemberScopes, inheritsMemberOverloads, selectMember, } from "../../indexer/member-selection.js";
|
|
4
5
|
import { SymbolKind } from "../../indexer/types.js";
|
|
6
|
+
import { supportForFileWithoutHeaderSample } from "../../languages.js";
|
|
5
7
|
import { isJsTsLanguage } from "../../languages/js-family.js";
|
|
6
8
|
import { sliceText } from "../../util/ast.js";
|
|
7
9
|
import { foldPhpIdentifierCase, XID_IDENTIFIER_SOURCE } from "../../util/identifiers.js";
|
|
@@ -16,6 +18,7 @@ const STATIC_MEMBER_LANGUAGES = {
|
|
|
16
18
|
java: true,
|
|
17
19
|
js: true,
|
|
18
20
|
php: true,
|
|
21
|
+
ruby: true,
|
|
19
22
|
swift: true,
|
|
20
23
|
ts: true,
|
|
21
24
|
tsx: true,
|
|
@@ -280,8 +283,6 @@ const LANGUAGE_CONSTRUCTION_FORMS = {
|
|
|
280
283
|
tsx: { newExpression: true },
|
|
281
284
|
zig: { compositeLiteral: true },
|
|
282
285
|
};
|
|
283
|
-
/** Guards against a cyclic or pathological declared hierarchy. */
|
|
284
|
-
const MAX_SUPERTYPE_DEPTH = 16;
|
|
285
286
|
/**
|
|
286
287
|
* Resolves the receiver and member-name nodes of a call, or null when the call has no
|
|
287
288
|
* receiver or its shape is not a member access. `callee` is the call's resolved callee
|
|
@@ -667,7 +668,7 @@ function bindingValueExpression(node) {
|
|
|
667
668
|
]);
|
|
668
669
|
return node.namedChildren.find((child) => expressionTypes.has(child.type)) ?? null;
|
|
669
670
|
}
|
|
670
|
-
function declaredTypeNameNode(node, sup) {
|
|
671
|
+
export function declaredTypeNameNode(node, sup) {
|
|
671
672
|
const typeField = node.childForFieldName("type");
|
|
672
673
|
if (typeField)
|
|
673
674
|
return unwrapNamedType(typeField, sup) ?? typeField;
|
|
@@ -677,6 +678,8 @@ function declaredTypeNameNode(node, sup) {
|
|
|
677
678
|
child.type === "type");
|
|
678
679
|
if (typedChild)
|
|
679
680
|
return unwrapNamedType(typedChild, sup) ?? typedChild;
|
|
681
|
+
if (node.type === "let_declaration")
|
|
682
|
+
return null;
|
|
680
683
|
const ids = node.namedChildren.filter((child) => isReceiverNameNode(sup, child.type) || child.type === "type_identifier" || child.type === "name");
|
|
681
684
|
if (ids.length >= 2)
|
|
682
685
|
return unwrapNamedType(ids[0], sup);
|
|
@@ -758,6 +761,9 @@ function bindingProof(node, receiverName, source, sup) {
|
|
|
758
761
|
const annotated = annotation ? (unwrapNamedType(annotation, sup) ?? typescriptImportTypeQuery(annotation)) : null;
|
|
759
762
|
if (annotated)
|
|
760
763
|
return { status: "declared", node: annotated };
|
|
764
|
+
const declared = declaredTypeNameNode(node, sup);
|
|
765
|
+
if (declared)
|
|
766
|
+
return { status: "declared", node: declared };
|
|
761
767
|
const typeNode = constructionTypeFromBinding(node, receiverName, source, sup);
|
|
762
768
|
if (typeNode)
|
|
763
769
|
return { status: "type", node: typeNode };
|
|
@@ -767,7 +773,7 @@ function isSkippableBindingContainer(node, receiver) {
|
|
|
767
773
|
return BINDING_CONTAINER_TYPES.has(node.type) && !containsIndex(node, receiver.startIndex);
|
|
768
774
|
}
|
|
769
775
|
function findPriorConstructorInContainer(node, receiver, receiverName, source, sup) {
|
|
770
|
-
let
|
|
776
|
+
let typeEvidence = null;
|
|
771
777
|
let sawUnproven = false;
|
|
772
778
|
let declared = false;
|
|
773
779
|
const visit = (current) => {
|
|
@@ -777,16 +783,16 @@ function findPriorConstructorInContainer(node, receiver, receiverName, source, s
|
|
|
777
783
|
return true;
|
|
778
784
|
const proof = bindingProof(current, receiverName, source, sup);
|
|
779
785
|
if (proof.status === "declared") {
|
|
780
|
-
|
|
781
|
-
declared =
|
|
786
|
+
typeEvidence = { typeNode: proof.node, origin: "declared-type" };
|
|
787
|
+
declared = isJsTsLanguage(sup.id);
|
|
782
788
|
return true;
|
|
783
789
|
}
|
|
784
790
|
// A later assignment to an annotated binding cannot change its declared type.
|
|
785
791
|
if (declared && proof.status !== "none")
|
|
786
792
|
return true;
|
|
787
793
|
if (proof.status === "unproven") {
|
|
788
|
-
if (
|
|
789
|
-
|
|
794
|
+
if (typeEvidence) {
|
|
795
|
+
typeEvidence = null;
|
|
790
796
|
return false;
|
|
791
797
|
}
|
|
792
798
|
sawUnproven = true;
|
|
@@ -794,14 +800,14 @@ function findPriorConstructorInContainer(node, receiver, receiverName, source, s
|
|
|
794
800
|
}
|
|
795
801
|
if (proof.status === "type") {
|
|
796
802
|
if (sawUnproven) {
|
|
797
|
-
|
|
803
|
+
typeEvidence = null;
|
|
798
804
|
return false;
|
|
799
805
|
}
|
|
800
|
-
if (
|
|
801
|
-
|
|
806
|
+
if (typeEvidence && sliceText(typeEvidence.typeNode, source) !== sliceText(proof.node, source)) {
|
|
807
|
+
typeEvidence = null;
|
|
802
808
|
return false;
|
|
803
809
|
}
|
|
804
|
-
|
|
810
|
+
typeEvidence = { typeNode: proof.node, origin: "constructor" };
|
|
805
811
|
return true;
|
|
806
812
|
}
|
|
807
813
|
for (const child of current.namedChildren) {
|
|
@@ -811,7 +817,7 @@ function findPriorConstructorInContainer(node, receiver, receiverName, source, s
|
|
|
811
817
|
return true;
|
|
812
818
|
};
|
|
813
819
|
visit(node);
|
|
814
|
-
return
|
|
820
|
+
return typeEvidence;
|
|
815
821
|
}
|
|
816
822
|
function bindingContainerDeclaresNameBefore(node, receiver, receiverName, source, sup) {
|
|
817
823
|
const visit = (current) => {
|
|
@@ -853,23 +859,21 @@ function findVisiblePriorConstructor(receiver, receiverName, source, sup) {
|
|
|
853
859
|
}
|
|
854
860
|
return findPriorConstructorInContainer(rootOf(receiver), receiver, receiverName, source, sup);
|
|
855
861
|
}
|
|
856
|
-
/**
|
|
857
|
-
|
|
858
|
-
* null when no constructor is proven for it. Shared with detailed symbol-graph call
|
|
859
|
-
* extraction so `goto` and resolved `calls` edges accept the same receiver forms.
|
|
860
|
-
* A bare name is unit-struct construction only while no local binding of the same
|
|
861
|
-
* name shadows it; a shadowing binding is a value whose type must come from the
|
|
862
|
-
* binding, never from the type the name also spells.
|
|
863
|
-
*/
|
|
864
|
-
export function receiverConstructorExpression(obj, source, sup) {
|
|
862
|
+
/** Constructor or declared type visible at a receiver, without resolving its owner. */
|
|
863
|
+
function receiverTypeEvidence(obj, source, sup) {
|
|
865
864
|
const direct = constructionTypeName(obj, source, sup);
|
|
866
865
|
if (!isReceiverNameNode(sup, obj.type))
|
|
867
|
-
return direct;
|
|
866
|
+
return direct ? { typeNode: direct, origin: "constructor" } : null;
|
|
868
867
|
const receiverName = sliceText(obj, source);
|
|
869
|
-
if (direct && !bindsLocalValue(obj, receiverName, source, sup))
|
|
870
|
-
return direct;
|
|
868
|
+
if (direct && !bindsLocalValue(obj, receiverName, source, sup)) {
|
|
869
|
+
return { typeNode: direct, origin: "constructor" };
|
|
870
|
+
}
|
|
871
871
|
return findVisiblePriorConstructor(obj, receiverName, source, sup);
|
|
872
872
|
}
|
|
873
|
+
/** Syntax naming the type of a constructed or declared receiver. */
|
|
874
|
+
export function receiverConstructorExpression(obj, source, sup) {
|
|
875
|
+
return receiverTypeEvidence(obj, source, sup)?.typeNode ?? null;
|
|
876
|
+
}
|
|
873
877
|
/** Identifier segments in a C++ qualified name, excluding template arguments. */
|
|
874
878
|
export function cppQualifiedNameSegments(node, source) {
|
|
875
879
|
return cppQualifiedTextSegments(sliceText(node, source));
|
|
@@ -1024,6 +1028,10 @@ export function cppOutOfLineMemberDeclarationNode(definitionNameNode, localName,
|
|
|
1024
1028
|
return declarations.length === 1 ? declarations[0] : null;
|
|
1025
1029
|
}
|
|
1026
1030
|
export function nodeDeclaresStatic(node, source) {
|
|
1031
|
+
if (node.type === "singleton_method") {
|
|
1032
|
+
const receiver = node.childForFieldName("object") ?? node.childForFieldName("receiver") ?? node.namedChildren[0];
|
|
1033
|
+
return !!receiver && sliceText(receiver, source).trim() === "self";
|
|
1034
|
+
}
|
|
1027
1035
|
if (node.type === "static" || node.type === "static_modifier")
|
|
1028
1036
|
return true;
|
|
1029
1037
|
if (node.type === "storage_class_specifier" || node.type === "modifier" || node.type === "property_modifier") {
|
|
@@ -1125,48 +1133,48 @@ export function csharpDottedNameRoot(node) {
|
|
|
1125
1133
|
return null;
|
|
1126
1134
|
return csharpDottedNameRoot(object);
|
|
1127
1135
|
}
|
|
1128
|
-
/**
|
|
1129
|
-
|
|
1130
|
-
* Returns null when the receiver cannot be proven.
|
|
1131
|
-
* Named-local constructor lookup is memoized per enclosing function and receiver text.
|
|
1132
|
-
*/
|
|
1133
|
-
export function classifyReceiver(sup, receiver, source, proofCache, cacheScope, accessNode, hasLexicalBinding) {
|
|
1136
|
+
/** Classify a receiver from syntax and consumer-proven import bindings. */
|
|
1137
|
+
export function classifyReceiver(sup, receiver, source, proofCache, cacheScope, accessNode, hasLexicalBinding, classifyImport) {
|
|
1134
1138
|
const text = receiverKeywordText(sup, receiver, source, hasLexicalBinding);
|
|
1135
1139
|
if (!text)
|
|
1136
|
-
return
|
|
1140
|
+
return { kind: "unknown", receiver };
|
|
1137
1141
|
const keywordKind = keywordReceiverKind(sup.id, text);
|
|
1138
1142
|
if (keywordKind) {
|
|
1139
1143
|
if (keywordReceiverCrossesDynamicBoundary(sup, accessNode))
|
|
1140
|
-
return
|
|
1144
|
+
return { kind: "unknown", receiver };
|
|
1141
1145
|
const memberScope = keywordReceiverMemberScope(sup, text, accessNode, source);
|
|
1142
1146
|
return keywordKind === "own" ? { kind: "own-type", memberScope } : { kind: "supertype", memberScope };
|
|
1143
1147
|
}
|
|
1144
1148
|
const receiverIsName = isReceiverNameNode(sup, receiver.type);
|
|
1145
|
-
const
|
|
1146
|
-
|
|
1149
|
+
const importProof = receiverIsName ? classifyImport?.(text, receiver) : null;
|
|
1150
|
+
if (importProof === "module-import")
|
|
1151
|
+
return { kind: "module-import", receiver };
|
|
1152
|
+
const cacheKey = proofCache ? cacheScope + "\u0000" + text : "";
|
|
1153
|
+
let proof = proofCache?.get(cacheKey);
|
|
1147
1154
|
if (!proof) {
|
|
1148
|
-
const
|
|
1155
|
+
const typeEvidence = receiverTypeEvidence(receiver, source, sup);
|
|
1149
1156
|
proof = {
|
|
1150
|
-
|
|
1151
|
-
locallyBound: !
|
|
1157
|
+
typeEvidence,
|
|
1158
|
+
locallyBound: !typeEvidence && receiverIsName && bindsLocalValue(receiver, text, source, sup),
|
|
1152
1159
|
};
|
|
1153
|
-
proofCache
|
|
1160
|
+
proofCache?.set(cacheKey, proof);
|
|
1154
1161
|
}
|
|
1155
|
-
if (proof.
|
|
1162
|
+
if (proof.typeEvidence) {
|
|
1163
|
+
const { typeNode, origin } = proof.typeEvidence;
|
|
1156
1164
|
return {
|
|
1157
1165
|
kind: "named-type",
|
|
1158
|
-
|
|
1159
|
-
|
|
1166
|
+
proof: origin,
|
|
1167
|
+
typeName: sliceText(typeNode, source),
|
|
1168
|
+
typeNode,
|
|
1160
1169
|
memberScope: hasStaticMemberDistinction(sup.id) ? "instance" : "any",
|
|
1161
|
-
constructed:
|
|
1170
|
+
constructed: origin === "constructor",
|
|
1162
1171
|
};
|
|
1163
1172
|
}
|
|
1164
|
-
if (
|
|
1165
|
-
return
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
return null;
|
|
1173
|
+
if (importProof === "static-type") {
|
|
1174
|
+
return { kind: "named-type", proof: "static-type", typeName: text, typeNode: receiver, memberScope: "static" };
|
|
1175
|
+
}
|
|
1176
|
+
if (!receiverIsName || proof.locallyBound)
|
|
1177
|
+
return { kind: "unknown", receiver };
|
|
1170
1178
|
// Dotted `Cfg.load()` is not proof in languages where the identifier may be a
|
|
1171
1179
|
// value. Type-scoped `::` is one named-type proof; C# `Box.Left()` is another
|
|
1172
1180
|
// because a capitalized unbound name is the static type receiver. Ruby
|
|
@@ -1181,9 +1189,10 @@ export function classifyReceiver(sup, receiver, source, proofCache, cacheScope,
|
|
|
1181
1189
|
// The named type must still resolve to a members-declaring definition
|
|
1182
1190
|
// before any call edge is recorded, so a name alone never invents a target.
|
|
1183
1191
|
if (!capitalizedTypeReceiverName(sup, receiver, text))
|
|
1184
|
-
return
|
|
1192
|
+
return { kind: "unknown", receiver };
|
|
1185
1193
|
return {
|
|
1186
1194
|
kind: "named-type",
|
|
1195
|
+
proof: "static-type",
|
|
1187
1196
|
typeName: text,
|
|
1188
1197
|
typeNode: receiver,
|
|
1189
1198
|
memberScope: UNBOUND_INSTANCE_CALL_LANGUAGE_IDS[sup.id] ? "any" : "static",
|
|
@@ -1191,6 +1200,7 @@ export function classifyReceiver(sup, receiver, source, proofCache, cacheScope,
|
|
|
1191
1200
|
}
|
|
1192
1201
|
return {
|
|
1193
1202
|
kind: "named-type",
|
|
1203
|
+
proof: "static-type",
|
|
1194
1204
|
typeName: text,
|
|
1195
1205
|
typeNode: receiver,
|
|
1196
1206
|
memberScope: hasStaticMemberDistinction(sup.id) && typeScoped ? "static" : "any",
|
|
@@ -1214,6 +1224,7 @@ const STATIC_TYPE_NAME_RECEIVER_LANGUAGE_IDS = {
|
|
|
1214
1224
|
js: true,
|
|
1215
1225
|
kotlin: true,
|
|
1216
1226
|
ts: true,
|
|
1227
|
+
ruby: true,
|
|
1217
1228
|
tsx: true,
|
|
1218
1229
|
};
|
|
1219
1230
|
/** Whether a receiver name is capitalized like a type in a capitalized-name language. */
|
|
@@ -1456,12 +1467,95 @@ function callSiteKey(callerId, site) {
|
|
|
1456
1467
|
const { start, end } = site.range;
|
|
1457
1468
|
return `${callerId}\u0000${site.file}\u0000${start.line}:${start.column}:${start.index ?? ""}-${end.line}:${end.column}:${end.index ?? ""}`;
|
|
1458
1469
|
}
|
|
1470
|
+
/** Prove overriding member pairs only for hierarchy receiver calls. */
|
|
1471
|
+
export async function inheritedReceiverMemberSignatures(graph, candidates, definitions, ownerAnchors, accessibleMembers, languageExtensions, sameParameterTypes) {
|
|
1472
|
+
const signatures = new Map();
|
|
1473
|
+
const membersByOwner = new Map();
|
|
1474
|
+
const ownerByMember = new Map();
|
|
1475
|
+
const parentsByOwner = new Map();
|
|
1476
|
+
for (const edge of graph.edges) {
|
|
1477
|
+
if (edge.label === "member_of") {
|
|
1478
|
+
ownerByMember.set(edge.from, edge.to);
|
|
1479
|
+
if (definitions.has(edge.from)) {
|
|
1480
|
+
const members = membersByOwner.get(edge.to) ?? [];
|
|
1481
|
+
members.push(edge.from);
|
|
1482
|
+
membersByOwner.set(edge.to, members);
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
else if (edge.label && HIERARCHY_LABELS[edge.label]) {
|
|
1486
|
+
const parents = parentsByOwner.get(edge.from) ?? [];
|
|
1487
|
+
parents.push(edge.to);
|
|
1488
|
+
parentsByOwner.set(edge.from, parents);
|
|
1489
|
+
}
|
|
1490
|
+
}
|
|
1491
|
+
for (const [owner, accessible] of accessibleMembers) {
|
|
1492
|
+
const members = membersByOwner.get(owner) ?? [];
|
|
1493
|
+
for (const id of accessible)
|
|
1494
|
+
if (definitions.has(id) && !members.includes(id))
|
|
1495
|
+
members.push(id);
|
|
1496
|
+
membersByOwner.set(owner, members);
|
|
1497
|
+
}
|
|
1498
|
+
const checkedPairs = new Set();
|
|
1499
|
+
const checkedGroups = new Set();
|
|
1500
|
+
const separator = "\0";
|
|
1501
|
+
for (const candidate of candidates) {
|
|
1502
|
+
if (!inheritsMemberOverloads(supportForFileWithoutHeaderSample(candidate.site.file, languageExtensions)?.id ?? "")) {
|
|
1503
|
+
continue;
|
|
1504
|
+
}
|
|
1505
|
+
const rawOwner = candidate.ownerId ?? ownerByMember.get(candidate.callerId);
|
|
1506
|
+
if (!rawOwner)
|
|
1507
|
+
continue;
|
|
1508
|
+
const owner = ownerAnchors.get(rawOwner) ?? rawOwner;
|
|
1509
|
+
// Override pairs are a fact of the declarations, not of this call: an override that rejects
|
|
1510
|
+
// the argument count still hides the base declaration it overrides.
|
|
1511
|
+
const group = `${owner}\0${candidate.memberName}\0${candidate.viaSupertypes}`;
|
|
1512
|
+
if (checkedGroups.has(group))
|
|
1513
|
+
continue;
|
|
1514
|
+
checkedGroups.add(group);
|
|
1515
|
+
let level = candidate.viaSupertypes ? (parentsByOwner.get(owner) ?? []) : [owner];
|
|
1516
|
+
const seen = new Set([owner]);
|
|
1517
|
+
const shallower = [];
|
|
1518
|
+
for (let depth = 0; depth < 16 && level.length; depth += 1) {
|
|
1519
|
+
const current = [];
|
|
1520
|
+
const next = [];
|
|
1521
|
+
for (const id of level) {
|
|
1522
|
+
for (const memberId of membersByOwner.get(id) ?? []) {
|
|
1523
|
+
if (graph.nodes.get(memberId)?.name === candidate.memberName)
|
|
1524
|
+
current.push(memberId);
|
|
1525
|
+
}
|
|
1526
|
+
for (const parent of parentsByOwner.get(id) ?? []) {
|
|
1527
|
+
if (seen.has(parent))
|
|
1528
|
+
continue;
|
|
1529
|
+
seen.add(parent);
|
|
1530
|
+
next.push(parent);
|
|
1531
|
+
}
|
|
1532
|
+
}
|
|
1533
|
+
for (const derivedId of shallower) {
|
|
1534
|
+
const derived = definitions.get(derivedId);
|
|
1535
|
+
for (const inheritedId of current) {
|
|
1536
|
+
const pair = derivedId + separator + inheritedId;
|
|
1537
|
+
if (checkedPairs.has(pair))
|
|
1538
|
+
continue;
|
|
1539
|
+
checkedPairs.add(pair);
|
|
1540
|
+
if (!(await sameParameterTypes(derived, definitions.get(inheritedId))))
|
|
1541
|
+
continue;
|
|
1542
|
+
const inherited = signatures.get(derivedId) ?? new Set();
|
|
1543
|
+
inherited.add(inheritedId);
|
|
1544
|
+
signatures.set(derivedId, inherited);
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
shallower.push(...current);
|
|
1548
|
+
level = next;
|
|
1549
|
+
}
|
|
1550
|
+
}
|
|
1551
|
+
return signatures;
|
|
1552
|
+
}
|
|
1459
1553
|
/**
|
|
1460
1554
|
* Records proven `calls` edges for deferred receiver invocations.
|
|
1461
1555
|
* Ambiguous names at a level stop the walk.
|
|
1462
1556
|
* `super`/`base`/`parent` follow class `extends` ancestors only.
|
|
1463
1557
|
*/
|
|
1464
|
-
export function emitReceiverCallEdges(graph, candidates, recordEdge, memberScopes = new Map(), nodeAliases = new Map(), memberArities = new Map(), ownerAnchors = new Map(), accessibleMembers = new Map(), fileHiddenMemberIds = new Set(), acceptsCallTarget) {
|
|
1558
|
+
export function emitReceiverCallEdges(graph, candidates, recordEdge, memberScopes = new Map(), nodeAliases = new Map(), memberArities = new Map(), ownerAnchors = new Map(), accessibleMembers = new Map(), fileHiddenMemberIds = new Set(), acceptsCallTarget, callableIdentities = new Map(), languageExtensions, overridingSignatures, isReceiverMemberVisible) {
|
|
1465
1559
|
if (!candidates.length)
|
|
1466
1560
|
return [];
|
|
1467
1561
|
const membersByOwner = new Map();
|
|
@@ -1493,10 +1587,49 @@ export function emitReceiverCallEdges(graph, candidates, recordEdge, memberScope
|
|
|
1493
1587
|
for (const memberId of memberIds)
|
|
1494
1588
|
pushUnique(membersByOwner, ownerId, memberId);
|
|
1495
1589
|
}
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1590
|
+
let activeCandidate;
|
|
1591
|
+
const facts = new Map();
|
|
1592
|
+
for (const [ownerId, ids] of membersByOwner) {
|
|
1593
|
+
for (const id of ids) {
|
|
1594
|
+
const canonicalId = canonicalMemberId(id, nodeAliases);
|
|
1595
|
+
const indexed = callableIdentities.get(id) ?? callableIdentities.get(canonicalId);
|
|
1596
|
+
const bounds = memberArities.get(id) ?? memberArities.get(canonicalId);
|
|
1597
|
+
facts.set(id, {
|
|
1598
|
+
key: indexed?.key ?? canonicalId,
|
|
1599
|
+
owner: indexed?.owner ?? ownerId,
|
|
1600
|
+
kind: indexed?.kind ?? "function",
|
|
1601
|
+
arity: bounds ? { minArgs: bounds.min, maxArgs: bounds.max } : null,
|
|
1602
|
+
...(indexed?.role ? { role: indexed.role } : {}),
|
|
1603
|
+
});
|
|
1604
|
+
}
|
|
1605
|
+
}
|
|
1606
|
+
const model = {
|
|
1607
|
+
ownerKey: (id) => id,
|
|
1608
|
+
members: (id) => membersByOwner.get(id) ?? [],
|
|
1609
|
+
supertypes: (id, classOnly) => {
|
|
1610
|
+
if (!classOnly)
|
|
1611
|
+
return supertypesByOwner.get(id) ?? [];
|
|
1612
|
+
return (classAncestorsByOwner.get(id) ?? []).filter((base) => graph.nodes.get(base)?.kind === "class");
|
|
1613
|
+
},
|
|
1614
|
+
name: (id) => graph.nodes.get(id)?.name ?? graph.nodes.get(canonicalMemberId(id, nodeAliases))?.name ?? "",
|
|
1615
|
+
key: (id) => facts.get(id)?.key ?? canonicalMemberId(id, nodeAliases),
|
|
1616
|
+
callable: (id) => facts.get(id),
|
|
1617
|
+
scope: (id) => memberScopes.get(id) ?? memberScopes.get(canonicalMemberId(id, nodeAliases)) ?? "any",
|
|
1618
|
+
visible: (id, useFile) => {
|
|
1619
|
+
const canonicalId = canonicalMemberId(id, nodeAliases);
|
|
1620
|
+
const node = graph.nodes.get(id) ?? graph.nodes.get(canonicalId);
|
|
1621
|
+
if (!node || (node.kind !== "function" && !node.callable))
|
|
1622
|
+
return false;
|
|
1623
|
+
if (isReceiverMemberVisible && !isReceiverMemberVisible(canonicalId, useFile))
|
|
1624
|
+
return false;
|
|
1625
|
+
if ((fileHiddenMemberIds.has(id) || fileHiddenMemberIds.has(canonicalId)) &&
|
|
1626
|
+
fileIdentityKey(node.file) !== fileIdentityKey(useFile))
|
|
1627
|
+
return false;
|
|
1628
|
+
return (!activeCandidate.goPackagePeerFiles ||
|
|
1629
|
+
isGoExportedMemberName("go", node.name) ||
|
|
1630
|
+
activeCandidate.goPackagePeerFiles.has(node.file));
|
|
1631
|
+
},
|
|
1632
|
+
sameSignature: (a, b) => overridingSignatures?.get(a)?.has(b) ?? false,
|
|
1500
1633
|
};
|
|
1501
1634
|
const callTargetsBySite = new Map();
|
|
1502
1635
|
for (const edge of graph.edges) {
|
|
@@ -1525,48 +1658,42 @@ export function emitReceiverCallEdges(graph, candidates, recordEdge, memberScope
|
|
|
1525
1658
|
// coalesced type identity so lookup starts on the whole member set.
|
|
1526
1659
|
const owner = ownerAnchors.get(rawOwner) ?? rawOwner;
|
|
1527
1660
|
const memberScope = candidate.memberScope ?? inferCallMemberScope(candidate.site, sourceCache);
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1661
|
+
const languageId = supportForFileWithoutHeaderSample(candidate.site.file, languageExtensions)?.id ?? "";
|
|
1662
|
+
activeCandidate = candidate;
|
|
1663
|
+
const lookup = selectMember([owner], model, {
|
|
1664
|
+
name: candidate.memberName,
|
|
1665
|
+
argumentCount: candidate.argumentCount,
|
|
1666
|
+
scope: memberScope,
|
|
1667
|
+
useFile: candidate.site.file,
|
|
1668
|
+
phpCaseInsensitive: !!candidate.caseInsensitiveMemberName,
|
|
1669
|
+
separateMemberScopes: hasSeparateMemberScopes(languageId),
|
|
1670
|
+
startAtAncestor: candidate.viaSupertypes,
|
|
1671
|
+
inheritOverloads: inheritsMemberOverloads(languageId),
|
|
1672
|
+
});
|
|
1673
|
+
let receiverDisposition = lookup.status === "unique" ? "resolved" : lookup.status;
|
|
1674
|
+
if (lookup.status === "unique") {
|
|
1675
|
+
const memberId = canonicalMemberId(lookup.member, nodeAliases);
|
|
1676
|
+
if (acceptsCallTarget && !acceptsCallTarget(memberId, candidate)) {
|
|
1677
|
+
receiverDisposition = "ambiguous";
|
|
1678
|
+
if (existingTargets.size)
|
|
1679
|
+
rejectedCallSites.add(siteKey);
|
|
1680
|
+
}
|
|
1681
|
+
else {
|
|
1540
1682
|
receiverDisposition = "resolved";
|
|
1541
1683
|
const combinedTargets = new Set(existingTargets);
|
|
1542
|
-
combinedTargets.add(
|
|
1684
|
+
combinedTargets.add(memberId);
|
|
1543
1685
|
if (combinedTargets.size === 1) {
|
|
1544
|
-
if (existingTargets.size
|
|
1545
|
-
existingTargets.add(
|
|
1686
|
+
if (!existingTargets.size && recordEdge(candidate.callerId, memberId, "calls", candidate.site)) {
|
|
1687
|
+
existingTargets.add(memberId);
|
|
1546
1688
|
callTargetsBySite.set(siteKey, existingTargets);
|
|
1547
1689
|
}
|
|
1548
1690
|
}
|
|
1549
|
-
else
|
|
1691
|
+
else
|
|
1550
1692
|
rejectedCallSites.add(siteKey);
|
|
1551
|
-
}
|
|
1552
|
-
break;
|
|
1553
1693
|
}
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
rejectedCallSites.add(siteKey);
|
|
1558
|
-
break;
|
|
1559
|
-
}
|
|
1560
|
-
const next = [];
|
|
1561
|
-
for (const ownerId of level) {
|
|
1562
|
-
for (const supertype of nextOwners(ownerId, candidate.viaSupertypes)) {
|
|
1563
|
-
if (visited.has(supertype))
|
|
1564
|
-
continue;
|
|
1565
|
-
visited.add(supertype);
|
|
1566
|
-
next.push(supertype);
|
|
1567
|
-
}
|
|
1568
|
-
}
|
|
1569
|
-
level = next;
|
|
1694
|
+
}
|
|
1695
|
+
else if (lookup.status === "ambiguous" && existingTargets.size) {
|
|
1696
|
+
rejectedCallSites.add(siteKey);
|
|
1570
1697
|
}
|
|
1571
1698
|
if (receiverDisposition === "none") {
|
|
1572
1699
|
if (candidate.fallbackTargetId && !existingTargets.size) {
|
|
@@ -1601,62 +1728,4 @@ function canonicalMemberId(id, aliases) {
|
|
|
1601
1728
|
}
|
|
1602
1729
|
return current;
|
|
1603
1730
|
}
|
|
1604
|
-
function memberArityMatches(memberId, argumentCount, memberArities) {
|
|
1605
|
-
if (argumentCount === null)
|
|
1606
|
-
return true;
|
|
1607
|
-
const range = memberArities.get(memberId);
|
|
1608
|
-
// Declaration parameter counts do not prove required/default/variadic call bounds.
|
|
1609
|
-
// An unknown range cannot reject a unique target or eliminate an overload.
|
|
1610
|
-
return !range || (argumentCount >= range.min && (range.max === null || argumentCount <= range.max));
|
|
1611
|
-
}
|
|
1612
|
-
/**
|
|
1613
|
-
* The single callable member named by `candidate` across `owners`.
|
|
1614
|
-
* `none` means this depth has no name match and the walk may continue.
|
|
1615
|
-
* `ambiguous` means this depth matched the name but could not prove one member,
|
|
1616
|
-
* including arity ambiguity, and the walk must stop.
|
|
1617
|
-
*/
|
|
1618
|
-
function provenMemberTarget(graph, membersByOwner, owners, candidate, memberScope, memberScopes, nodeAliases, memberArities, fileHiddenMemberIds, useFile) {
|
|
1619
|
-
const matches = new Set();
|
|
1620
|
-
for (const ownerId of owners) {
|
|
1621
|
-
for (const memberId of membersByOwner.get(ownerId) ?? []) {
|
|
1622
|
-
const canonicalId = canonicalMemberId(memberId, nodeAliases);
|
|
1623
|
-
const node = graph.nodes.get(memberId) ?? graph.nodes.get(canonicalId);
|
|
1624
|
-
if (!node || (node.kind !== "function" && !node.callable))
|
|
1625
|
-
continue;
|
|
1626
|
-
if ((fileHiddenMemberIds.has(memberId) || fileHiddenMemberIds.has(canonicalId)) &&
|
|
1627
|
-
fileIdentityKey(node.file) !== fileIdentityKey(useFile)) {
|
|
1628
|
-
continue;
|
|
1629
|
-
}
|
|
1630
|
-
const nameMatches = candidate.caseInsensitiveMemberName
|
|
1631
|
-
? foldPhpIdentifierCase(node.name) === foldPhpIdentifierCase(candidate.memberName)
|
|
1632
|
-
: node.name === candidate.memberName;
|
|
1633
|
-
if (!nameMatches)
|
|
1634
|
-
continue;
|
|
1635
|
-
if (candidate.goPackagePeerFiles &&
|
|
1636
|
-
!isGoExportedMemberName("go", node.name) &&
|
|
1637
|
-
!candidate.goPackagePeerFiles.has(node.file)) {
|
|
1638
|
-
continue;
|
|
1639
|
-
}
|
|
1640
|
-
const scope = memberScopes.get(memberId) ?? memberScopes.get(canonicalId);
|
|
1641
|
-
if (memberScope !== "any" && scope !== memberScope)
|
|
1642
|
-
continue;
|
|
1643
|
-
matches.add(canonicalId);
|
|
1644
|
-
}
|
|
1645
|
-
}
|
|
1646
|
-
if (!matches.size)
|
|
1647
|
-
return { status: "none" };
|
|
1648
|
-
if (matches.size === 1) {
|
|
1649
|
-
const [memberId] = matches;
|
|
1650
|
-
if (memberArityMatches(memberId, candidate.argumentCount, memberArities)) {
|
|
1651
|
-
return { status: "unique", memberId: memberId };
|
|
1652
|
-
}
|
|
1653
|
-
return { status: "ambiguous" };
|
|
1654
|
-
}
|
|
1655
|
-
const byArity = candidate.argumentCount === null
|
|
1656
|
-
? []
|
|
1657
|
-
: [...matches].filter((memberId) => memberArityMatches(memberId, candidate.argumentCount, memberArities));
|
|
1658
|
-
if (byArity.length === 1)
|
|
1659
|
-
return { status: "unique", memberId: byArity[0] };
|
|
1660
|
-
return { status: "ambiguous" };
|
|
1661
|
-
}
|
|
1662
1731
|
//# sourceMappingURL=receiver-calls.js.map
|