@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,25 +1,24 @@
|
|
|
1
1
|
import { SymbolKind } from "../../indexer/types.js";
|
|
2
|
-
import { cppCallableShapeForNode } from "../../indexer/cpp-callables.js";
|
|
3
2
|
import { getCompilationUnitPeers } from "../../indexer/compilation-units.js";
|
|
4
3
|
import { isExportedDeclaration, isGoExportedMemberName, isSwiftCrossFileHiddenSharedOwnerMember, isSwiftFileHiddenSharedOwnerMember, } from "../../indexer/declaration-visibility.js";
|
|
5
4
|
import { resolveCppQualifiedMemberContainer } from "../../indexer/navigation-cpp.js";
|
|
6
|
-
import { cppQualifiedOwnerHasImplicitThis, findTypeScriptNamespaceMemberCandidates, innermostNamespaceImport, isDirectKeywordMemberDeclaration, memberAcceptsCallAt, resolvePhpObjectCreationTarget, resolveRubyVisibleConstant, resolveSharedOwnerContainers, } from "../../indexer/navigation-goto.js";
|
|
5
|
+
import { cppQualifiedOwnerHasImplicitThis, findTypeScriptNamespaceMemberCandidates, innermostNamespaceImport, isDirectKeywordMemberDeclaration, memberAcceptsCallAt, resolvePhpObjectCreationTarget, resolveRubyVisibleConstant, resolveSharedOwnerContainers, supportsDeclaredFieldChains, } from "../../indexer/navigation-goto.js";
|
|
7
6
|
import { findClosestScopeBinding } from "../../indexer/navigation-local.js";
|
|
8
7
|
import { findPhpImportAlias, inferPhpQualifiedReferenceImportType } from "../../indexer/navigation-php.js";
|
|
9
8
|
import { cjsRequireValueBinding, resolveImportTypeMember, resolvePhpExportByImportType, } from "../../indexer/navigation-resolve.js";
|
|
9
|
+
import { selectMember } from "../../indexer/member-selection.js";
|
|
10
10
|
import { effectiveExplicitBinding } from "../../indexer/star-import-precedence.js";
|
|
11
|
-
import { typescriptSelectOverloadCandidate } from "../../indexer/ts-callables.js";
|
|
12
11
|
import { isSwiftConstrainedExtension, isSwiftExtensionContainer, selectCsharpPartialRepresentative, } from "../../indexer/shared-owner-identity.js";
|
|
13
12
|
import { isJsTsLanguage } from "../../languages/js-family.js";
|
|
14
|
-
import {
|
|
13
|
+
import { getCallArgumentCount, memberLookupBinding } from "../../languages/callable-arity.js";
|
|
15
14
|
import { sliceText, toRange } from "../../util/ast.js";
|
|
16
15
|
import { getMemberAccessParts, isMemberAccessNode, rustTokenTreeHoldsExpressions, rustTokenTreeNameFollowsSeparator, } from "../../util/member-access.js";
|
|
17
16
|
import { foldPhpIdentifierCase } from "../../util/identifiers.js";
|
|
18
|
-
import { MEMBER_ACCESS_ROWS,
|
|
17
|
+
import { MEMBER_ACCESS_ROWS, } from "../../util/member-access-tables.js";
|
|
19
18
|
import { fileIdentityKey } from "../../util/paths.js";
|
|
20
19
|
import { defNodeId, nodeForDef } from "../symbol-graph.js";
|
|
21
20
|
import { collectNodesByType, declarationMemberArity, findFirstNodeByType, isIdentifierType } from "./ast.js";
|
|
22
|
-
import { CALL_ARGUMENT_NODE_TYPES, classifyReceiver, constructionTypeName, declarationIsStaticEquivalent, declarationNodeIsStatic, cppOutOfLineOwnerPath, cppOutOfLineMemberDeclarationNode, cppQualifiedNameSegments,
|
|
21
|
+
import { CALL_ARGUMENT_NODE_TYPES, classifyReceiver, constructionTypeName, declarationIsStaticEquivalent, declarationNodeIsStatic, cppOutOfLineOwnerPath, cppOutOfLineMemberDeclarationNode, cppQualifiedNameSegments, declaresMembers, isUnprovenHeritageExpression, kotlinExtensionReceiverTypeNode, memberContainerDef, nearestMemberContainer, nodeInStaticMemberContext, phpObjectCreationKeyword, receiverCallAccess, rustImplSelfTypeNode, supportsImplicitSelfMemberCalls, supportsReceiverMemberOverloads, importTypeQuerySpecifier, } from "./receiver-calls.js";
|
|
23
22
|
function ensureNode(context, def) {
|
|
24
23
|
const id = defNodeId(def);
|
|
25
24
|
if (!context.nodes.has(id))
|
|
@@ -44,40 +43,31 @@ function markMemberArity(context, id, declarationNode) {
|
|
|
44
43
|
if (node)
|
|
45
44
|
node.memberArity = arity;
|
|
46
45
|
}
|
|
47
|
-
function
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
min = Math.min(min,
|
|
58
|
-
if (max === null ||
|
|
59
|
-
max = null;
|
|
46
|
+
function mergeCppCallableShapes(...defs) {
|
|
47
|
+
let merged;
|
|
48
|
+
for (const def of defs) {
|
|
49
|
+
const arity = def?.callable?.arity;
|
|
50
|
+
if (!arity)
|
|
51
|
+
continue;
|
|
52
|
+
if (!merged) {
|
|
53
|
+
merged = { min: arity.minArgs, max: arity.maxArgs };
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
merged.min = Math.min(merged.min, arity.minArgs);
|
|
57
|
+
if (merged.max === null || arity.maxArgs === null)
|
|
58
|
+
merged.max = null;
|
|
60
59
|
else
|
|
61
|
-
max = Math.max(max,
|
|
60
|
+
merged.max = Math.max(merged.max, arity.maxArgs);
|
|
62
61
|
}
|
|
63
|
-
return
|
|
62
|
+
return merged;
|
|
64
63
|
}
|
|
65
|
-
/**
|
|
66
|
-
|
|
67
|
-
* facts (default parameters, varargs, explicit receivers), or undefined when the
|
|
68
|
-
* declaration shape is unknown or the language does not select members by call arity.
|
|
69
|
-
* The binding follows the call form member lookup resolves (see `memberLookupBinding`).
|
|
70
|
-
*/
|
|
71
|
-
function acceptedMemberArityRange(context, declarationNode, source) {
|
|
64
|
+
/** The member call form determines whether a declared receiver takes an argument. */
|
|
65
|
+
function acceptedMemberArityRange(context, def) {
|
|
72
66
|
if (!supportsReceiverMemberOverloads(context.sup.id))
|
|
73
67
|
return undefined;
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
declaration: declarationNode,
|
|
78
|
-
binding: memberLookupBinding(context.sup.id),
|
|
79
|
-
});
|
|
80
|
-
return arity ? { min: arity.minArgs, max: arity.maxArgs } : undefined;
|
|
68
|
+
const callable = def.callable;
|
|
69
|
+
const range = memberLookupBinding(context.sup.id) === "unbound" ? (callable?.unboundArity ?? callable?.arity) : callable?.arity;
|
|
70
|
+
return range ? { min: range.minArgs, max: range.maxArgs } : undefined;
|
|
81
71
|
}
|
|
82
72
|
function recordMemberLookupIdentity(context, definitionId, memberId, memberScope, arityRange) {
|
|
83
73
|
context.receiverMemberScopes.set(definitionId, memberScope);
|
|
@@ -115,6 +105,7 @@ function tryResolveNode(context, node, fromId, label) {
|
|
|
115
105
|
if (isIdentifierType(context.sup, node.type) ||
|
|
116
106
|
node.type === "type_identifier" ||
|
|
117
107
|
(context.sup.id === "csharp" && (node.type === "qualified_name" || node.type === "alias_qualified_name")) ||
|
|
108
|
+
(context.sup.id === "php" && (node.type === "qualified_name" || node.type === "relative_name")) ||
|
|
118
109
|
(context.sup.id === "cpp" && (node.type === "operator_name" || node.type === "destructor_name"))) {
|
|
119
110
|
const name = sliceText(node, context.source);
|
|
120
111
|
const target = context.resolveIdentifier(name, node);
|
|
@@ -141,7 +132,7 @@ function tryResolveNode(context, node, fromId, label) {
|
|
|
141
132
|
* navigation's refusals inside token trees.
|
|
142
133
|
*/
|
|
143
134
|
function recordRustMacroArgumentCalls(context, tokenTree, fromId) {
|
|
144
|
-
if (
|
|
135
|
+
if (!rustTokenTreeHoldsExpressions(tokenTree))
|
|
145
136
|
return;
|
|
146
137
|
const children = tokenTree.namedChildren;
|
|
147
138
|
for (let index = 0; index + 1 < children.length; index += 1) {
|
|
@@ -189,8 +180,6 @@ function getNewTarget(node) {
|
|
|
189
180
|
return namedType ?? node.child(0);
|
|
190
181
|
}
|
|
191
182
|
export function emitPythonDecoratorEdges(context, rootNode) {
|
|
192
|
-
if (context.sup.id !== "python")
|
|
193
|
-
return;
|
|
194
183
|
const addDecoratorUses = (node) => {
|
|
195
184
|
if (node.type === "decorated_definition") {
|
|
196
185
|
const fn = node.namedChildren.find((child) => child.type === "function_definition");
|
|
@@ -293,9 +282,10 @@ export async function emitMemberOwnershipEdges(context, functionNodes, classNode
|
|
|
293
282
|
if (memberId !== definitionId)
|
|
294
283
|
markMemberArity(context, memberId, arityNode);
|
|
295
284
|
const memberScope = memberScopeForDefinition(context, fn, owner.cppOutOfLine, outOfLineDeclaration);
|
|
285
|
+
const outOfLineMember = outOfLineDeclaration ? memberDef : undefined;
|
|
296
286
|
const arityRange = context.sup.id === "cpp"
|
|
297
|
-
? mergeCppCallableShapes(
|
|
298
|
-
: acceptedMemberArityRange(context,
|
|
287
|
+
? mergeCppCallableShapes(fn.def, outOfLineMember)
|
|
288
|
+
: acceptedMemberArityRange(context, memberDef);
|
|
299
289
|
recordMemberLookupIdentity(context, definitionId, memberId, memberScope, arityRange);
|
|
300
290
|
recordDefEdge(context, definitionId, owner.def, "member_of");
|
|
301
291
|
await emitSharedOwnerMembershipEdges(context, owner, definitionId, fn.node);
|
|
@@ -493,7 +483,10 @@ function unwrapGoNamedType(node) {
|
|
|
493
483
|
}
|
|
494
484
|
/** Type-like defs only, so a PHP `use function` alias cannot steal `Example::m()`. */
|
|
495
485
|
function resolveNamedType(context, name, node, rubyConstructed = false) {
|
|
496
|
-
|
|
486
|
+
// A Go composite literal or Zig struct initializer can name a qualified cross-file type
|
|
487
|
+
// (`pkg.Type{}` / `ns.Type{}`); the receiver's typeName is then dotted text, not one
|
|
488
|
+
// identifier, so resolve the chain directly instead of treating it as a plain name.
|
|
489
|
+
if ((context.sup.id === "go" || context.sup.id === "zig") && context.optionalMemberTypes.has(node.type)) {
|
|
497
490
|
const qualified = context.resolveMemberChainTarget(node);
|
|
498
491
|
return qualified && declaresMembers(qualified) ? qualified : null;
|
|
499
492
|
}
|
|
@@ -508,13 +501,109 @@ function resolveNamedType(context, name, node, rubyConstructed = false) {
|
|
|
508
501
|
const imported = context.aliasToTargetDef.get(name);
|
|
509
502
|
if (imported && declaresMembers(imported))
|
|
510
503
|
return imported;
|
|
511
|
-
//
|
|
512
|
-
//
|
|
513
|
-
// Inheritance names stay on resolveIdentifier so
|
|
514
|
-
|
|
504
|
+
// A constructed `Klass.new` type, or (Ruby only) a bare capitalized constant receiver
|
|
505
|
+
// (`Calc.add(1, 2)`), uses Ruby's bare-constant visibility, and only when this file does not
|
|
506
|
+
// already have several classes of that name. Inheritance names stay on resolveIdentifier so
|
|
507
|
+
// an unproven superclass is not invented.
|
|
508
|
+
const triesRubyVisibleConstant = rubyConstructed || context.sup.id === "ruby";
|
|
509
|
+
if (!triesRubyVisibleConstant || typed.length > 1)
|
|
515
510
|
return null;
|
|
516
511
|
return resolveRubyVisibleConstant(context.index, context.moduleEntry, context.sup, name);
|
|
517
512
|
}
|
|
513
|
+
/**
|
|
514
|
+
* Zig's static-receiver call form (`module.Type.member()`): the receiver is itself a qualified
|
|
515
|
+
* member-access node naming a type through another file's export (`counter.Counter` in
|
|
516
|
+
* `counter.Counter.zero()`). `classifyReceiver` only proves an identifier or keyword receiver,
|
|
517
|
+
* so this resolves the receiver's own chain directly and defers the member lookup through the
|
|
518
|
+
* same cross-file receiver-call pipeline every other member call uses.
|
|
519
|
+
*/
|
|
520
|
+
function recordZigQualifiedTypeReceiverCall(context, node, access, fromId) {
|
|
521
|
+
const typeDef = context.resolveMemberChainTarget(access.receiver);
|
|
522
|
+
if (!typeDef || !declaresMembers(typeDef))
|
|
523
|
+
return false;
|
|
524
|
+
const memberName = sliceText(access.property, context.source);
|
|
525
|
+
if (!memberName)
|
|
526
|
+
return false;
|
|
527
|
+
const argumentCount = supportsReceiverMemberOverloads(context.sup.id)
|
|
528
|
+
? getCallArgumentCount({ languageId: context.sup.id, source: context.source, call: node })
|
|
529
|
+
: null;
|
|
530
|
+
context.receiverCalls.push({
|
|
531
|
+
callerId: fromId,
|
|
532
|
+
ownerId: ensureNode(context, typeDef),
|
|
533
|
+
viaSupertypes: false,
|
|
534
|
+
memberName,
|
|
535
|
+
argumentCount,
|
|
536
|
+
site: { file: context.moduleEntry.file, range: toRange(access.property) },
|
|
537
|
+
memberScope: "any",
|
|
538
|
+
});
|
|
539
|
+
return true;
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Go's `d.Base.Run()`: `d.Base` explicitly names an embedded field to reach a promoted method
|
|
543
|
+
* that a derived type's own same-named method would otherwise shadow, Go's equivalent of
|
|
544
|
+
* `super`/`base`. `classifyReceiver` only proves an identifier or keyword receiver, so a
|
|
545
|
+
* dotted `d.Base` receiver is never classified. This resolves `d`'s own type, confirms `Base`
|
|
546
|
+
* is really a nameless embedded field declared on it (not an unrelated named field that merely
|
|
547
|
+
* shares the name), then defers the member lookup through the same cross-file receiver-call
|
|
548
|
+
* pipeline every other member call uses. Limited to a same-file owner declaration: the AST
|
|
549
|
+
* needed to read the field list is only synchronously available there.
|
|
550
|
+
*/
|
|
551
|
+
function recordGoEmbeddedFieldReceiverCall(context, access, fromId, hasLexicalBinding) {
|
|
552
|
+
const parts = getMemberAccessParts(context.sup, access.receiver);
|
|
553
|
+
const objectNode = parts.object;
|
|
554
|
+
const fieldNode = parts.property;
|
|
555
|
+
if (!objectNode || !fieldNode || !isIdentifierType(context.sup, fieldNode.type))
|
|
556
|
+
return false;
|
|
557
|
+
const ownerBinding = classifyReceiver(context.sup, objectNode, context.source, null, 0, access.receiver, hasLexicalBinding);
|
|
558
|
+
if (ownerBinding?.kind !== "named-type")
|
|
559
|
+
return false;
|
|
560
|
+
const ownerDef = resolveNamedType(context, ownerBinding.typeName, ownerBinding.typeNode, ownerBinding.constructed);
|
|
561
|
+
if (!ownerDef || fileIdentityKey(ownerDef.file) !== fileIdentityKey(context.moduleEntry.file))
|
|
562
|
+
return false;
|
|
563
|
+
const embeds = MEMBER_ACCESS_ROWS.go?.receiverAncestry?.embeds;
|
|
564
|
+
if (!embeds)
|
|
565
|
+
return false;
|
|
566
|
+
const start = ownerDef.range.start.index ?? 0;
|
|
567
|
+
const nameNode = context.tree.rootNode.descendantForIndex(start, ownerDef.range.end.index ?? start);
|
|
568
|
+
const declaration = nameNode.parent;
|
|
569
|
+
const declaredType = declaration?.childForFieldName("type");
|
|
570
|
+
if (!declaration || !declaredType)
|
|
571
|
+
return false;
|
|
572
|
+
const fieldName = sliceText(fieldNode, context.source);
|
|
573
|
+
for (const rule of embeds) {
|
|
574
|
+
if (declaredType.type !== rule.body)
|
|
575
|
+
continue;
|
|
576
|
+
const list = rule.memberList ? findFirstNodeByType(declaredType, rule.memberList) : declaredType;
|
|
577
|
+
if (!list)
|
|
578
|
+
continue;
|
|
579
|
+
for (const member of list.namedChildren ?? []) {
|
|
580
|
+
if (member.type !== rule.member)
|
|
581
|
+
continue;
|
|
582
|
+
if (rule.nameless && member.childForFieldName("name"))
|
|
583
|
+
continue;
|
|
584
|
+
const specifier = rule.typeField ? member.childForFieldName(rule.typeField) : member;
|
|
585
|
+
if (!specifier || sliceText(specifier, context.source) !== fieldName)
|
|
586
|
+
continue;
|
|
587
|
+
const embeddedDef = context.resolveIdentifier(fieldName, specifier);
|
|
588
|
+
if (!embeddedDef || !declaresMembers(embeddedDef))
|
|
589
|
+
return false;
|
|
590
|
+
const memberName = sliceText(access.property, context.source);
|
|
591
|
+
if (!memberName)
|
|
592
|
+
return false;
|
|
593
|
+
context.receiverCalls.push({
|
|
594
|
+
callerId: fromId,
|
|
595
|
+
ownerId: ensureNode(context, embeddedDef),
|
|
596
|
+
viaSupertypes: false,
|
|
597
|
+
memberName,
|
|
598
|
+
argumentCount: null,
|
|
599
|
+
site: { file: context.moduleEntry.file, range: toRange(access.property) },
|
|
600
|
+
memberScope: "any",
|
|
601
|
+
});
|
|
602
|
+
return true;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
return false;
|
|
606
|
+
}
|
|
518
607
|
/**
|
|
519
608
|
* Collection can attach an arrow to any same-name local when the binding site is
|
|
520
609
|
* not that local (`obj.helper = () => 1` beside `const helper = 1`). Prove that
|
|
@@ -572,18 +661,22 @@ function resolveTypeScriptNamespaceMember(context, call, receiverNode, property)
|
|
|
572
661
|
const candidates = findTypeScriptNamespaceMemberCandidates(context.moduleEntry.locals, member, receiver, context);
|
|
573
662
|
if (!candidates.length)
|
|
574
663
|
return undefined;
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
664
|
+
const selected = selectMember([receiver], {
|
|
665
|
+
ownerKey: (def) => def.callable?.owner ?? fileIdentityKey(def.file),
|
|
666
|
+
members: () => candidates,
|
|
667
|
+
supertypes: () => [],
|
|
668
|
+
name: (def) => def.localName,
|
|
669
|
+
key: (def) => def.callable?.key ?? `${fileIdentityKey(def.file)}:${def.range.start.index}`,
|
|
670
|
+
callable: (def) => def.callable,
|
|
671
|
+
scope: () => "any",
|
|
672
|
+
visible: () => true,
|
|
673
|
+
}, {
|
|
674
|
+
name: member,
|
|
585
675
|
argumentCount: getCallArgumentCount({ languageId: context.sup.id, source: context.source, call }),
|
|
676
|
+
scope: "any",
|
|
677
|
+
useFile: context.moduleEntry.file,
|
|
586
678
|
});
|
|
679
|
+
return selected.status === "unique" ? selected.member : null;
|
|
587
680
|
}
|
|
588
681
|
function recordTypeScriptNamespaceCall(context, call, access, fromId) {
|
|
589
682
|
const selected = resolveTypeScriptNamespaceMember(context, call, access.receiver, access.property);
|
|
@@ -608,10 +701,10 @@ function recordTypeScriptNamespaceConstruction(context, node, target, fromId) {
|
|
|
608
701
|
return true;
|
|
609
702
|
}
|
|
610
703
|
/** A member call on a `typeof import("spec")` binding names that module's export. */
|
|
611
|
-
function recordImportTypeCall(context, access, fromId) {
|
|
704
|
+
function recordImportTypeCall(context, access, fromId, proof) {
|
|
612
705
|
if (!isJsTsLanguage(context.sup.id))
|
|
613
706
|
return false;
|
|
614
|
-
const importType =
|
|
707
|
+
const importType = proof.kind === "named-type" ? proof.typeNode : null;
|
|
615
708
|
const specifier = importType?.type === "type_query" ? importTypeQuerySpecifier(importType) : null;
|
|
616
709
|
if (!specifier)
|
|
617
710
|
return false;
|
|
@@ -623,8 +716,6 @@ function recordImportTypeCall(context, access, fromId) {
|
|
|
623
716
|
}
|
|
624
717
|
/** Swift `Foo()` / `Worker(name:)` is construction. Record `instantiates` and skip the call path. */
|
|
625
718
|
function recordSwiftCapitalizedConstruction(context, node, fromId) {
|
|
626
|
-
if (context.sup.id !== "swift")
|
|
627
|
-
return false;
|
|
628
719
|
const constructed = constructionTypeName(node, context.source, context.sup);
|
|
629
720
|
if (!constructed)
|
|
630
721
|
return false;
|
|
@@ -638,7 +729,96 @@ function recordSwiftCapitalizedConstruction(context, node, fromId) {
|
|
|
638
729
|
recordDefEdge(context, fromId, target, "instantiates", constructed);
|
|
639
730
|
return true;
|
|
640
731
|
}
|
|
732
|
+
function recordGoBuiltinConstruction(context, node, fromId) {
|
|
733
|
+
const callTarget = getCallTarget(node);
|
|
734
|
+
const calleeName = callTarget && isIdentifierType(context.sup, callTarget.type) ? sliceText(callTarget, context.source) : null;
|
|
735
|
+
if (calleeName !== "new" && calleeName !== "make")
|
|
736
|
+
return undefined;
|
|
737
|
+
const argList = node.childForFieldName("arguments") ?? node.childForFieldName("argument_list");
|
|
738
|
+
const typeNode = argList?.namedChildren?.find((child) => child.type === "type_identifier") ?? null;
|
|
739
|
+
if (typeNode)
|
|
740
|
+
tryResolveNode(context, typeNode, fromId, "instantiates");
|
|
741
|
+
return false;
|
|
742
|
+
}
|
|
743
|
+
function recordRubySuper(context, fn, superNode, fromId) {
|
|
744
|
+
const container = nearestMemberContainer(fn.node);
|
|
745
|
+
if (!container || container.type !== "class")
|
|
746
|
+
return;
|
|
747
|
+
const owner = memberContainerDef(context.moduleEntry, container);
|
|
748
|
+
if (!owner)
|
|
749
|
+
return;
|
|
750
|
+
context.receiverCalls.push({
|
|
751
|
+
callerId: fromId,
|
|
752
|
+
ownerId: ensureNode(context, owner),
|
|
753
|
+
viaSupertypes: true,
|
|
754
|
+
memberName: fn.def.localName,
|
|
755
|
+
argumentCount: null,
|
|
756
|
+
site: { file: context.moduleEntry.file, range: toRange(superNode) },
|
|
757
|
+
memberScope: "any",
|
|
758
|
+
});
|
|
759
|
+
}
|
|
760
|
+
function recordRubyCall(context, node, fromId, resolveCallTarget) {
|
|
761
|
+
if (node.type !== "call")
|
|
762
|
+
return undefined;
|
|
763
|
+
const methodNode = node.childForFieldName("method");
|
|
764
|
+
const receiverNode = node.childForFieldName("receiver");
|
|
765
|
+
const methodName = methodNode ? sliceText(methodNode, context.source) : null;
|
|
766
|
+
if (methodName === "new" && receiverNode) {
|
|
767
|
+
const recorded = tryResolveNode(context, receiverNode, fromId, "instantiates");
|
|
768
|
+
if (!recorded) {
|
|
769
|
+
const rubyType = resolveRubyVisibleConstant(context.index, context.moduleEntry, context.sup, sliceText(receiverNode, context.source));
|
|
770
|
+
if (rubyType)
|
|
771
|
+
recordDefEdge(context, fromId, rubyType, "instantiates", receiverNode);
|
|
772
|
+
}
|
|
773
|
+
return false;
|
|
774
|
+
}
|
|
775
|
+
if (methodNode?.type === "super")
|
|
776
|
+
return true;
|
|
777
|
+
if (methodNode) {
|
|
778
|
+
resolveCallTarget(node, methodNode);
|
|
779
|
+
return false;
|
|
780
|
+
}
|
|
781
|
+
const callee = getCallTarget(node);
|
|
782
|
+
if (callee?.type === "super")
|
|
783
|
+
return true;
|
|
784
|
+
resolveCallTarget(node, callee);
|
|
785
|
+
return false;
|
|
786
|
+
}
|
|
787
|
+
/** Specialized syntax stays with its language; the common walker only dispatches these hooks. */
|
|
788
|
+
export const SPECIALIZED_EDGE_PASSES = {
|
|
789
|
+
python: { beforeModule: emitPythonDecoratorEdges },
|
|
790
|
+
rust: {
|
|
791
|
+
afterModule: emitRustImplEdges,
|
|
792
|
+
onNode(context, _fn, node, fromId) {
|
|
793
|
+
if (node.type === "token_tree")
|
|
794
|
+
recordRustMacroArgumentCalls(context, node, fromId);
|
|
795
|
+
return undefined;
|
|
796
|
+
},
|
|
797
|
+
},
|
|
798
|
+
go: {
|
|
799
|
+
onReceiverCall(context, access, fromId, hasLexicalBinding) {
|
|
800
|
+
return (context.optionalMemberTypes.has(access.receiver.type) &&
|
|
801
|
+
recordGoEmbeddedFieldReceiverCall(context, access, fromId, hasLexicalBinding));
|
|
802
|
+
},
|
|
803
|
+
onCall: recordGoBuiltinConstruction,
|
|
804
|
+
},
|
|
805
|
+
ruby: {
|
|
806
|
+
onNode(context, fn, node, fromId) {
|
|
807
|
+
if (node.type !== "super")
|
|
808
|
+
return undefined;
|
|
809
|
+
recordRubySuper(context, fn, node, fromId);
|
|
810
|
+
return true;
|
|
811
|
+
},
|
|
812
|
+
onCall: recordRubyCall,
|
|
813
|
+
},
|
|
814
|
+
swift: {
|
|
815
|
+
onCall(context, node, fromId) {
|
|
816
|
+
return recordSwiftCapitalizedConstruction(context, node, fromId) ? true : undefined;
|
|
817
|
+
},
|
|
818
|
+
},
|
|
819
|
+
};
|
|
641
820
|
export async function emitFunctionBodyEdges(context, functionNodes) {
|
|
821
|
+
const specialized = SPECIALIZED_EDGE_PASSES[context.sup.id];
|
|
642
822
|
const qualifiedConstructionTargets = [];
|
|
643
823
|
// C# calls through a dotted receiver (`P.Mix.M()`, `Imported.Outer.Inner.M()`): navigation's
|
|
644
824
|
// member-access resolution decides the target after the walk, so both consumers agree.
|
|
@@ -654,12 +834,14 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
|
|
|
654
834
|
"nullsafe_member_call_expression",
|
|
655
835
|
"scoped_call_expression",
|
|
656
836
|
]);
|
|
657
|
-
const newNodeTypes =
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
837
|
+
const newNodeTypes = {
|
|
838
|
+
new_expression: true,
|
|
839
|
+
object_creation_expression: true,
|
|
840
|
+
struct_expression: true,
|
|
841
|
+
composite_literal: true,
|
|
842
|
+
// tree-sitter-zig's own struct-literal node, e.g. `Widget{}` or a qualified `ns.Widget{}`.
|
|
843
|
+
struct_initializer: true,
|
|
844
|
+
};
|
|
663
845
|
// Receiver typing and lexical member lookup are initialized only for receiver calls.
|
|
664
846
|
const receiverProofs = new Map();
|
|
665
847
|
const hasLexicalBinding = (callee) => {
|
|
@@ -729,13 +911,8 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
|
|
|
729
911
|
return;
|
|
730
912
|
let target = context.aliasToTargetDef.get(name) ?? null;
|
|
731
913
|
if (!target) {
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
// here too whenever a closer, non-namespace scope binding owns the name.
|
|
735
|
-
const modFile = context.sup.id === "go" && context.hasNonModuleBinding(name, node)
|
|
736
|
-
? undefined
|
|
737
|
-
: context.aliasToTargetModule.get(name);
|
|
738
|
-
if (modFile) {
|
|
914
|
+
const modFile = context.aliasToTargetModule.get(name);
|
|
915
|
+
if (modFile && context.moduleAliasIsUnshadowed(name, node)) {
|
|
739
916
|
let exportedName = null;
|
|
740
917
|
const parent = node.parent;
|
|
741
918
|
if (parent &&
|
|
@@ -767,28 +944,35 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
|
|
|
767
944
|
recordDefEdge(context, fromId, targetDef, "uses");
|
|
768
945
|
}
|
|
769
946
|
};
|
|
947
|
+
const classifyImport = (name, node) => {
|
|
948
|
+
if (isJsTsLanguage(context.sup.id) && isIdentifierType(context.sup, node.type)) {
|
|
949
|
+
const imported = effectiveExplicitBinding(context.moduleEntry.imports, context.sup.id, (candidate) => candidate.kind === "namespace" && candidate.localNS === name, node.startIndex) ?? innermostNamespaceImport(context.moduleEntry.imports, name, node);
|
|
950
|
+
if (imported?.mechanism === "cjs" && typeof imported.resolved === "string") {
|
|
951
|
+
const value = cjsRequireValueBinding(context.index, imported.resolved);
|
|
952
|
+
const lexical = value ? context.resolveIdentifier(name, node) : null;
|
|
953
|
+
if (value && declaresMembers(value) && lexical && defNodeId(value) === defNodeId(lexical)) {
|
|
954
|
+
return "static-type";
|
|
955
|
+
}
|
|
956
|
+
return "module-import";
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
if (context.aliasToTargetModule.has(name) && context.moduleAliasIsUnshadowed(name, node)) {
|
|
960
|
+
return "module-import";
|
|
961
|
+
}
|
|
962
|
+
return null;
|
|
963
|
+
};
|
|
770
964
|
/**
|
|
771
965
|
* Resolves a receiver method call against the receiver's type. Members declared
|
|
772
966
|
* alongside the caller resolve here; anything needing another module's members
|
|
773
967
|
* becomes a deferred candidate.
|
|
774
968
|
*/
|
|
775
|
-
const recordReceiverCall = (node, access, forcedMemberScope) => {
|
|
969
|
+
const recordReceiverCall = (node, access, forcedMemberScope, proof) => {
|
|
776
970
|
const memberName = sliceText(access.property, context.source);
|
|
777
971
|
if (!memberName)
|
|
778
972
|
return;
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
const imported = effectiveExplicitBinding(context.moduleEntry.imports, context.sup.id, (candidate) => candidate.kind === "namespace" && candidate.localNS === receiverName, access.receiver.startIndex) ?? innermostNamespaceImport(context.moduleEntry.imports, receiverName, access.receiver);
|
|
783
|
-
if (imported?.mechanism === "cjs" && typeof imported.resolved === "string") {
|
|
784
|
-
const value = cjsRequireValueBinding(context.index, imported.resolved);
|
|
785
|
-
const lexical = value ? context.resolveIdentifier(receiverName, access.receiver) : null;
|
|
786
|
-
if (!value || !declaresMembers(value) || !lexical || defNodeId(value) !== defNodeId(lexical))
|
|
787
|
-
return;
|
|
788
|
-
binding = { kind: "named-type", typeName: receiverName, typeNode: access.receiver, memberScope: "static" };
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
if (!binding)
|
|
973
|
+
const binding = proof ??
|
|
974
|
+
classifyReceiver(context.sup, access.receiver, context.source, receiverProofs, fn.node.startIndex, access.accessNode, hasLexicalBinding, classifyImport);
|
|
975
|
+
if (binding.kind === "module-import" || binding.kind === "unknown")
|
|
792
976
|
return;
|
|
793
977
|
const site = { file: context.moduleEntry.file, range: toRange(access.property) };
|
|
794
978
|
// Shared call-count facts treat unproven spread expansions as unknown (null),
|
|
@@ -903,9 +1087,6 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
|
|
|
903
1087
|
if (access) {
|
|
904
1088
|
if (recordTypeScriptNamespaceCall(context, node, access, fromId))
|
|
905
1089
|
return;
|
|
906
|
-
if (recordImportTypeCall(context, access, fromId))
|
|
907
|
-
return;
|
|
908
|
-
const receiverName = sliceText(access.receiver, context.source);
|
|
909
1090
|
const typeScopedCppCall = context.sup.id === "cpp" &&
|
|
910
1091
|
context.source.slice(access.receiver.endIndex, access.property.startIndex).includes("::");
|
|
911
1092
|
if (typeScopedCppCall) {
|
|
@@ -921,19 +1102,49 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
|
|
|
921
1102
|
});
|
|
922
1103
|
return;
|
|
923
1104
|
}
|
|
924
|
-
|
|
925
|
-
|
|
1105
|
+
const receiverProof = classifyReceiver(context.sup, access.receiver, context.source, receiverProofs, fn.node.startIndex, access.accessNode, hasLexicalBinding, classifyImport);
|
|
1106
|
+
if (recordImportTypeCall(context, access, fromId, receiverProof))
|
|
1107
|
+
return;
|
|
1108
|
+
if (supportsDeclaredFieldChains(context.sup.id) && isMemberAccessNode(context.sup, access.receiver)) {
|
|
1109
|
+
dottedReceiverCalls.push({ fromId, access });
|
|
1110
|
+
return;
|
|
1111
|
+
}
|
|
1112
|
+
if (receiverProof.kind === "own-type" || receiverProof.kind === "supertype") {
|
|
1113
|
+
recordReceiverCall(node, access, undefined, receiverProof);
|
|
1114
|
+
return;
|
|
1115
|
+
}
|
|
1116
|
+
if (context.sup.id === "swift" &&
|
|
1117
|
+
isIdentifierType(context.sup, access.receiver.type) &&
|
|
1118
|
+
context.resolveIdentifier(sliceText(access.receiver, context.source), access.receiver)?.kind ===
|
|
1119
|
+
SymbolKind.TypeAlias) {
|
|
1120
|
+
dottedReceiverCalls.push({ fromId, access });
|
|
926
1121
|
return;
|
|
927
1122
|
}
|
|
928
1123
|
if (tryResolveChain(context, access.accessNode, fromId, "calls"))
|
|
929
1124
|
return;
|
|
930
|
-
if (context.sup.id === "
|
|
931
|
-
access.receiver.type
|
|
932
|
-
|
|
1125
|
+
if (context.sup.id === "zig" &&
|
|
1126
|
+
context.optionalMemberTypes.has(access.receiver.type) &&
|
|
1127
|
+
recordZigQualifiedTypeReceiverCall(context, node, access, fromId)) {
|
|
1128
|
+
return;
|
|
1129
|
+
}
|
|
1130
|
+
if (specialized?.onReceiverCall?.(context, access, fromId, hasLexicalBinding))
|
|
1131
|
+
return;
|
|
1132
|
+
const javaConstructionType = context.sup.id === "java" && access.receiver.type === "object_creation_expression"
|
|
1133
|
+
? constructionTypeName(access.receiver, context.source, context.sup)
|
|
1134
|
+
: null;
|
|
1135
|
+
if (context.sup.id === "java" &&
|
|
1136
|
+
javaConstructionType &&
|
|
1137
|
+
isMemberAccessNode(context.sup, javaConstructionType)) {
|
|
1138
|
+
dottedReceiverCalls.push({ fromId, access });
|
|
1139
|
+
return;
|
|
1140
|
+
}
|
|
1141
|
+
if (context.sup.id === "kotlin" &&
|
|
1142
|
+
(isIdentifierType(context.sup, access.receiver.type) || access.receiver.type === "navigation_expression") &&
|
|
1143
|
+
!context.resolveIdentifier(sliceText(access.receiver, context.source), access.receiver)) {
|
|
933
1144
|
dottedReceiverCalls.push({ fromId, access });
|
|
934
1145
|
return;
|
|
935
1146
|
}
|
|
936
|
-
recordReceiverCall(node, access);
|
|
1147
|
+
recordReceiverCall(node, access, undefined, receiverProof);
|
|
937
1148
|
return;
|
|
938
1149
|
}
|
|
939
1150
|
if (!callee)
|
|
@@ -948,90 +1159,20 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
|
|
|
948
1159
|
return;
|
|
949
1160
|
}
|
|
950
1161
|
}
|
|
951
|
-
const implicitOwnerLanguage = context.sup.id === "swift" || context.sup.id === "csharp";
|
|
952
|
-
if (implicitOwnerLanguage && isIdentifierType(context.sup, callee.type) && nearestMemberContainer(fn.node)) {
|
|
953
|
-
const name = sliceText(callee, context.source);
|
|
954
|
-
const lexical = context.resolveIdentifier(name, callee);
|
|
955
|
-
const importedCsharpMember = context.sup.id === "csharp" &&
|
|
956
|
-
!!lexical?.isMember &&
|
|
957
|
-
fileIdentityKey(lexical.file) !== fileIdentityKey(context.moduleEntry.file);
|
|
958
|
-
if (!importedCsharpMember && (!lexical || lexical.isMember || !context.hasNonModuleBinding(name, callee))) {
|
|
959
|
-
// A method's local binding wins. Type members require receiver ownership
|
|
960
|
-
// and static-scope proof; only a free function can be a fallback.
|
|
961
|
-
recordImplicitSelfMemberCall(node, callee, lexical?.isMember ? null : lexical);
|
|
962
|
-
return;
|
|
963
|
-
}
|
|
964
|
-
}
|
|
965
1162
|
if (!tryResolveNode(context, callee, fromId, "calls"))
|
|
966
1163
|
recordImplicitSelfMemberCall(node, callee);
|
|
967
1164
|
};
|
|
968
|
-
const recordRubySuper = (superNode) => {
|
|
969
|
-
const container = nearestMemberContainer(fn.node);
|
|
970
|
-
if (!container || container.type !== "class")
|
|
971
|
-
return;
|
|
972
|
-
const owner = memberContainerDef(context.moduleEntry, container);
|
|
973
|
-
if (!owner)
|
|
974
|
-
return;
|
|
975
|
-
context.receiverCalls.push({
|
|
976
|
-
callerId: fromId,
|
|
977
|
-
ownerId: ensureNode(context, owner),
|
|
978
|
-
viaSupertypes: true,
|
|
979
|
-
memberName: fn.def.localName,
|
|
980
|
-
argumentCount: null,
|
|
981
|
-
site: { file: context.moduleEntry.file, range: toRange(superNode) },
|
|
982
|
-
memberScope: "any",
|
|
983
|
-
});
|
|
984
|
-
};
|
|
985
1165
|
const recordCallOrInstantiation = (node) => {
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
return
|
|
989
|
-
}
|
|
990
|
-
if (node.type === "token_tree")
|
|
991
|
-
recordRustMacroArgumentCalls(context, node, fromId);
|
|
1166
|
+
const nodeResult = specialized?.onNode?.(context, fn, node, fromId);
|
|
1167
|
+
if (nodeResult !== undefined)
|
|
1168
|
+
return nodeResult;
|
|
992
1169
|
if (callNodeTypes.has(node.type)) {
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
if (calleeName === "new" || calleeName === "make") {
|
|
997
|
-
const argList = node.childForFieldName("arguments") ?? node.childForFieldName("argument_list");
|
|
998
|
-
const typeNode = argList?.namedChildren?.find((child) => child.type === "type_identifier") ?? null;
|
|
999
|
-
if (typeNode) {
|
|
1000
|
-
tryResolveNode(context, typeNode, fromId, "instantiates");
|
|
1001
|
-
}
|
|
1002
|
-
return false;
|
|
1003
|
-
}
|
|
1004
|
-
}
|
|
1005
|
-
if (context.sup.id === "ruby" && node.type === "call") {
|
|
1006
|
-
const methodNode = node.childForFieldName("method");
|
|
1007
|
-
const receiverNode = node.childForFieldName("receiver");
|
|
1008
|
-
const methodName = methodNode ? sliceText(methodNode, context.source) : null;
|
|
1009
|
-
if (methodName === "new" && receiverNode) {
|
|
1010
|
-
const recorded = tryResolveNode(context, receiverNode, fromId, "instantiates");
|
|
1011
|
-
if (!recorded) {
|
|
1012
|
-
const rubyType = resolveRubyVisibleConstant(context.index, context.moduleEntry, context.sup, sliceText(receiverNode, context.source));
|
|
1013
|
-
if (rubyType)
|
|
1014
|
-
recordDefEdge(context, fromId, rubyType, "instantiates", receiverNode);
|
|
1015
|
-
}
|
|
1016
|
-
return false;
|
|
1017
|
-
}
|
|
1018
|
-
if (methodNode?.type === "super")
|
|
1019
|
-
return true;
|
|
1020
|
-
if (methodNode) {
|
|
1021
|
-
resolveCallTarget(node, methodNode);
|
|
1022
|
-
return false;
|
|
1023
|
-
}
|
|
1024
|
-
const callee = getCallTarget(node);
|
|
1025
|
-
if (callee?.type === "super")
|
|
1026
|
-
return true;
|
|
1027
|
-
resolveCallTarget(node, callee);
|
|
1028
|
-
return false;
|
|
1029
|
-
}
|
|
1030
|
-
if (recordSwiftCapitalizedConstruction(context, node, fromId))
|
|
1031
|
-
return true;
|
|
1170
|
+
const callResult = specialized?.onCall?.(context, node, fromId, resolveCallTarget);
|
|
1171
|
+
if (callResult !== undefined)
|
|
1172
|
+
return callResult;
|
|
1032
1173
|
resolveCallTarget(node, getCallTarget(node));
|
|
1033
1174
|
}
|
|
1034
|
-
if (newNodeTypes
|
|
1175
|
+
if (newNodeTypes[node.type]) {
|
|
1035
1176
|
const keyword = phpObjectCreationKeyword(node, context.source, context.sup);
|
|
1036
1177
|
if (keyword) {
|
|
1037
1178
|
const created = resolvePhpObjectCreationTarget(context.index, context.moduleEntry, keyword, context.source, context.sup);
|
|
@@ -1090,15 +1231,14 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
|
|
|
1090
1231
|
}
|
|
1091
1232
|
else {
|
|
1092
1233
|
// Without an implicit `this` of the owner, `Owner::member()` can only name a static member.
|
|
1093
|
-
recordReceiverCall(call.node, call.access, implicitThis ?
|
|
1234
|
+
recordReceiverCall(call.node, call.access, implicitThis ? "any" : "static");
|
|
1094
1235
|
}
|
|
1095
1236
|
}
|
|
1096
1237
|
}
|
|
1097
1238
|
for (const { fromId, access } of dottedReceiverCalls) {
|
|
1098
1239
|
const member = await context.resolveMemberAccessTarget(access.property);
|
|
1099
1240
|
// The graph records no edge for a call its target cannot accept, as for other member calls.
|
|
1100
|
-
if (member &&
|
|
1101
|
-
(await memberAcceptsCallAt(context.index, member, access.accessNode, context.source, context.sup.id))) {
|
|
1241
|
+
if (member && memberAcceptsCallAt(context.index, member, access.accessNode, context.source, context.sup.id)) {
|
|
1102
1242
|
recordDefEdge(context, fromId, member, "calls", access.property);
|
|
1103
1243
|
}
|
|
1104
1244
|
}
|
|
@@ -1362,8 +1502,6 @@ export async function emitClassInheritanceEdges(context, classNodes) {
|
|
|
1362
1502
|
}
|
|
1363
1503
|
}
|
|
1364
1504
|
export function emitRustImplEdges(context, rootNode) {
|
|
1365
|
-
if (context.sup.id !== "rust")
|
|
1366
|
-
return;
|
|
1367
1505
|
const walkImpls = (node) => {
|
|
1368
1506
|
if (node.type === "impl_item") {
|
|
1369
1507
|
const typeIdentifiers = node.namedChildren?.filter((child) => child.type === "type_identifier") ?? [];
|