@lzehrung/codegraph 2.3.30 → 2.4.0
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 +30 -137
- package/codegraph-skill/codegraph/SKILL.md +5 -3
- package/dist/agent/artifact.d.ts +2 -0
- package/dist/agent/artifact.d.ts.map +1 -1
- package/dist/agent/artifact.js.map +1 -1
- package/dist/agent/search.d.ts.map +1 -1
- package/dist/agent/search.js +3 -0
- package/dist/agent/search.js.map +1 -1
- package/dist/agent/session.d.ts +3 -0
- package/dist/agent/session.d.ts.map +1 -1
- package/dist/agent/session.js +10 -2
- package/dist/agent/session.js.map +1 -1
- package/dist/bin/cli.js +42229 -28876
- package/dist/bin/query-index-worker.js +73 -11
- package/dist/cli/affected.d.ts.map +1 -1
- package/dist/cli/affected.js +4 -1
- package/dist/cli/affected.js.map +1 -1
- package/dist/cli/command-catalog.js +1 -1
- package/dist/cli/command-catalog.js.map +1 -1
- package/dist/cli/graph-queries.d.ts.map +1 -1
- package/dist/cli/graph-queries.js +27 -1
- package/dist/cli/graph-queries.js.map +1 -1
- package/dist/cli/help.d.ts +2 -2
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +4 -2
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/options.js +2 -2
- package/dist/cli/options.js.map +1 -1
- package/dist/drift/artifact.d.ts.map +1 -1
- package/dist/drift/artifact.js +15 -18
- package/dist/drift/artifact.js.map +1 -1
- package/dist/drift/compare.js +1 -1
- package/dist/drift/compare.js.map +1 -1
- package/dist/drift/snapshot.d.ts.map +1 -1
- package/dist/drift/snapshot.js +5 -6
- package/dist/drift/snapshot.js.map +1 -1
- package/dist/drift/types.d.ts +2 -0
- package/dist/drift/types.d.ts.map +1 -1
- package/dist/drift/types.js.map +1 -1
- package/dist/graph-builder.d.ts.map +1 -1
- package/dist/graph-builder.js +4 -6
- package/dist/graph-builder.js.map +1 -1
- package/dist/graph-edge-collector.d.ts +3 -0
- package/dist/graph-edge-collector.d.ts.map +1 -1
- package/dist/graph-edge-collector.js +8 -5
- package/dist/graph-edge-collector.js.map +1 -1
- package/dist/graphs/angularjs.d.ts.map +1 -1
- package/dist/graphs/angularjs.js +2 -1
- package/dist/graphs/angularjs.js.map +1 -1
- package/dist/graphs/edge-resolution.d.ts +4 -1
- package/dist/graphs/edge-resolution.d.ts.map +1 -1
- package/dist/graphs/edge-resolution.js +26 -2
- package/dist/graphs/edge-resolution.js.map +1 -1
- package/dist/graphs/specifiers.d.ts.map +1 -1
- package/dist/graphs/specifiers.js +6 -2
- package/dist/graphs/specifiers.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/ast.d.ts +20 -0
- package/dist/graphs/symbol-graph-detailed/ast.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/ast.js +154 -15
- package/dist/graphs/symbol-graph-detailed/ast.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts +51 -8
- package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/edge-passes.js +823 -132
- package/dist/graphs/symbol-graph-detailed/edge-passes.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/import-aliases.d.ts +2 -1
- package/dist/graphs/symbol-graph-detailed/import-aliases.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/import-aliases.js +139 -7
- package/dist/graphs/symbol-graph-detailed/import-aliases.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/member-chains.d.ts +1 -0
- package/dist/graphs/symbol-graph-detailed/member-chains.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/member-chains.js +3 -1
- package/dist/graphs/symbol-graph-detailed/member-chains.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts +128 -22
- package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/receiver-calls.js +872 -125
- 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 +434 -40
- package/dist/graphs/symbol-graph-detailed.js.map +1 -1
- package/dist/graphs/symbol-graph.d.ts +2 -0
- package/dist/graphs/symbol-graph.d.ts.map +1 -1
- package/dist/graphs/symbol-graph.js +34 -16
- package/dist/graphs/symbol-graph.js.map +1 -1
- package/dist/impact/call-compatibility/providers/index.d.ts +12 -0
- package/dist/impact/call-compatibility/providers/index.d.ts.map +1 -1
- package/dist/impact/call-compatibility/providers/index.js +16 -22
- package/dist/impact/call-compatibility/providers/index.js.map +1 -1
- package/dist/impact/call-compatibility/providers/types.d.ts +2 -0
- package/dist/impact/call-compatibility/providers/types.d.ts.map +1 -1
- package/dist/impact/call-compatibility/types.d.ts +6 -0
- package/dist/impact/call-compatibility/types.d.ts.map +1 -1
- package/dist/impact/call-compatibility.d.ts.map +1 -1
- package/dist/impact/call-compatibility.js +316 -552
- package/dist/impact/call-compatibility.js.map +1 -1
- package/dist/impact/map.js +1 -0
- package/dist/impact/map.js.map +1 -1
- package/dist/impact/member-resolution-coverage.d.ts.map +1 -1
- package/dist/impact/member-resolution-coverage.js +1 -1
- package/dist/impact/member-resolution-coverage.js.map +1 -1
- package/dist/impact/reference-cache.d.ts.map +1 -1
- package/dist/impact/reference-cache.js +2 -2
- package/dist/impact/reference-cache.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/indexer/ambiguous-resolution.d.ts +11 -0
- package/dist/indexer/ambiguous-resolution.d.ts.map +1 -0
- package/dist/indexer/ambiguous-resolution.js +19 -0
- package/dist/indexer/ambiguous-resolution.js.map +1 -0
- package/dist/indexer/build-cache/module-cache.d.ts +38 -0
- package/dist/indexer/build-cache/module-cache.d.ts.map +1 -1
- package/dist/indexer/build-cache/module-cache.js +151 -9
- package/dist/indexer/build-cache/module-cache.js.map +1 -1
- package/dist/indexer/build-cache/options.d.ts +16 -43
- package/dist/indexer/build-cache/options.d.ts.map +1 -1
- package/dist/indexer/build-cache/options.js +16 -43
- package/dist/indexer/build-cache/options.js.map +1 -1
- package/dist/indexer/build-cache/project-snapshot.d.ts +1 -0
- package/dist/indexer/build-cache/project-snapshot.d.ts.map +1 -1
- package/dist/indexer/build-cache/project-snapshot.js +117 -24
- package/dist/indexer/build-cache/project-snapshot.js.map +1 -1
- package/dist/indexer/build-cache/resolver-environment.d.ts.map +1 -1
- package/dist/indexer/build-cache/resolver-environment.js +32 -2
- package/dist/indexer/build-cache/resolver-environment.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 +593 -22
- package/dist/indexer/build-index.js.map +1 -1
- package/dist/indexer/call-hierarchy.js +1 -1
- package/dist/indexer/call-hierarchy.js.map +1 -1
- package/dist/indexer/compilation-units.d.ts +101 -0
- package/dist/indexer/compilation-units.d.ts.map +1 -0
- package/dist/indexer/compilation-units.js +605 -0
- package/dist/indexer/compilation-units.js.map +1 -0
- package/dist/indexer/cpp-callables.d.ts +20 -0
- package/dist/indexer/cpp-callables.d.ts.map +1 -0
- package/dist/indexer/cpp-callables.js +554 -0
- package/dist/indexer/cpp-callables.js.map +1 -0
- package/dist/indexer/declaration-visibility.d.ts +36 -2
- package/dist/indexer/declaration-visibility.d.ts.map +1 -1
- package/dist/indexer/declaration-visibility.js +136 -2
- package/dist/indexer/declaration-visibility.js.map +1 -1
- package/dist/indexer/expand-star-imports.d.ts.map +1 -1
- package/dist/indexer/expand-star-imports.js +28 -6
- package/dist/indexer/expand-star-imports.js.map +1 -1
- package/dist/indexer/import-types.d.ts +37 -0
- package/dist/indexer/import-types.d.ts.map +1 -1
- package/dist/indexer/import-types.js +24 -1
- package/dist/indexer/import-types.js.map +1 -1
- package/dist/indexer/imports/binding-ranges.d.ts +1 -1
- package/dist/indexer/imports/binding-ranges.d.ts.map +1 -1
- package/dist/indexer/imports/context.d.ts +11 -1
- package/dist/indexer/imports/context.d.ts.map +1 -1
- package/dist/indexer/imports/import-binding-tables.d.ts +75 -0
- package/dist/indexer/imports/import-binding-tables.d.ts.map +1 -0
- package/dist/indexer/imports/import-binding-tables.js +544 -0
- package/dist/indexer/imports/import-binding-tables.js.map +1 -0
- package/dist/indexer/imports/js-text-imports.js +4 -4
- package/dist/indexer/imports/js-text-imports.js.map +1 -1
- package/dist/indexer/imports/language-specific.d.ts +3 -22
- package/dist/indexer/imports/language-specific.d.ts.map +1 -1
- package/dist/indexer/imports/language-specific.js +29 -362
- package/dist/indexer/imports/language-specific.js.map +1 -1
- package/dist/indexer/imports/native-captures.d.ts.map +1 -1
- package/dist/indexer/imports/native-captures.js +18 -6
- package/dist/indexer/imports/native-captures.js.map +1 -1
- package/dist/indexer/imports/python.d.ts +10 -2
- package/dist/indexer/imports/python.d.ts.map +1 -1
- package/dist/indexer/imports/python.js +91 -40
- 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 +51 -12
- package/dist/indexer/imports/text-import-extractors.js.map +1 -1
- package/dist/indexer/imports.d.ts.map +1 -1
- package/dist/indexer/imports.js +25 -5
- package/dist/indexer/imports.js.map +1 -1
- package/dist/indexer/incremental-plan.d.ts +33 -0
- package/dist/indexer/incremental-plan.d.ts.map +1 -1
- package/dist/indexer/incremental-plan.js +187 -1
- package/dist/indexer/incremental-plan.js.map +1 -1
- package/dist/indexer/locals-and-exports.d.ts +2 -0
- package/dist/indexer/locals-and-exports.d.ts.map +1 -1
- package/dist/indexer/locals-and-exports.js +565 -54
- package/dist/indexer/locals-and-exports.js.map +1 -1
- package/dist/indexer/name-lookup-policies/c-family.d.ts +7 -0
- package/dist/indexer/name-lookup-policies/c-family.d.ts.map +1 -0
- package/dist/indexer/name-lookup-policies/c-family.js +117 -0
- package/dist/indexer/name-lookup-policies/c-family.js.map +1 -0
- package/dist/indexer/name-lookup-policies/csharp-using-static.d.ts +11 -0
- package/dist/indexer/name-lookup-policies/csharp-using-static.d.ts.map +1 -0
- package/dist/indexer/name-lookup-policies/csharp-using-static.js +136 -0
- package/dist/indexer/name-lookup-policies/csharp-using-static.js.map +1 -0
- package/dist/indexer/name-lookup-policies/implicit-self.d.ts +10 -0
- package/dist/indexer/name-lookup-policies/implicit-self.d.ts.map +1 -0
- package/dist/indexer/name-lookup-policies/implicit-self.js +113 -0
- package/dist/indexer/name-lookup-policies/implicit-self.js.map +1 -0
- package/dist/indexer/name-lookup-policies/index.d.ts +3 -0
- package/dist/indexer/name-lookup-policies/index.d.ts.map +1 -0
- package/dist/indexer/name-lookup-policies/index.js +106 -0
- package/dist/indexer/name-lookup-policies/index.js.map +1 -0
- package/dist/indexer/name-lookup-policies/php.d.ts +3 -0
- package/dist/indexer/name-lookup-policies/php.d.ts.map +1 -0
- package/dist/indexer/name-lookup-policies/php.js +75 -0
- package/dist/indexer/name-lookup-policies/php.js.map +1 -0
- package/dist/indexer/name-resolution-types.d.ts +99 -0
- package/dist/indexer/name-resolution-types.d.ts.map +1 -0
- package/dist/indexer/name-resolution-types.js +2 -0
- package/dist/indexer/name-resolution-types.js.map +1 -0
- package/dist/indexer/name-resolution.d.ts +52 -0
- package/dist/indexer/name-resolution.d.ts.map +1 -0
- package/dist/indexer/name-resolution.js +189 -0
- package/dist/indexer/name-resolution.js.map +1 -0
- package/dist/indexer/navigation-cpp.d.ts +50 -0
- package/dist/indexer/navigation-cpp.d.ts.map +1 -0
- package/dist/indexer/navigation-cpp.js +654 -0
- package/dist/indexer/navigation-cpp.js.map +1 -0
- package/dist/indexer/navigation-goto.d.ts +107 -4
- package/dist/indexer/navigation-goto.d.ts.map +1 -1
- package/dist/indexer/navigation-goto.js +2075 -137
- package/dist/indexer/navigation-goto.js.map +1 -1
- package/dist/indexer/navigation-local.d.ts +18 -2
- package/dist/indexer/navigation-local.d.ts.map +1 -1
- package/dist/indexer/navigation-local.js +498 -61
- package/dist/indexer/navigation-local.js.map +1 -1
- package/dist/indexer/navigation-php.d.ts +66 -0
- package/dist/indexer/navigation-php.d.ts.map +1 -1
- package/dist/indexer/navigation-php.js +287 -4
- package/dist/indexer/navigation-php.js.map +1 -1
- package/dist/indexer/navigation-references.d.ts +72 -5
- package/dist/indexer/navigation-references.d.ts.map +1 -1
- package/dist/indexer/navigation-references.js +620 -54
- package/dist/indexer/navigation-references.js.map +1 -1
- package/dist/indexer/navigation-resolve.d.ts +33 -2
- package/dist/indexer/navigation-resolve.d.ts.map +1 -1
- package/dist/indexer/navigation-resolve.js +446 -193
- package/dist/indexer/navigation-resolve.js.map +1 -1
- package/dist/indexer/navigation.d.ts +28 -2
- package/dist/indexer/navigation.d.ts.map +1 -1
- package/dist/indexer/navigation.js +1082 -151
- package/dist/indexer/navigation.js.map +1 -1
- package/dist/indexer/php-namespace-symbols.d.ts +66 -0
- package/dist/indexer/php-namespace-symbols.d.ts.map +1 -0
- package/dist/indexer/php-namespace-symbols.js +342 -0
- package/dist/indexer/php-namespace-symbols.js.map +1 -0
- package/dist/indexer/reference-context.d.ts +2 -0
- package/dist/indexer/reference-context.d.ts.map +1 -1
- package/dist/indexer/reference-context.js +4 -0
- package/dist/indexer/reference-context.js.map +1 -1
- package/dist/indexer/scope-nodes.d.ts +92 -13
- package/dist/indexer/scope-nodes.d.ts.map +1 -1
- package/dist/indexer/scope-nodes.js +212 -20
- package/dist/indexer/scope-nodes.js.map +1 -1
- package/dist/indexer/scope-types.d.ts +25 -1
- package/dist/indexer/scope-types.d.ts.map +1 -1
- package/dist/indexer/scope.d.ts.map +1 -1
- package/dist/indexer/scope.js +894 -45
- package/dist/indexer/scope.js.map +1 -1
- package/dist/indexer/shared-owner-identity.d.ts +53 -0
- package/dist/indexer/shared-owner-identity.d.ts.map +1 -0
- package/dist/indexer/shared-owner-identity.js +460 -0
- package/dist/indexer/shared-owner-identity.js.map +1 -0
- package/dist/indexer/shared.d.ts +1 -1
- package/dist/indexer/shared.d.ts.map +1 -1
- package/dist/indexer/shared.js +1 -1
- package/dist/indexer/shared.js.map +1 -1
- package/dist/indexer/star-import-precedence.d.ts +114 -0
- package/dist/indexer/star-import-precedence.d.ts.map +1 -0
- package/dist/indexer/star-import-precedence.js +396 -0
- package/dist/indexer/star-import-precedence.js.map +1 -0
- package/dist/indexer/symbols.d.ts +3 -1
- package/dist/indexer/symbols.d.ts.map +1 -1
- package/dist/indexer/symbols.js +58 -18
- package/dist/indexer/symbols.js.map +1 -1
- package/dist/indexer/ts-callables.d.ts +51 -0
- package/dist/indexer/ts-callables.d.ts.map +1 -0
- package/dist/indexer/ts-callables.js +264 -0
- package/dist/indexer/ts-callables.js.map +1 -0
- package/dist/indexer/types.d.ts +23 -1
- package/dist/indexer/types.d.ts.map +1 -1
- package/dist/indexer/unused-exports.d.ts +13 -0
- package/dist/indexer/unused-exports.d.ts.map +1 -0
- package/dist/indexer/unused-exports.js +159 -0
- package/dist/indexer/unused-exports.js.map +1 -0
- package/dist/indexer/workspace-symbols.d.ts.map +1 -1
- package/dist/indexer/workspace-symbols.js +3 -2
- package/dist/indexer/workspace-symbols.js.map +1 -1
- package/dist/indexer.d.ts +2 -2
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js +1 -1
- package/dist/indexer.js.map +1 -1
- package/dist/languages/callable-arity.d.ts +202 -0
- package/dist/languages/callable-arity.d.ts.map +1 -0
- package/dist/languages/callable-arity.js +1182 -0
- package/dist/languages/callable-arity.js.map +1 -0
- package/dist/languages/definitions/c-family.d.ts.map +1 -1
- package/dist/languages/definitions/c-family.js +30 -1
- package/dist/languages/definitions/c-family.js.map +1 -1
- package/dist/languages/definitions/c.d.ts +4 -0
- package/dist/languages/definitions/c.d.ts.map +1 -1
- package/dist/languages/definitions/c.js +19 -0
- package/dist/languages/definitions/c.js.map +1 -1
- package/dist/languages/definitions/cpp.d.ts.map +1 -1
- package/dist/languages/definitions/cpp.js +12 -0
- package/dist/languages/definitions/cpp.js.map +1 -1
- package/dist/languages/definitions/csharp.d.ts.map +1 -1
- package/dist/languages/definitions/csharp.js +2 -8
- package/dist/languages/definitions/csharp.js.map +1 -1
- package/dist/languages/definitions/go.d.ts.map +1 -1
- package/dist/languages/definitions/go.js +3 -0
- package/dist/languages/definitions/go.js.map +1 -1
- package/dist/languages/definitions/javascript.d.ts.map +1 -1
- package/dist/languages/definitions/javascript.js +10 -1
- package/dist/languages/definitions/javascript.js.map +1 -1
- package/dist/languages/definitions/js-family.d.ts +1 -1
- package/dist/languages/definitions/js-family.d.ts.map +1 -1
- package/dist/languages/definitions/js-family.js +7 -1
- package/dist/languages/definitions/js-family.js.map +1 -1
- package/dist/languages/definitions/php.d.ts.map +1 -1
- package/dist/languages/definitions/php.js +5 -1
- package/dist/languages/definitions/php.js.map +1 -1
- package/dist/languages/definitions/typescript.d.ts.map +1 -1
- package/dist/languages/definitions/typescript.js +8 -1
- package/dist/languages/definitions/typescript.js.map +1 -1
- package/dist/languages/definitions/zig.d.ts.map +1 -1
- package/dist/languages/definitions/zig.js +2 -0
- package/dist/languages/definitions/zig.js.map +1 -1
- package/dist/mcp/handlers.js +14 -7
- package/dist/mcp/handlers.js.map +1 -1
- package/dist/review/candidates.d.ts.map +1 -1
- package/dist/review/candidates.js +1 -1
- package/dist/review/candidates.js.map +1 -1
- package/dist/review/deleted.d.ts +3 -3
- package/dist/review/deleted.d.ts.map +1 -1
- package/dist/review/deleted.js +82 -32
- package/dist/review/deleted.js.map +1 -1
- package/dist/review/report.d.ts +1 -0
- package/dist/review/report.d.ts.map +1 -1
- package/dist/review/report.js +1 -1
- package/dist/review/report.js.map +1 -1
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +1 -0
- package/dist/review.js.map +1 -1
- package/dist/sql/navigation.d.ts.map +1 -1
- package/dist/sql/navigation.js +1 -0
- package/dist/sql/navigation.js.map +1 -1
- package/dist/sql/source-graph.d.ts.map +1 -1
- package/dist/sql/source-graph.js +2 -2
- package/dist/sql/source-graph.js.map +1 -1
- package/dist/sqlite/schema.d.ts +1 -1
- package/dist/sqlite/schema.d.ts.map +1 -1
- package/dist/sqlite/schema.js +8 -2
- package/dist/sqlite/schema.js.map +1 -1
- package/dist/sqlite/write.js +2 -2
- package/dist/sqlite/write.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/util/bloom-filter.d.ts +7 -1
- package/dist/util/bloom-filter.d.ts.map +1 -1
- package/dist/util/bloom-filter.js +12 -2
- package/dist/util/bloom-filter.js.map +1 -1
- package/dist/util/dynamic-import-tables.d.ts +88 -0
- package/dist/util/dynamic-import-tables.d.ts.map +1 -0
- package/dist/util/dynamic-import-tables.js +100 -0
- package/dist/util/dynamic-import-tables.js.map +1 -0
- package/dist/util/graph-edges.d.ts +19 -1
- package/dist/util/graph-edges.d.ts.map +1 -1
- package/dist/util/graph-edges.js +30 -4
- package/dist/util/graph-edges.js.map +1 -1
- package/dist/util/identifiers.d.ts +15 -0
- package/dist/util/identifiers.d.ts.map +1 -1
- package/dist/util/identifiers.js +35 -0
- package/dist/util/identifiers.js.map +1 -1
- package/dist/util/member-access-tables.d.ts +129 -0
- package/dist/util/member-access-tables.d.ts.map +1 -0
- package/dist/util/member-access-tables.js +285 -0
- package/dist/util/member-access-tables.js.map +1 -0
- package/dist/util/member-access.d.ts +17 -0
- package/dist/util/member-access.d.ts.map +1 -1
- package/dist/util/member-access.js +138 -93
- package/dist/util/member-access.js.map +1 -1
- package/dist/util/resolution/cargo-targets.d.ts +11 -0
- package/dist/util/resolution/cargo-targets.d.ts.map +1 -1
- package/dist/util/resolution/cargo-targets.js +174 -13
- package/dist/util/resolution/cargo-targets.js.map +1 -1
- package/dist/util/resolution/csharp.d.ts +33 -1
- package/dist/util/resolution/csharp.d.ts.map +1 -1
- package/dist/util/resolution/csharp.js +145 -30
- package/dist/util/resolution/csharp.js.map +1 -1
- package/dist/util/resolution/php.d.ts.map +1 -1
- package/dist/util/resolution/php.js +35 -8
- package/dist/util/resolution/php.js.map +1 -1
- package/dist/util/resolution/python.d.ts +9 -0
- package/dist/util/resolution/python.d.ts.map +1 -1
- package/dist/util/resolution/python.js +46 -0
- package/dist/util/resolution/python.js.map +1 -1
- package/dist/util/resolution/rust.d.ts.map +1 -1
- package/dist/util/resolution/rust.js +95 -26
- package/dist/util/resolution/rust.js.map +1 -1
- package/dist/util/resolution-candidates.d.ts +5 -0
- package/dist/util/resolution-candidates.d.ts.map +1 -1
- package/dist/util/resolution-candidates.js +16 -3
- package/dist/util/resolution-candidates.js.map +1 -1
- package/dist/util/resolution.d.ts +2 -1
- package/dist/util/resolution.d.ts.map +1 -1
- package/dist/util/resolution.js +96 -5
- package/dist/util/resolution.js.map +1 -1
- package/dist/util/specifiers.d.ts +20 -0
- package/dist/util/specifiers.d.ts.map +1 -1
- package/dist/util/specifiers.js +39 -93
- package/dist/util/specifiers.js.map +1 -1
- package/docs/mcp.md +3 -2
- package/package.json +3 -3
|
@@ -1,19 +1,126 @@
|
|
|
1
|
+
import { definitionWithoutDeferredSteps, nameResolutionPreloadFiles, phpImportTypeAtPosition, resolveBareName, settleNameResolution, } from "../indexer/name-resolution.js";
|
|
2
|
+
import { recoverIncludedCallableStar } from "../indexer/navigation.js";
|
|
1
3
|
import { isUnsupportedParserInputError, prepareSourceInput } from "../languages/file-prep.js";
|
|
4
|
+
import { supportForFileWithoutHeaderSample } from "../languages.js";
|
|
2
5
|
import { logWithLevel } from "../logging.js";
|
|
3
6
|
import { ProjectedSyntaxTree } from "../native/projected-tree.js";
|
|
4
7
|
import { assertNativeRequiredAvailable, getNativeSyntaxTreeExecution, isNativeRequiredUnavailableError, } from "../native/tree-sitter-native.js";
|
|
5
|
-
import {
|
|
8
|
+
import { cppCallableIsDefinition, cppEquivalentCallableBindings } from "../indexer/cpp-callables.js";
|
|
9
|
+
import { cjsRequireValueBinding, resolveExport } from "../indexer/navigation-resolve.js";
|
|
10
|
+
import { typescriptCollapsedOverloadTarget, typescriptCallableContainerKey, typescriptCallableRoleAt, typescriptOverloadImplementationAcceptsCount, } from "../indexer/ts-callables.js";
|
|
11
|
+
import { isJsTsLanguage } from "../languages/js-family.js";
|
|
12
|
+
import { isGoExportedMemberName, languageHasDeclarationVisibility } from "../indexer/declaration-visibility.js";
|
|
13
|
+
import { innermostNamespaceImport, resolveMemberAccessDefinition } from "../indexer/navigation-goto.js";
|
|
14
|
+
import { inferPhpQualifiedReferenceImportType } from "../indexer/navigation-php.js";
|
|
15
|
+
import { ensurePhpNamespaceSymbolIndex } from "../indexer/php-namespace-symbols.js";
|
|
6
16
|
import { findClosestScopeBinding, getOrBuildScopeIndex } from "../indexer/navigation-local.js";
|
|
7
|
-
import {
|
|
17
|
+
import { ensureParsedContext } from "../indexer/parse-context.js";
|
|
18
|
+
import { SymbolKind, } from "../indexer/types.js";
|
|
8
19
|
import { fileIdentityKey, normalizePath } from "../util/paths.js";
|
|
9
|
-
import {
|
|
20
|
+
import { foldPhpIdentifierCase } from "../util/identifiers.js";
|
|
21
|
+
import { buildSymbolGraph, defNodeId } from "./symbol-graph.js";
|
|
10
22
|
import { collectDetailedDeclarations } from "./symbol-graph-detailed/ast.js";
|
|
11
23
|
import { emitClassInheritanceEdges, emitFunctionBodyEdges, emitMemberOwnershipEdges, emitMemberImplementationEdges, emitPythonDecoratorEdges, emitRustImplEdges, } from "./symbol-graph-detailed/edge-passes.js";
|
|
12
24
|
import { buildImportAliasMaps } from "./symbol-graph-detailed/import-aliases.js";
|
|
13
25
|
import { createMemberChainResolver } from "./symbol-graph-detailed/member-chains.js";
|
|
14
|
-
import { emitReceiverCallEdges } from "./symbol-graph-detailed/receiver-calls.js";
|
|
26
|
+
import { emitReceiverCallEdges, } from "./symbol-graph-detailed/receiver-calls.js";
|
|
27
|
+
const CPP_CLASS_DECLARATION_TYPES = new Set(["class_specifier", "struct_specifier", "union_specifier"]);
|
|
28
|
+
function symbolDefForBinding(moduleEntry, binding) {
|
|
29
|
+
const bindingRange = binding.def;
|
|
30
|
+
if (!bindingRange)
|
|
31
|
+
return null;
|
|
32
|
+
return (moduleEntry.locals.find((candidate) => candidate.kind === SymbolKind.Function &&
|
|
33
|
+
candidate.range.start.index === bindingRange.start.index &&
|
|
34
|
+
candidate.range.end.index === bindingRange.end.index) ?? null);
|
|
35
|
+
}
|
|
36
|
+
function recordCallableDeclarationAliases(moduleEntry, languageId, bindings, nodeAliases) {
|
|
37
|
+
const recordGroup = (group) => {
|
|
38
|
+
if (group.length < 2)
|
|
39
|
+
return;
|
|
40
|
+
const canonicalBinding = group.find((binding) => !cppCallableIsDefinition(binding.node)) ?? group[0];
|
|
41
|
+
const canonicalDef = symbolDefForBinding(moduleEntry, canonicalBinding);
|
|
42
|
+
if (!canonicalDef)
|
|
43
|
+
return;
|
|
44
|
+
const canonicalId = defNodeId(canonicalDef);
|
|
45
|
+
for (const binding of group) {
|
|
46
|
+
const def = symbolDefForBinding(moduleEntry, binding);
|
|
47
|
+
if (!def)
|
|
48
|
+
continue;
|
|
49
|
+
const id = defNodeId(def);
|
|
50
|
+
if (id !== canonicalId)
|
|
51
|
+
nodeAliases.set(id, canonicalId);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
if (languageId === "c") {
|
|
55
|
+
const byName = new Map();
|
|
56
|
+
for (const binding of bindings) {
|
|
57
|
+
if (binding.kind !== "function" || !binding.def)
|
|
58
|
+
continue;
|
|
59
|
+
const group = byName.get(binding.canonicalName) ?? [];
|
|
60
|
+
group.push(binding);
|
|
61
|
+
byName.set(binding.canonicalName, group);
|
|
62
|
+
}
|
|
63
|
+
for (const group of byName.values())
|
|
64
|
+
recordGroup(group);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (languageId !== "cpp")
|
|
68
|
+
return;
|
|
69
|
+
const handled = new Set();
|
|
70
|
+
for (const binding of bindings) {
|
|
71
|
+
if (binding.kind !== "function" || handled.has(binding))
|
|
72
|
+
continue;
|
|
73
|
+
const group = cppEquivalentCallableBindings(binding);
|
|
74
|
+
for (const candidate of group)
|
|
75
|
+
handled.add(candidate);
|
|
76
|
+
recordGroup(group);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function recordTypeScriptCallableAliases(moduleEntry, languageId, tree, nodeAliases) {
|
|
80
|
+
if (languageId !== "ts" && languageId !== "tsx")
|
|
81
|
+
return;
|
|
82
|
+
const groups = new Map();
|
|
83
|
+
for (const local of moduleEntry.locals) {
|
|
84
|
+
if (local.kind !== SymbolKind.Function)
|
|
85
|
+
continue;
|
|
86
|
+
const start = local.range.start.index ?? 0;
|
|
87
|
+
const end = local.range.end.index ?? start;
|
|
88
|
+
const role = typescriptCallableRoleAt(tree, start, end);
|
|
89
|
+
if (role === "other")
|
|
90
|
+
continue;
|
|
91
|
+
const key = `${typescriptCallableContainerKey(tree, start, end)}\0${local.localName}`;
|
|
92
|
+
const group = groups.get(key) ?? [];
|
|
93
|
+
group.push(local);
|
|
94
|
+
groups.set(key, group);
|
|
95
|
+
}
|
|
96
|
+
for (const group of groups.values()) {
|
|
97
|
+
if (group.length < 2)
|
|
98
|
+
continue;
|
|
99
|
+
// Signature-only and multiply implemented groups keep their distinct declarations.
|
|
100
|
+
const canonical = typescriptCollapsedOverloadTarget(group, tree, (local) => local);
|
|
101
|
+
if (!canonical)
|
|
102
|
+
continue;
|
|
103
|
+
const canonicalId = defNodeId(canonical);
|
|
104
|
+
for (const local of group) {
|
|
105
|
+
const id = defNodeId(local);
|
|
106
|
+
if (id !== canonicalId)
|
|
107
|
+
nodeAliases.set(id, canonicalId);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The indexed symbol a definition names (with its member metadata), or null for a parameter or
|
|
113
|
+
* block local, which has no graph node.
|
|
114
|
+
*/
|
|
115
|
+
function indexedSymbolFor(index, def) {
|
|
116
|
+
const module = index.byFile.get(fileIdentityKey(def.file));
|
|
117
|
+
return (module?.locals.find((local) => local.localName === def.localName &&
|
|
118
|
+
local.range.start.index === def.range.start.index &&
|
|
119
|
+
local.range.end.index === def.range.end.index) ?? null);
|
|
120
|
+
}
|
|
15
121
|
export async function buildSymbolGraphDetailed(index, opts) {
|
|
16
122
|
assertNativeRequiredAvailable(index.nativeMode);
|
|
123
|
+
await ensurePhpNamespaceSymbolIndex(index);
|
|
17
124
|
const base = await buildSymbolGraph(index, opts?.files ? { files: opts.files } : undefined);
|
|
18
125
|
const configuredMaxEdges = typeof opts?.maxEdges === "number" && opts.maxEdges > 0 ? Math.floor(opts.maxEdges) : undefined;
|
|
19
126
|
const maxEdges = configuredMaxEdges ?? Number.POSITIVE_INFINITY;
|
|
@@ -49,15 +156,23 @@ export async function buildSymbolGraphDetailed(index, opts) {
|
|
|
49
156
|
edgeCount++;
|
|
50
157
|
return true;
|
|
51
158
|
};
|
|
52
|
-
const
|
|
159
|
+
const edgeKey = (fromId, toId, label, site) => {
|
|
53
160
|
const siteKey = site ? `${site.file}:${site.range.start.index ?? ""}:${site.range.end.index ?? ""}` : "";
|
|
54
|
-
|
|
161
|
+
return `${fromId}->${toId}::${label ?? ""}::${siteKey}`;
|
|
162
|
+
};
|
|
163
|
+
const recordEdge = (fromId, toId, label, site) => {
|
|
164
|
+
const key = edgeKey(fromId, toId, label, site);
|
|
55
165
|
if (added.has(key))
|
|
56
166
|
return true;
|
|
57
167
|
added.add(key);
|
|
58
168
|
return maybePushEdge(fromId, toId, label, site);
|
|
59
169
|
};
|
|
60
|
-
const resolveExportNamespace = (file, exportedName) =>
|
|
170
|
+
const resolveExportNamespace = (file, exportedName) => {
|
|
171
|
+
const languageId = supportForFileWithoutHeaderSample(file, index.languageExtensions)?.id;
|
|
172
|
+
if (!isGoExportedMemberName(languageId, exportedName))
|
|
173
|
+
return null;
|
|
174
|
+
return resolveExport(index, file, exportedName);
|
|
175
|
+
};
|
|
61
176
|
const resolveExportDef = (file, exportedName) => {
|
|
62
177
|
const resolved = resolveExportNamespace(file, exportedName);
|
|
63
178
|
return resolved?.kind === "resolved" ? resolved.def : null;
|
|
@@ -68,7 +183,10 @@ export async function buildSymbolGraphDetailed(index, opts) {
|
|
|
68
183
|
for (const segment of [...names].reverse()) {
|
|
69
184
|
if (!file)
|
|
70
185
|
break;
|
|
71
|
-
const
|
|
186
|
+
const languageId = supportForFileWithoutHeaderSample(file, index.languageExtensions)?.id;
|
|
187
|
+
const resolved = languageId && isJsTsLanguage(languageId)
|
|
188
|
+
? resolveExport(index, file, segment, { allowLocalFallback: false })
|
|
189
|
+
: resolveExportNamespace(file, segment);
|
|
72
190
|
if (!resolved) {
|
|
73
191
|
targetDef = null;
|
|
74
192
|
break;
|
|
@@ -81,32 +199,70 @@ export async function buildSymbolGraphDetailed(index, opts) {
|
|
|
81
199
|
targetDef = resolved.def;
|
|
82
200
|
file = normalizePath(targetDef.file);
|
|
83
201
|
}
|
|
84
|
-
if (targetDef)
|
|
202
|
+
if (targetDef)
|
|
85
203
|
return targetDef;
|
|
86
|
-
|
|
204
|
+
const languageId = supportForFileWithoutHeaderSample(file ?? startFile, index.languageExtensions)?.id;
|
|
205
|
+
if (languageId === "c" ||
|
|
206
|
+
languageId === "cpp" ||
|
|
207
|
+
(languageId && (isJsTsLanguage(languageId) || languageHasDeclarationVisibility(languageId))))
|
|
208
|
+
return null;
|
|
87
209
|
const fileKey = typeof file === "string" ? fileIdentityKey(file) : null;
|
|
88
210
|
const moduleEntry = fileKey ? index.byFile.get(fileKey) : undefined;
|
|
89
211
|
const lastName = names[0];
|
|
212
|
+
if (languageId === "go" && (!lastName || !isGoExportedMemberName(languageId, lastName)))
|
|
213
|
+
return null;
|
|
90
214
|
return moduleEntry?.locals.find((entry) => entry.localName === lastName) ?? null;
|
|
91
215
|
};
|
|
92
216
|
const resolveExportFrom = (file, exportedName) => resolveExportDef(file, exportedName);
|
|
93
217
|
const receiverCalls = [];
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
218
|
+
const fileHiddenMemberIds = new Set();
|
|
219
|
+
const receiverMemberScopes = new Map();
|
|
220
|
+
const receiverMemberArities = new Map();
|
|
221
|
+
const sharedOwnerPeers = new Map();
|
|
222
|
+
const sharedOwnerAnchors = new Map();
|
|
223
|
+
const sharedOwnerAccessibleMembers = new Map();
|
|
224
|
+
const nodeAliases = new Map();
|
|
225
|
+
const ownershipParsedContexts = new Map();
|
|
226
|
+
const loadParsedFile = (file) => {
|
|
227
|
+
const fileKey = fileIdentityKey(file);
|
|
228
|
+
const cached = ownershipParsedContexts.get(fileKey);
|
|
229
|
+
if (cached)
|
|
230
|
+
return cached;
|
|
231
|
+
const pending = ensureParsedContext(file, index.parsed?.get(fileKey), index.languageExtensions).catch(() => null);
|
|
232
|
+
ownershipParsedContexts.set(fileKey, pending);
|
|
233
|
+
return pending;
|
|
234
|
+
};
|
|
235
|
+
// Receiver calls into runtime and dependency APIs dominate real call sites. Build these
|
|
236
|
+
// indexes lazily so a scoped graph that has no receiver calls pays no allocation cost.
|
|
98
237
|
let callableNames;
|
|
99
|
-
const
|
|
238
|
+
const ensureCallableNames = () => {
|
|
100
239
|
if (!callableNames) {
|
|
101
|
-
callableNames = new Set();
|
|
240
|
+
callableNames = { exact: new Set(), phpFolded: new Set() };
|
|
102
241
|
for (const entry of index.byFile.values()) {
|
|
242
|
+
const isPhp = supportForFileWithoutHeaderSample(entry.file, index.languageExtensions)?.id === "php";
|
|
103
243
|
for (const local of entry.locals) {
|
|
104
|
-
if (local.kind
|
|
105
|
-
|
|
244
|
+
if (local.kind !== SymbolKind.Function)
|
|
245
|
+
continue;
|
|
246
|
+
callableNames.exact.add(local.localName);
|
|
247
|
+
if (isPhp)
|
|
248
|
+
callableNames.phpFolded.add(foldPhpIdentifierCase(local.localName));
|
|
106
249
|
}
|
|
107
250
|
}
|
|
108
251
|
}
|
|
109
|
-
return callableNames
|
|
252
|
+
return callableNames;
|
|
253
|
+
};
|
|
254
|
+
const hasCallableNamed = (name, phpCaseInsensitive = false) => {
|
|
255
|
+
const names = ensureCallableNames();
|
|
256
|
+
return phpCaseInsensitive ? names.phpFolded.has(foldPhpIdentifierCase(name)) : names.exact.has(name);
|
|
257
|
+
};
|
|
258
|
+
// Function-valued bindings (`const helper = () => 1`) index as variables, so the
|
|
259
|
+
// kind scan above cannot see them; the detailed pass mirrors each name it proves
|
|
260
|
+
// callable here as its files are processed.
|
|
261
|
+
const noteCallableName = (name, phpCaseInsensitive = false) => {
|
|
262
|
+
const names = ensureCallableNames();
|
|
263
|
+
names.exact.add(name);
|
|
264
|
+
if (phpCaseInsensitive)
|
|
265
|
+
names.phpFolded.add(foldPhpIdentifierCase(name));
|
|
110
266
|
};
|
|
111
267
|
const optionFileKeys = opts?.files ? new Set(Array.from(opts.files, fileIdentityKey)) : undefined;
|
|
112
268
|
for (const moduleEntry of index.byFile.values()) {
|
|
@@ -147,7 +303,19 @@ export async function buildSymbolGraphDetailed(index, opts) {
|
|
|
147
303
|
if (!sup || src === undefined || !tree) {
|
|
148
304
|
throw new Error(`Failed to parse ${file}`);
|
|
149
305
|
}
|
|
150
|
-
|
|
306
|
+
ownershipParsedContexts.set(fileIdentityKey(file), Promise.resolve({ source: src, tree, sup }));
|
|
307
|
+
const scopeIndex = getOrBuildScopeIndex(index, file, src, sup, moduleEntry, tree);
|
|
308
|
+
const { aliasToTargetDef, aliasToTargetModule } = buildImportAliasMaps(index, moduleEntry, resolveExportNamespace, resolveExportFrom, scopeIndex);
|
|
309
|
+
if (sup.id === "c" || sup.id === "cpp") {
|
|
310
|
+
for (const [alias, def] of [...aliasToTargetDef]) {
|
|
311
|
+
const exported = resolveExport(index, def.file, alias, {
|
|
312
|
+
allowLocalFallback: false,
|
|
313
|
+
...(sup.id === "c" ? { cNamespace: "ordinary" } : {}),
|
|
314
|
+
});
|
|
315
|
+
if (exported?.kind !== "resolved")
|
|
316
|
+
aliasToTargetDef.delete(alias);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
151
319
|
const { functionNodes, classNodes, constStringOf } = collectDetailedDeclarations(tree.rootNode, sup, src, moduleEntry.locals);
|
|
152
320
|
const memberResolver = createMemberChainResolver({
|
|
153
321
|
sup,
|
|
@@ -155,27 +323,100 @@ export async function buildSymbolGraphDetailed(index, opts) {
|
|
|
155
323
|
constStringOf,
|
|
156
324
|
aliasToTargetModule,
|
|
157
325
|
resolveMemberPathFromModule,
|
|
326
|
+
...(sup.id === "zig" || sup.id === "csharp" || isJsTsLanguage(sup.id)
|
|
327
|
+
? {
|
|
328
|
+
resolveNamespaceAlias: (alias, useNode) => {
|
|
329
|
+
if (sup.id === "zig") {
|
|
330
|
+
const binding = findClosestScopeBinding(scopeIndex, alias, useNode, sup);
|
|
331
|
+
if (binding && binding.kind !== "namespace")
|
|
332
|
+
return undefined;
|
|
333
|
+
}
|
|
334
|
+
const imported = innermostNamespaceImport(moduleEntry.imports, alias, useNode, sup.normalizeIdentifier);
|
|
335
|
+
if (isJsTsLanguage(sup.id) &&
|
|
336
|
+
imported?.mechanism === "cjs" &&
|
|
337
|
+
typeof imported.resolved === "string" &&
|
|
338
|
+
cjsRequireValueBinding(index, imported.resolved)) {
|
|
339
|
+
return undefined;
|
|
340
|
+
}
|
|
341
|
+
if (typeof imported?.resolved === "string")
|
|
342
|
+
return imported.resolved;
|
|
343
|
+
if (isJsTsLanguage(sup.id))
|
|
344
|
+
return aliasToTargetModule.get(alias);
|
|
345
|
+
return undefined;
|
|
346
|
+
},
|
|
347
|
+
}
|
|
348
|
+
: {}),
|
|
349
|
+
// Go has no `resolveNamespaceAlias` override otherwise, so a local variable that
|
|
350
|
+
// shadows a package alias (`u := LocalU{}; u.Square()` alongside `import u "pkg"`)
|
|
351
|
+
// would still resolve `u.Square` through the blind `aliasToTargetModule` text map.
|
|
352
|
+
// Refuse the package alias whenever a closer, non-namespace scope binding owns the
|
|
353
|
+
// name at this exact use site, matching how the receiver-proof path already treats
|
|
354
|
+
// the local as the real receiver instead.
|
|
355
|
+
...(sup.id === "go"
|
|
356
|
+
? {
|
|
357
|
+
resolveNamespaceAlias: (alias, useNode) => {
|
|
358
|
+
const binding = findClosestScopeBinding(scopeIndex, alias, useNode, sup);
|
|
359
|
+
if (binding && binding.kind !== "namespace")
|
|
360
|
+
return undefined;
|
|
361
|
+
return aliasToTargetModule.get(alias);
|
|
362
|
+
},
|
|
363
|
+
}
|
|
364
|
+
: {}),
|
|
158
365
|
});
|
|
159
366
|
const { memberExpressionType, optionalMemberTypes, propertyIdentifierTypes, resolveMemberChainTarget } = memberResolver;
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
const
|
|
171
|
-
if (
|
|
172
|
-
|
|
173
|
-
|
|
367
|
+
recordCallableDeclarationAliases(moduleEntry, sup.id, scopeIndex.all, nodeAliases);
|
|
368
|
+
recordTypeScriptCallableAliases(moduleEntry, sup.id, tree, nodeAliases);
|
|
369
|
+
// Files the shared name lookup reads synchronously for this module (imports, C++ includes).
|
|
370
|
+
const parsedForResolution = new Map([
|
|
371
|
+
[fileIdentityKey(file), { source: src, tree, sup }],
|
|
372
|
+
]);
|
|
373
|
+
for (const preload of nameResolutionPreloadFiles(index, moduleEntry, sup.id)) {
|
|
374
|
+
const key = fileIdentityKey(preload);
|
|
375
|
+
if (parsedForResolution.has(key))
|
|
376
|
+
continue;
|
|
377
|
+
const parsedFile = await loadParsedFile(preload);
|
|
378
|
+
if (parsedFile)
|
|
379
|
+
parsedForResolution.set(key, parsedFile);
|
|
380
|
+
}
|
|
381
|
+
const resolutionFiles = {
|
|
382
|
+
get: (target) => parsedForResolution.get(fileIdentityKey(target)) ?? null,
|
|
383
|
+
};
|
|
384
|
+
const moduleParsed = { source: src, tree, sup };
|
|
385
|
+
const bareNameUse = (name, node) => {
|
|
386
|
+
const phpImportType = sup.id === "php"
|
|
387
|
+
? (phpImportTypeAtPosition(moduleEntry.imports, node.startPosition.row, node.startPosition.column) ??
|
|
388
|
+
inferPhpQualifiedReferenceImportType(node))
|
|
389
|
+
: undefined;
|
|
390
|
+
return {
|
|
391
|
+
index,
|
|
392
|
+
mod: moduleEntry,
|
|
393
|
+
file,
|
|
394
|
+
parsed: moduleParsed,
|
|
395
|
+
scopeIndex,
|
|
396
|
+
files: resolutionFiles,
|
|
397
|
+
node,
|
|
398
|
+
name,
|
|
399
|
+
...(phpImportType ? { phpImportType } : {}),
|
|
400
|
+
};
|
|
401
|
+
};
|
|
402
|
+
// The graph has nodes only for indexed symbols; a parameter or function-local binding
|
|
403
|
+
// that navigation resolves has no node, so it gets no edge.
|
|
404
|
+
const indexedOrNull = (definition) => definition ? indexedSymbolFor(index, definition) : null;
|
|
405
|
+
const resolveName = (name, node) => resolveBareName(bareNameUse(name, node));
|
|
406
|
+
const resolveIdentifier = (name, node) => indexedOrNull(definitionWithoutDeferredSteps(resolveName(name, node)));
|
|
407
|
+
const settleName = async (name, node, resolution) => {
|
|
408
|
+
const settled = await settleNameResolution(bareNameUse(name, node), resolution, {
|
|
409
|
+
// A member that cannot accept the call's argument count gets no edge and no fallback.
|
|
410
|
+
requireAcceptedArity: true,
|
|
411
|
+
recoverIncludedStar: (lookupName, cNamespace) => recoverIncludedCallableStar(index, moduleEntry, sup.id, lookupName, cNamespace, node, src),
|
|
412
|
+
});
|
|
413
|
+
return indexedOrNull(settled?.status === "ok" ? settled.definition : null);
|
|
174
414
|
};
|
|
175
415
|
const edgePassContext = {
|
|
176
416
|
index,
|
|
177
417
|
sup,
|
|
178
418
|
source: src,
|
|
419
|
+
tree,
|
|
179
420
|
moduleEntry,
|
|
180
421
|
nodes,
|
|
181
422
|
membersOnly,
|
|
@@ -185,16 +426,57 @@ export async function buildSymbolGraphDetailed(index, opts) {
|
|
|
185
426
|
aliasToTargetDef,
|
|
186
427
|
aliasToTargetModule,
|
|
187
428
|
resolveIdentifier,
|
|
429
|
+
resolveName,
|
|
430
|
+
settleName,
|
|
431
|
+
hasNonModuleBinding: (name, node) => {
|
|
432
|
+
const binding = findClosestScopeBinding(scopeIndex, name, node, sup);
|
|
433
|
+
return !!binding && scopeIndex.allScopes[0]?.map.get(binding.canonicalName) !== binding;
|
|
434
|
+
},
|
|
188
435
|
resolveExportFrom,
|
|
189
436
|
resolveMemberChainTarget,
|
|
437
|
+
cppDeclaresClass: (def) => {
|
|
438
|
+
const parsed = parsedForResolution.get(fileIdentityKey(def.file));
|
|
439
|
+
if (!parsed)
|
|
440
|
+
return false;
|
|
441
|
+
const start = def.range.start.index ?? 0;
|
|
442
|
+
const nameNode = parsed.tree.rootNode.descendantForIndex(start, def.range.end.index ?? start);
|
|
443
|
+
return CPP_CLASS_DECLARATION_TYPES.has(nameNode.parent?.type ?? "");
|
|
444
|
+
},
|
|
445
|
+
resolveMemberAccessTarget: async (node) => {
|
|
446
|
+
const useNode = tree.rootNode.descendantForIndex(node.startIndex, node.endIndex);
|
|
447
|
+
const resolved = await resolveMemberAccessDefinition({
|
|
448
|
+
index,
|
|
449
|
+
mod: moduleEntry,
|
|
450
|
+
node: useNode,
|
|
451
|
+
source: src,
|
|
452
|
+
tree,
|
|
453
|
+
sup,
|
|
454
|
+
resolveLexicalBinding: (expression) => {
|
|
455
|
+
const name = src.slice(expression.startIndex, expression.endIndex);
|
|
456
|
+
const imported = aliasToTargetDef.get(name);
|
|
457
|
+
if (imported)
|
|
458
|
+
return imported;
|
|
459
|
+
return resolveIdentifier(name, expression);
|
|
460
|
+
},
|
|
461
|
+
});
|
|
462
|
+
return resolved?.status === "ok" ? resolved.definition : null;
|
|
463
|
+
},
|
|
190
464
|
recordEdge,
|
|
191
465
|
receiverCalls,
|
|
192
|
-
|
|
466
|
+
receiverMemberScopes,
|
|
467
|
+
receiverMemberArities,
|
|
468
|
+
sharedOwnerPeers,
|
|
469
|
+
sharedOwnerAnchors,
|
|
470
|
+
sharedOwnerAccessibleMembers,
|
|
471
|
+
fileHiddenMemberIds,
|
|
472
|
+
nodeAliases,
|
|
473
|
+
noteCallableName,
|
|
474
|
+
loadParsedFile,
|
|
193
475
|
};
|
|
194
476
|
emitPythonDecoratorEdges(edgePassContext, tree.rootNode);
|
|
195
|
-
emitFunctionBodyEdges(edgePassContext, functionNodes);
|
|
196
|
-
emitMemberOwnershipEdges(edgePassContext, functionNodes, classNodes);
|
|
197
|
-
emitClassInheritanceEdges(edgePassContext, classNodes);
|
|
477
|
+
await emitFunctionBodyEdges(edgePassContext, functionNodes);
|
|
478
|
+
await emitMemberOwnershipEdges(edgePassContext, functionNodes, classNodes);
|
|
479
|
+
await emitClassInheritanceEdges(edgePassContext, classNodes);
|
|
198
480
|
emitRustImplEdges(edgePassContext, tree.rootNode);
|
|
199
481
|
}
|
|
200
482
|
catch (error) {
|
|
@@ -207,12 +489,121 @@ export async function buildSymbolGraphDetailed(index, opts) {
|
|
|
207
489
|
logWithLevel(opts?.logLevel, "warn", `Warning: Failed to build detailed symbol edges for ${file}:`, error);
|
|
208
490
|
}
|
|
209
491
|
}
|
|
210
|
-
|
|
492
|
+
// Function-valued bindings are proven while each file is processed. Apply the callable-name
|
|
493
|
+
// prefilter only after that pass so receiver calls do not depend on file iteration order.
|
|
494
|
+
const callableReceiverCalls = receiverCalls.filter((candidate) => hasCallableNamed(candidate.memberName, candidate.caseInsensitiveMemberName));
|
|
495
|
+
let typeScriptReceiverFiles;
|
|
496
|
+
let typeScriptReceiverNames;
|
|
497
|
+
for (const candidate of callableReceiverCalls) {
|
|
498
|
+
if (candidate.argumentCount === null)
|
|
499
|
+
continue;
|
|
500
|
+
const languageId = supportForFileWithoutHeaderSample(candidate.site.file, index.languageExtensions)?.id;
|
|
501
|
+
if (languageId !== "ts" && languageId !== "tsx")
|
|
502
|
+
continue;
|
|
503
|
+
(typeScriptReceiverFiles ??= new Set()).add(fileIdentityKey(candidate.site.file));
|
|
504
|
+
(typeScriptReceiverNames ??= new Set()).add(candidate.memberName);
|
|
505
|
+
}
|
|
506
|
+
const typeScriptReceiverTargets = typeScriptReceiverNames?.size
|
|
507
|
+
? new Map()
|
|
508
|
+
: undefined;
|
|
509
|
+
if (typeScriptReceiverTargets && typeScriptReceiverNames) {
|
|
510
|
+
for (const node of nodes.values()) {
|
|
511
|
+
if (!typeScriptReceiverNames.has(node.name))
|
|
512
|
+
continue;
|
|
513
|
+
const targetLanguageId = supportForFileWithoutHeaderSample(node.file, index.languageExtensions)?.id;
|
|
514
|
+
if (targetLanguageId !== "ts" && targetLanguageId !== "tsx")
|
|
515
|
+
continue;
|
|
516
|
+
const module = index.byFile.get(fileIdentityKey(node.file));
|
|
517
|
+
const def = module?.locals.find((candidate) => defNodeId(candidate) === node.id);
|
|
518
|
+
if (!module || !def || def.kind !== SymbolKind.Function)
|
|
519
|
+
continue;
|
|
520
|
+
if (!module.locals.some((candidate) => candidate.kind === SymbolKind.Function &&
|
|
521
|
+
candidate.localName === def.localName &&
|
|
522
|
+
candidate.range.start.index !== def.range.start.index)) {
|
|
523
|
+
continue;
|
|
524
|
+
}
|
|
525
|
+
const parsed = await loadParsedFile(def.file);
|
|
526
|
+
typeScriptReceiverTargets.set(node.id, { def, module, parsed });
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
const removedReceiverEdges = emitReceiverCallEdges({ nodes, edges }, callableReceiverCalls, recordEdge, receiverMemberScopes, nodeAliases, receiverMemberArities, sharedOwnerAnchors, sharedOwnerAccessibleMembers, fileHiddenMemberIds, (targetId, candidate) => {
|
|
530
|
+
if (candidate.argumentCount === null || !typeScriptReceiverFiles?.has(fileIdentityKey(candidate.site.file))) {
|
|
531
|
+
return true;
|
|
532
|
+
}
|
|
533
|
+
const target = typeScriptReceiverTargets?.get(targetId);
|
|
534
|
+
if (!target)
|
|
535
|
+
return true;
|
|
536
|
+
if (!target.parsed)
|
|
537
|
+
return false;
|
|
538
|
+
return typescriptOverloadImplementationAcceptsCount({
|
|
539
|
+
implementation: target.def,
|
|
540
|
+
locals: target.module.locals,
|
|
541
|
+
tree: target.parsed.tree,
|
|
542
|
+
source: target.parsed.source,
|
|
543
|
+
languageId: target.parsed.sup.id,
|
|
544
|
+
argumentCount: candidate.argumentCount,
|
|
545
|
+
});
|
|
546
|
+
});
|
|
547
|
+
edgeCount -= removedReceiverEdges.length;
|
|
548
|
+
for (const edge of removedReceiverEdges)
|
|
549
|
+
added.delete(edgeKey(edge.from, edge.to, edge.label, edge.site));
|
|
550
|
+
const canonicalNodeId = (id) => {
|
|
551
|
+
let current = id;
|
|
552
|
+
const seen = new Set();
|
|
553
|
+
while (nodeAliases.has(current) && !seen.has(current)) {
|
|
554
|
+
seen.add(current);
|
|
555
|
+
current = nodeAliases.get(current);
|
|
556
|
+
}
|
|
557
|
+
return current;
|
|
558
|
+
};
|
|
559
|
+
for (const [aliasId] of nodeAliases) {
|
|
560
|
+
const canonicalId = canonicalNodeId(aliasId);
|
|
561
|
+
nodeAliases.set(aliasId, canonicalId);
|
|
562
|
+
if (canonicalId === aliasId)
|
|
563
|
+
continue;
|
|
564
|
+
const aliasNode = nodes.get(aliasId);
|
|
565
|
+
const canonicalNode = nodes.get(canonicalId);
|
|
566
|
+
if (aliasNode && canonicalNode) {
|
|
567
|
+
if (!canonicalNode.docstring && aliasNode.docstring)
|
|
568
|
+
canonicalNode.docstring = aliasNode.docstring;
|
|
569
|
+
canonicalNode.lineSpan = Math.max(canonicalNode.lineSpan ?? 0, aliasNode.lineSpan ?? 0);
|
|
570
|
+
canonicalNode.complexity = Math.max(canonicalNode.complexity ?? 0, aliasNode.complexity ?? 0);
|
|
571
|
+
if (aliasNode.callable)
|
|
572
|
+
canonicalNode.callable = true;
|
|
573
|
+
if (aliasNode.implementationTarget)
|
|
574
|
+
canonicalNode.implementationTarget = true;
|
|
575
|
+
if (canonicalNode.memberArity === undefined && aliasNode.memberArity !== undefined) {
|
|
576
|
+
canonicalNode.memberArity = aliasNode.memberArity;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
nodes.delete(aliasId);
|
|
580
|
+
}
|
|
581
|
+
if (nodeAliases.size) {
|
|
582
|
+
const reconciledEdges = [];
|
|
583
|
+
const reconciledEdgeKeys = new Set();
|
|
584
|
+
for (const edge of edges) {
|
|
585
|
+
const reconciled = {
|
|
586
|
+
...edge,
|
|
587
|
+
from: canonicalNodeId(edge.from),
|
|
588
|
+
to: canonicalNodeId(edge.to),
|
|
589
|
+
};
|
|
590
|
+
const key = edgeKey(reconciled.from, reconciled.to, reconciled.label, reconciled.site);
|
|
591
|
+
if (reconciledEdgeKeys.has(key))
|
|
592
|
+
continue;
|
|
593
|
+
reconciledEdgeKeys.add(key);
|
|
594
|
+
reconciledEdges.push(reconciled);
|
|
595
|
+
}
|
|
596
|
+
edges.splice(0, edges.length, ...reconciledEdges);
|
|
597
|
+
added.clear();
|
|
598
|
+
for (const edge of edges)
|
|
599
|
+
added.add(edgeKey(edge.from, edge.to, edge.label, edge.site));
|
|
600
|
+
edgeCount = edges.length;
|
|
601
|
+
}
|
|
211
602
|
emitMemberImplementationEdges({ nodes, edges }, recordEdge);
|
|
212
603
|
if (skippedSyntaxTreeFiles > 0) {
|
|
213
604
|
logWithLevel(opts?.logLevel, "warn", `Warning: Skipped detailed symbol edges for ${skippedSyntaxTreeFiles} file(s) because no syntax-tree backend was available.`);
|
|
214
605
|
}
|
|
215
|
-
|
|
606
|
+
const graph = {
|
|
216
607
|
nodes,
|
|
217
608
|
edges,
|
|
218
609
|
...(configuredMaxEdges !== undefined
|
|
@@ -223,5 +614,8 @@ export async function buildSymbolGraphDetailed(index, opts) {
|
|
|
223
614
|
}
|
|
224
615
|
: {}),
|
|
225
616
|
};
|
|
617
|
+
if (nodeAliases.size)
|
|
618
|
+
Object.defineProperty(graph, "nodeAliases", { value: nodeAliases });
|
|
619
|
+
return graph;
|
|
226
620
|
}
|
|
227
621
|
//# sourceMappingURL=symbol-graph-detailed.js.map
|