@lzehrung/codegraph 3.0.0 → 3.1.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 +19 -17
- package/codegraph-skill/codegraph/SKILL.md +3 -0
- package/dist/agent/artifact.d.ts.map +1 -1
- package/dist/agent/artifact.js +4 -9
- package/dist/agent/artifact.js.map +1 -1
- package/dist/agent/call-hierarchy.d.ts +4 -2
- package/dist/agent/call-hierarchy.d.ts.map +1 -1
- package/dist/agent/call-hierarchy.js +20 -29
- package/dist/agent/call-hierarchy.js.map +1 -1
- package/dist/agent/explain.d.ts.map +1 -1
- package/dist/agent/explain.js +12 -11
- package/dist/agent/explain.js.map +1 -1
- package/dist/agent/explore.d.ts.map +1 -1
- package/dist/agent/explore.js +2 -11
- package/dist/agent/explore.js.map +1 -1
- package/dist/agent/file-view.d.ts.map +1 -1
- package/dist/agent/file-view.js +4 -12
- package/dist/agent/file-view.js.map +1 -1
- package/dist/agent/normalize.d.ts +0 -3
- package/dist/agent/normalize.d.ts.map +1 -1
- package/dist/agent/normalize.js +1 -7
- package/dist/agent/normalize.js.map +1 -1
- package/dist/agent/orient.d.ts.map +1 -1
- package/dist/agent/orient.js +2 -6
- package/dist/agent/orient.js.map +1 -1
- package/dist/agent/packet.d.ts.map +1 -1
- package/dist/agent/packet.js +2 -5
- package/dist/agent/packet.js.map +1 -1
- package/dist/agent/query-index/content.d.ts.map +1 -1
- package/dist/agent/query-index/content.js +2 -6
- package/dist/agent/query-index/content.js.map +1 -1
- package/dist/agent/query-index/update.d.ts.map +1 -1
- package/dist/agent/query-index/update.js +8 -45
- package/dist/agent/query-index/update.js.map +1 -1
- package/dist/agent/query-index/worker-pool.d.ts.map +1 -1
- package/dist/agent/query-index/worker-pool.js +2 -1
- package/dist/agent/query-index/worker-pool.js.map +1 -1
- package/dist/agent/refactor-plan.d.ts +2 -2
- package/dist/agent/refactor-plan.d.ts.map +1 -1
- package/dist/agent/refactor-plan.js +11 -57
- 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 +218 -26
- package/dist/agent/rename-preview.js.map +1 -1
- package/dist/agent/search.d.ts.map +1 -1
- package/dist/agent/search.js +7 -22
- package/dist/agent/search.js.map +1 -1
- package/dist/agent/semantic-symbols.d.ts +1 -1
- package/dist/agent/semantic-symbols.d.ts.map +1 -1
- package/dist/agent/semantic-symbols.js +2 -5
- package/dist/agent/semantic-symbols.js.map +1 -1
- package/dist/agent/semantic.d.ts +5 -0
- package/dist/agent/semantic.d.ts.map +1 -1
- package/dist/agent/semantic.js +12 -1
- package/dist/agent/semantic.js.map +1 -1
- package/dist/agent/session.d.ts +9 -0
- package/dist/agent/session.d.ts.map +1 -1
- package/dist/agent/session.js +59 -41
- package/dist/agent/session.js.map +1 -1
- package/dist/agent/type-hierarchy.d.ts +4 -2
- package/dist/agent/type-hierarchy.d.ts.map +1 -1
- package/dist/agent/type-hierarchy.js +19 -31
- package/dist/agent/type-hierarchy.js.map +1 -1
- package/dist/agent/workspace-symbols.d.ts +1 -1
- package/dist/agent/workspace-symbols.d.ts.map +1 -1
- package/dist/agent/workspace-symbols.js +7 -15
- package/dist/agent/workspace-symbols.js.map +1 -1
- package/dist/analysis-summary.d.ts +1 -4
- package/dist/analysis-summary.d.ts.map +1 -1
- package/dist/analysis-summary.js +58 -19
- package/dist/analysis-summary.js.map +1 -1
- package/dist/bin/cli.js +36572 -22925
- package/dist/bin/query-index-worker.js +440 -261
- package/dist/bootstrap/tree-sitter-languages.d.ts +2 -0
- package/dist/bootstrap/tree-sitter-languages.d.ts.map +1 -1
- package/dist/bootstrap/tree-sitter-languages.js +6 -19
- package/dist/bootstrap/tree-sitter-languages.js.map +1 -1
- package/dist/chunking/chunk-matches.d.ts.map +1 -1
- package/dist/chunking/chunk-matches.js +6 -42
- package/dist/chunking/chunk-matches.js.map +1 -1
- package/dist/chunking/chunk-split.d.ts +7 -0
- package/dist/chunking/chunk-split.d.ts.map +1 -1
- package/dist/chunking/chunk-split.js +3 -3
- package/dist/chunking/chunk-split.js.map +1 -1
- package/dist/chunking/chunk-text-file.js +2 -30
- package/dist/chunking/chunk-text-file.js.map +1 -1
- package/dist/cli/affected.d.ts.map +1 -1
- package/dist/cli/affected.js +1 -9
- package/dist/cli/affected.js.map +1 -1
- package/dist/cli/call-hierarchy.js +3 -6
- package/dist/cli/call-hierarchy.js.map +1 -1
- package/dist/cli/chunk.d.ts.map +1 -1
- package/dist/cli/chunk.js +4 -11
- package/dist/cli/chunk.js.map +1 -1
- package/dist/cli/command-table.d.ts.map +1 -1
- package/dist/cli/command-table.js +3 -0
- package/dist/cli/command-table.js.map +1 -1
- package/dist/cli/context.d.ts +1 -0
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js +1 -1
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +1 -11
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/graph.d.ts +4 -12
- package/dist/cli/graph.d.ts.map +1 -1
- package/dist/cli/graph.js +17 -8
- package/dist/cli/graph.js.map +1 -1
- package/dist/cli/help.d.ts +4 -4
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +7 -5
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/index.d.ts +2 -12
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/links.d.ts.map +1 -1
- package/dist/cli/links.js +4 -10
- package/dist/cli/links.js.map +1 -1
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +1 -0
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/module-locals.d.ts +8 -0
- package/dist/cli/module-locals.d.ts.map +1 -0
- package/dist/cli/module-locals.js +9 -0
- package/dist/cli/module-locals.js.map +1 -0
- package/dist/cli/navigation.d.ts +2 -0
- package/dist/cli/navigation.d.ts.map +1 -1
- package/dist/cli/navigation.js +3 -5
- package/dist/cli/navigation.js.map +1 -1
- package/dist/cli/options.d.ts.map +1 -1
- package/dist/cli/options.js +2 -1
- package/dist/cli/options.js.map +1 -1
- package/dist/cli/pretty.d.ts +1 -0
- package/dist/cli/pretty.d.ts.map +1 -1
- package/dist/cli/pretty.js +6 -8
- package/dist/cli/pretty.js.map +1 -1
- package/dist/cli/refactor-plan.js +2 -5
- package/dist/cli/refactor-plan.js.map +1 -1
- package/dist/cli/rename-preview.js +2 -5
- package/dist/cli/rename-preview.js.map +1 -1
- package/dist/cli/review.d.ts +6 -16
- package/dist/cli/review.d.ts.map +1 -1
- package/dist/cli/review.js +2 -0
- package/dist/cli/review.js.map +1 -1
- package/dist/cli/server.d.ts.map +1 -1
- package/dist/cli/server.js +7 -10
- package/dist/cli/server.js.map +1 -1
- package/dist/cli/type-hierarchy.js +8 -8
- package/dist/cli/type-hierarchy.js.map +1 -1
- package/dist/document-links/asciidoc.d.ts.map +1 -1
- package/dist/document-links/asciidoc.js +4 -16
- package/dist/document-links/asciidoc.js.map +1 -1
- package/dist/document-links/check.d.ts.map +1 -1
- package/dist/document-links/check.js +1 -3
- package/dist/document-links/check.js.map +1 -1
- package/dist/document-links/html.d.ts.map +1 -1
- package/dist/document-links/html.js +6 -44
- package/dist/document-links/html.js.map +1 -1
- package/dist/document-links/markdown.d.ts.map +1 -1
- package/dist/document-links/markdown.js +4 -13
- package/dist/document-links/markdown.js.map +1 -1
- package/dist/document-links/rst.d.ts.map +1 -1
- package/dist/document-links/rst.js +7 -31
- package/dist/document-links/rst.js.map +1 -1
- package/dist/document-links/sfc.d.ts.map +1 -1
- package/dist/document-links/sfc.js +2 -5
- package/dist/document-links/sfc.js.map +1 -1
- package/dist/document-links/shared.d.ts +2 -0
- package/dist/document-links/shared.d.ts.map +1 -1
- package/dist/document-links/shared.js +13 -0
- package/dist/document-links/shared.js.map +1 -1
- package/dist/drift/artifact.d.ts.map +1 -1
- package/dist/drift/artifact.js +4 -27
- package/dist/drift/artifact.js.map +1 -1
- package/dist/drift/graph-edges.d.ts +4 -0
- package/dist/drift/graph-edges.d.ts.map +1 -0
- package/dist/drift/graph-edges.js +15 -0
- package/dist/drift/graph-edges.js.map +1 -0
- package/dist/drift/snapshot.d.ts.map +1 -1
- package/dist/drift/snapshot.js +2 -17
- package/dist/drift/snapshot.js.map +1 -1
- package/dist/duplicates/unit-cache.d.ts +11 -1
- package/dist/duplicates/unit-cache.d.ts.map +1 -1
- package/dist/duplicates/unit-cache.js +20 -2
- package/dist/duplicates/unit-cache.js.map +1 -1
- package/dist/duplicates/units.d.ts +2 -1
- package/dist/duplicates/units.d.ts.map +1 -1
- package/dist/duplicates/units.js +23 -22
- package/dist/duplicates/units.js.map +1 -1
- package/dist/graph-builder.d.ts +1 -1
- package/dist/graph-builder.d.ts.map +1 -1
- package/dist/graph-builder.js +3 -2
- package/dist/graph-builder.js.map +1 -1
- package/dist/graph-edge-collector.d.ts +3 -1
- package/dist/graph-edge-collector.d.ts.map +1 -1
- package/dist/graph-edge-collector.js +38 -6
- package/dist/graph-edge-collector.js.map +1 -1
- package/dist/graphs/angularjs.d.ts.map +1 -1
- package/dist/graphs/angularjs.js +2 -9
- package/dist/graphs/angularjs.js.map +1 -1
- package/dist/graphs/edge-resolution.d.ts +4 -0
- package/dist/graphs/edge-resolution.d.ts.map +1 -1
- package/dist/graphs/edge-resolution.js +2 -0
- package/dist/graphs/edge-resolution.js.map +1 -1
- package/dist/graphs/external/manifests.d.ts.map +1 -1
- package/dist/graphs/external/manifests.js +1 -6
- package/dist/graphs/external/manifests.js.map +1 -1
- package/dist/graphs/specifiers.d.ts.map +1 -1
- package/dist/graphs/specifiers.js +47 -26
- package/dist/graphs/specifiers.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts +2 -0
- package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/edge-passes.js +9 -3
- package/dist/graphs/symbol-graph-detailed/edge-passes.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts +3 -3
- package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/receiver-calls.js +2 -26
- 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 +38 -1
- 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 +8 -0
- package/dist/graphs/symbol-graph.js.map +1 -1
- package/dist/impact/analyzer.d.ts.map +1 -1
- package/dist/impact/analyzer.js +116 -17
- package/dist/impact/analyzer.js.map +1 -1
- package/dist/impact/budgets.d.ts.map +1 -1
- package/dist/impact/budgets.js +3 -9
- package/dist/impact/budgets.js.map +1 -1
- package/dist/impact/call-compatibility.d.ts.map +1 -1
- package/dist/impact/call-compatibility.js +3 -12
- package/dist/impact/call-compatibility.js.map +1 -1
- package/dist/impact/context.d.ts +6 -0
- package/dist/impact/context.d.ts.map +1 -1
- package/dist/impact/context.js +2 -2
- package/dist/impact/context.js.map +1 -1
- package/dist/impact/direct.d.ts.map +1 -1
- package/dist/impact/direct.js +2 -6
- package/dist/impact/direct.js.map +1 -1
- package/dist/impact/map.d.ts +3 -1
- package/dist/impact/map.d.ts.map +1 -1
- package/dist/impact/map.js +12 -5
- package/dist/impact/map.js.map +1 -1
- package/dist/impact/reference-cache.d.ts.map +1 -1
- package/dist/impact/reference-cache.js +1 -24
- package/dist/impact/reference-cache.js.map +1 -1
- package/dist/impact/report-shared.d.ts +2 -1
- package/dist/impact/report-shared.d.ts.map +1 -1
- package/dist/impact/report-shared.js +10 -0
- package/dist/impact/report-shared.js.map +1 -1
- package/dist/impact/report-suggestions.d.ts.map +1 -1
- package/dist/impact/report-suggestions.js +2 -8
- package/dist/impact/report-suggestions.js.map +1 -1
- package/dist/impact/report.d.ts.map +1 -1
- package/dist/impact/report.js +2 -8
- package/dist/impact/report.js.map +1 -1
- package/dist/impact/streaming.d.ts.map +1 -1
- package/dist/impact/streaming.js +3 -8
- package/dist/impact/streaming.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/indexer/build-cache/manifest.d.ts.map +1 -1
- package/dist/indexer/build-cache/manifest.js +10 -108
- package/dist/indexer/build-cache/manifest.js.map +1 -1
- package/dist/indexer/build-cache/module-cache.d.ts +6 -1
- package/dist/indexer/build-cache/module-cache.d.ts.map +1 -1
- package/dist/indexer/build-cache/module-cache.js +25 -2
- package/dist/indexer/build-cache/module-cache.js.map +1 -1
- package/dist/indexer/build-cache/options.d.ts +40 -1
- package/dist/indexer/build-cache/options.d.ts.map +1 -1
- package/dist/indexer/build-cache/options.js +40 -1
- package/dist/indexer/build-cache/options.js.map +1 -1
- package/dist/indexer/build-cache/project-snapshot.d.ts.map +1 -1
- package/dist/indexer/build-cache/project-snapshot.js +52 -99
- package/dist/indexer/build-cache/project-snapshot.js.map +1 -1
- package/dist/indexer/build-cache/reports.d.ts +1 -0
- package/dist/indexer/build-cache/reports.d.ts.map +1 -1
- package/dist/indexer/build-cache/reports.js +10 -0
- package/dist/indexer/build-cache/reports.js.map +1 -1
- package/dist/indexer/build-index.d.ts +2 -0
- package/dist/indexer/build-index.d.ts.map +1 -1
- package/dist/indexer/build-index.js +187 -57
- package/dist/indexer/build-index.js.map +1 -1
- package/dist/indexer/build-workers.d.ts +7 -1
- package/dist/indexer/build-workers.d.ts.map +1 -1
- package/dist/indexer/build-workers.js +12 -0
- package/dist/indexer/build-workers.js.map +1 -1
- package/dist/indexer/call-hierarchy.d.ts.map +1 -1
- package/dist/indexer/call-hierarchy.js +5 -17
- package/dist/indexer/call-hierarchy.js.map +1 -1
- package/dist/indexer/compilation-units.d.ts +32 -20
- package/dist/indexer/compilation-units.d.ts.map +1 -1
- package/dist/indexer/compilation-units.js +139 -145
- package/dist/indexer/compilation-units.js.map +1 -1
- package/dist/indexer/cpp-callables.d.ts.map +1 -1
- package/dist/indexer/cpp-callables.js +2 -7
- package/dist/indexer/cpp-callables.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/import-resolution-tables.d.ts.map +1 -1
- package/dist/indexer/import-resolution-tables.js +10 -0
- package/dist/indexer/import-resolution-tables.js.map +1 -1
- package/dist/indexer/import-types.d.ts +5 -0
- package/dist/indexer/import-types.d.ts.map +1 -1
- package/dist/indexer/import-types.js.map +1 -1
- package/dist/indexer/imports/binding-ranges.d.ts +5 -12
- package/dist/indexer/imports/binding-ranges.d.ts.map +1 -1
- package/dist/indexer/imports/binding-ranges.js +13 -19
- package/dist/indexer/imports/binding-ranges.js.map +1 -1
- package/dist/indexer/imports/context.d.ts +6 -0
- package/dist/indexer/imports/context.d.ts.map +1 -1
- package/dist/indexer/imports/import-binding-tables.d.ts +28 -13
- package/dist/indexer/imports/import-binding-tables.d.ts.map +1 -1
- package/dist/indexer/imports/import-binding-tables.js +182 -178
- package/dist/indexer/imports/import-binding-tables.js.map +1 -1
- package/dist/indexer/imports/js-text-imports.d.ts +0 -1
- package/dist/indexer/imports/js-text-imports.d.ts.map +1 -1
- package/dist/indexer/imports/js-text-imports.js +0 -176
- package/dist/indexer/imports/js-text-imports.js.map +1 -1
- package/dist/indexer/imports/language-specific.d.ts.map +1 -1
- package/dist/indexer/imports/language-specific.js +4 -8
- package/dist/indexer/imports/language-specific.js.map +1 -1
- package/dist/indexer/imports/python.d.ts +0 -1
- package/dist/indexer/imports/python.d.ts.map +1 -1
- package/dist/indexer/imports/python.js +1 -29
- package/dist/indexer/imports/python.js.map +1 -1
- package/dist/indexer/imports/text-import-extractors.d.ts +2 -9
- package/dist/indexer/imports/text-import-extractors.d.ts.map +1 -1
- package/dist/indexer/imports/text-import-extractors.js +0 -284
- package/dist/indexer/imports/text-import-extractors.js.map +1 -1
- package/dist/indexer/imports.d.ts +15 -0
- package/dist/indexer/imports.d.ts.map +1 -1
- package/dist/indexer/imports.js +82 -44
- package/dist/indexer/imports.js.map +1 -1
- package/dist/indexer/incremental-plan.d.ts +0 -1
- package/dist/indexer/incremental-plan.d.ts.map +1 -1
- package/dist/indexer/incremental-plan.js +6 -12
- package/dist/indexer/incremental-plan.js.map +1 -1
- package/dist/indexer/locals-and-exports.d.ts.map +1 -1
- package/dist/indexer/locals-and-exports.js +8 -0
- package/dist/indexer/locals-and-exports.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 +25 -4
- package/dist/indexer/name-lookup-policies/implicit-self.js.map +1 -1
- package/dist/indexer/name-resolution-types.d.ts +5 -0
- package/dist/indexer/name-resolution-types.d.ts.map +1 -1
- package/dist/indexer/name-resolution.d.ts.map +1 -1
- package/dist/indexer/name-resolution.js +2 -0
- package/dist/indexer/name-resolution.js.map +1 -1
- package/dist/indexer/navigation-cpp.d.ts.map +1 -1
- package/dist/indexer/navigation-cpp.js +3 -5
- package/dist/indexer/navigation-cpp.js.map +1 -1
- package/dist/indexer/navigation-goto.d.ts +49 -3
- package/dist/indexer/navigation-goto.d.ts.map +1 -1
- package/dist/indexer/navigation-goto.js +500 -106
- package/dist/indexer/navigation-goto.js.map +1 -1
- package/dist/indexer/navigation-local.d.ts +7 -0
- package/dist/indexer/navigation-local.d.ts.map +1 -1
- package/dist/indexer/navigation-local.js +22 -2
- package/dist/indexer/navigation-local.js.map +1 -1
- package/dist/indexer/navigation-php.d.ts +0 -1
- package/dist/indexer/navigation-php.d.ts.map +1 -1
- package/dist/indexer/navigation-php.js +1 -7
- package/dist/indexer/navigation-php.js.map +1 -1
- package/dist/indexer/navigation-references.d.ts +1 -0
- package/dist/indexer/navigation-references.d.ts.map +1 -1
- package/dist/indexer/navigation-references.js +134 -23
- package/dist/indexer/navigation-references.js.map +1 -1
- package/dist/indexer/navigation-resolve.d.ts +22 -0
- package/dist/indexer/navigation-resolve.d.ts.map +1 -1
- package/dist/indexer/navigation-resolve.js +73 -8
- package/dist/indexer/navigation-resolve.js.map +1 -1
- package/dist/indexer/navigation.d.ts +4 -1
- package/dist/indexer/navigation.d.ts.map +1 -1
- package/dist/indexer/navigation.js +429 -109
- package/dist/indexer/navigation.js.map +1 -1
- package/dist/indexer/python-property-decorator.d.ts +11 -0
- package/dist/indexer/python-property-decorator.d.ts.map +1 -0
- package/dist/indexer/python-property-decorator.js +30 -0
- package/dist/indexer/python-property-decorator.js.map +1 -0
- 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/shared-owner-identity.d.ts +3 -1
- package/dist/indexer/shared-owner-identity.d.ts.map +1 -1
- package/dist/indexer/shared-owner-identity.js +40 -12
- package/dist/indexer/shared-owner-identity.js.map +1 -1
- package/dist/indexer/shared.d.ts +10 -0
- package/dist/indexer/shared.d.ts.map +1 -1
- package/dist/indexer/shared.js +8 -0
- package/dist/indexer/shared.js.map +1 -1
- package/dist/indexer/star-import-precedence.d.ts +5 -1
- package/dist/indexer/star-import-precedence.d.ts.map +1 -1
- package/dist/indexer/star-import-precedence.js +12 -19
- package/dist/indexer/star-import-precedence.js.map +1 -1
- package/dist/indexer/type-hierarchy.d.ts.map +1 -1
- package/dist/indexer/type-hierarchy.js +8 -9
- package/dist/indexer/type-hierarchy.js.map +1 -1
- package/dist/indexer/types.d.ts +54 -2
- 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/workspace-symbols.d.ts.map +1 -1
- package/dist/indexer/workspace-symbols.js +3 -13
- package/dist/indexer/workspace-symbols.js.map +1 -1
- package/dist/installer/locks.d.ts +1 -0
- package/dist/installer/locks.d.ts.map +1 -1
- package/dist/installer/locks.js +4 -8
- package/dist/installer/locks.js.map +1 -1
- package/dist/installer/registry.d.ts.map +1 -1
- package/dist/installer/registry.js +9 -15
- package/dist/installer/registry.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.map +1 -1
- package/dist/languages/callable-arity.js +1 -38
- package/dist/languages/callable-arity.js.map +1 -1
- package/dist/languages/definitions/csharp.d.ts.map +1 -1
- package/dist/languages/definitions/csharp.js +5 -13
- package/dist/languages/definitions/csharp.js.map +1 -1
- package/dist/languages/definitions/java.d.ts.map +1 -1
- package/dist/languages/definitions/java.js +4 -13
- package/dist/languages/definitions/java.js.map +1 -1
- package/dist/languages/definitions/kotlin.d.ts.map +1 -1
- package/dist/languages/definitions/kotlin.js +4 -8
- package/dist/languages/definitions/kotlin.js.map +1 -1
- package/dist/languages/definitions/python.d.ts.map +1 -1
- package/dist/languages/definitions/python.js +5 -3
- package/dist/languages/definitions/python.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/import-statement-parsers.d.ts +0 -30
- package/dist/languages/import-statement-parsers.d.ts.map +1 -1
- package/dist/languages/import-statement-parsers.js +1 -81
- package/dist/languages/import-statement-parsers.js.map +1 -1
- package/dist/languages/sfc.d.ts.map +1 -1
- package/dist/languages/sfc.js +8 -43
- package/dist/languages/sfc.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 +11 -29
- package/dist/lifecycle/manifest.js.map +1 -1
- package/dist/mcp/handlers.d.ts +21 -0
- package/dist/mcp/handlers.d.ts.map +1 -1
- package/dist/mcp/handlers.js +66 -20
- package/dist/mcp/handlers.js.map +1 -1
- package/dist/mcp/http-transport.d.ts.map +1 -1
- package/dist/mcp/http-transport.js +5 -1
- package/dist/mcp/http-transport.js.map +1 -1
- package/dist/mcp/project-watcher.d.ts +125 -0
- package/dist/mcp/project-watcher.d.ts.map +1 -0
- package/dist/mcp/project-watcher.js +643 -0
- package/dist/mcp/project-watcher.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +5 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/native/byte-index.d.ts +1 -0
- package/dist/native/byte-index.d.ts.map +1 -1
- package/dist/native/byte-index.js +1 -1
- package/dist/native/byte-index.js.map +1 -1
- package/dist/native/contracts.d.ts +1 -0
- package/dist/native/contracts.d.ts.map +1 -1
- package/dist/native/native-backend-report.d.ts +2 -1
- package/dist/native/native-backend-report.d.ts.map +1 -1
- package/dist/native/native-backend-report.js +23 -0
- package/dist/native/native-backend-report.js.map +1 -1
- package/dist/native/tree-shape.d.ts +5 -7
- package/dist/native/tree-shape.d.ts.map +1 -1
- package/dist/native/tree-shape.js +11 -10
- package/dist/native/tree-shape.js.map +1 -1
- package/dist/presentation/bounds.d.ts +2 -0
- package/dist/presentation/bounds.d.ts.map +1 -1
- package/dist/presentation/bounds.js +8 -0
- package/dist/presentation/bounds.js.map +1 -1
- package/dist/review/candidates.d.ts.map +1 -1
- package/dist/review/candidates.js +4 -25
- package/dist/review/candidates.js.map +1 -1
- package/dist/review/report.d.ts.map +1 -1
- package/dist/review/report.js +4 -2
- package/dist/review/report.js.map +1 -1
- package/dist/review/summaries.d.ts.map +1 -1
- package/dist/review/summaries.js +14 -35
- package/dist/review/summaries.js.map +1 -1
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +4 -5
- package/dist/review.js.map +1 -1
- package/dist/scss/navigation.d.ts +13 -0
- package/dist/scss/navigation.d.ts.map +1 -0
- package/dist/scss/navigation.js +150 -0
- package/dist/scss/navigation.js.map +1 -0
- package/dist/scss/resolution.d.ts +190 -0
- package/dist/scss/resolution.d.ts.map +1 -0
- package/dist/scss/resolution.js +1802 -0
- package/dist/scss/resolution.js.map +1 -0
- package/dist/scss/syntax.d.ts +181 -0
- package/dist/scss/syntax.d.ts.map +1 -0
- package/dist/scss/syntax.js +1436 -0
- package/dist/scss/syntax.js.map +1 -0
- package/dist/sql/classify-sql-file.d.ts +7 -0
- package/dist/sql/classify-sql-file.d.ts.map +1 -1
- package/dist/sql/classify-sql-file.js +9 -0
- package/dist/sql/classify-sql-file.js.map +1 -1
- package/dist/sql/extract-facts.d.ts.map +1 -1
- package/dist/sql/extract-facts.js +517 -77
- package/dist/sql/extract-facts.js.map +1 -1
- package/dist/sql/lex.d.ts +100 -1
- package/dist/sql/lex.d.ts.map +1 -1
- package/dist/sql/lex.js +473 -11
- package/dist/sql/lex.js.map +1 -1
- package/dist/sql/lookup.d.ts +17 -0
- package/dist/sql/lookup.d.ts.map +1 -1
- package/dist/sql/lookup.js +21 -0
- package/dist/sql/lookup.js.map +1 -1
- package/dist/sql/navigation.d.ts +28 -1
- package/dist/sql/navigation.d.ts.map +1 -1
- package/dist/sql/navigation.js +474 -84
- package/dist/sql/navigation.js.map +1 -1
- package/dist/sql/object-mentions.d.ts +24 -0
- package/dist/sql/object-mentions.d.ts.map +1 -0
- package/dist/sql/object-mentions.js +233 -0
- package/dist/sql/object-mentions.js.map +1 -0
- package/dist/sql/review.d.ts +3 -0
- package/dist/sql/review.d.ts.map +1 -1
- package/dist/sql/review.js +15 -14
- package/dist/sql/review.js.map +1 -1
- package/dist/sql/routine-mentions.d.ts +61 -0
- package/dist/sql/routine-mentions.d.ts.map +1 -0
- package/dist/sql/routine-mentions.js +868 -0
- package/dist/sql/routine-mentions.js.map +1 -0
- package/dist/sql/source-graph.d.ts +18 -3
- package/dist/sql/source-graph.d.ts.map +1 -1
- package/dist/sql/source-graph.js +109 -32
- package/dist/sql/source-graph.js.map +1 -1
- package/dist/sqlite/raw-query-worker-pool.d.ts.map +1 -1
- package/dist/sqlite/raw-query-worker-pool.js +2 -0
- package/dist/sqlite/raw-query-worker-pool.js.map +1 -1
- package/dist/sqlite/types.d.ts +6 -5
- package/dist/sqlite/types.d.ts.map +1 -1
- package/dist/sqlite/write.d.ts.map +1 -1
- package/dist/sqlite/write.js.map +1 -1
- package/dist/sqlite-driver.d.ts +0 -1
- package/dist/sqlite-driver.d.ts.map +1 -1
- package/dist/sqlite-driver.js +0 -11
- package/dist/sqlite-driver.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 +140 -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 +438 -0
- package/dist/terraform/syntax.js.map +1 -0
- package/dist/util/ast.d.ts +5 -0
- package/dist/util/ast.d.ts.map +1 -1
- package/dist/util/ast.js +10 -0
- package/dist/util/ast.js.map +1 -1
- package/dist/util/atomic-file.d.ts +22 -0
- package/dist/util/atomic-file.d.ts.map +1 -0
- package/dist/util/atomic-file.js +106 -0
- package/dist/util/atomic-file.js.map +1 -0
- package/dist/util/collections.d.ts +5 -0
- package/dist/util/collections.d.ts.map +1 -1
- package/dist/util/collections.js +26 -0
- package/dist/util/collections.js.map +1 -1
- package/dist/util/concurrency.d.ts +1 -0
- package/dist/util/concurrency.d.ts.map +1 -1
- package/dist/util/concurrency.js +5 -0
- package/dist/util/concurrency.js.map +1 -1
- package/dist/util/confined-file.d.ts.map +1 -1
- package/dist/util/confined-file.js +1 -3
- package/dist/util/confined-file.js.map +1 -1
- package/dist/util/csharp-tree.d.ts +65 -0
- package/dist/util/csharp-tree.d.ts.map +1 -0
- package/dist/util/csharp-tree.js +266 -0
- package/dist/util/csharp-tree.js.map +1 -0
- package/dist/util/errors.d.ts +1 -0
- package/dist/util/errors.d.ts.map +1 -1
- package/dist/util/errors.js +3 -0
- package/dist/util/errors.js.map +1 -1
- package/dist/util/graph-edges.d.ts +2 -0
- package/dist/util/graph-edges.d.ts.map +1 -1
- package/dist/util/graph-edges.js +11 -0
- package/dist/util/graph-edges.js.map +1 -1
- package/dist/util/guards.d.ts +1 -0
- package/dist/util/guards.d.ts.map +1 -1
- package/dist/util/guards.js +6 -0
- package/dist/util/guards.js.map +1 -1
- package/dist/util/identifiers.d.ts +0 -24
- package/dist/util/identifiers.d.ts.map +1 -1
- package/dist/util/identifiers.js +0 -24
- package/dist/util/identifiers.js.map +1 -1
- package/dist/util/jvm-tree.d.ts +58 -0
- package/dist/util/jvm-tree.d.ts.map +1 -0
- package/dist/util/jvm-tree.js +153 -0
- package/dist/util/jvm-tree.js.map +1 -0
- package/dist/util/member-access-tables.d.ts.map +1 -1
- package/dist/util/member-access-tables.js +3 -0
- package/dist/util/member-access-tables.js.map +1 -1
- package/dist/util/package-exports.d.ts +0 -22
- package/dist/util/package-exports.d.ts.map +1 -1
- package/dist/util/package-exports.js +25 -5
- package/dist/util/package-exports.js.map +1 -1
- package/dist/util/paths.d.ts +1 -0
- package/dist/util/paths.d.ts.map +1 -1
- package/dist/util/paths.js +10 -4
- package/dist/util/paths.js.map +1 -1
- package/dist/util/project-files.d.ts.map +1 -1
- package/dist/util/project-files.js +3 -1
- package/dist/util/project-files.js.map +1 -1
- package/dist/util/resolution/csharp.d.ts +20 -8
- package/dist/util/resolution/csharp.d.ts.map +1 -1
- package/dist/util/resolution/csharp.js +126 -127
- package/dist/util/resolution/csharp.js.map +1 -1
- package/dist/util/resolution/files.d.ts +6 -0
- package/dist/util/resolution/files.d.ts.map +1 -1
- package/dist/util/resolution/files.js +74 -21
- package/dist/util/resolution/files.js.map +1 -1
- package/dist/util/resolution/jvm.d.ts +21 -1
- package/dist/util/resolution/jvm.d.ts.map +1 -1
- package/dist/util/resolution/jvm.js +168 -100
- package/dist/util/resolution/jvm.js.map +1 -1
- package/dist/util/resolution/project-symbols.d.ts +1 -1
- package/dist/util/resolution/project-symbols.d.ts.map +1 -1
- package/dist/util/resolution/project-symbols.js.map +1 -1
- package/dist/util/resolution/specifier-targets.d.ts +4 -0
- package/dist/util/resolution/specifier-targets.d.ts.map +1 -1
- package/dist/util/resolution/specifier-targets.js +16 -3
- package/dist/util/resolution/specifier-targets.js.map +1 -1
- 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 +21 -7
- package/dist/util/resolution.js.map +1 -1
- package/dist/util/syntax-tree.d.ts +16 -0
- package/dist/util/syntax-tree.d.ts.map +1 -0
- package/dist/util/syntax-tree.js +34 -0
- package/dist/util/syntax-tree.js.map +1 -0
- package/dist/util/text-scanning.d.ts +6 -0
- package/dist/util/text-scanning.d.ts.map +1 -0
- package/dist/util/text-scanning.js +35 -0
- package/dist/util/text-scanning.js.map +1 -0
- package/dist/util/trivia-tables.d.ts +13 -8
- package/dist/util/trivia-tables.d.ts.map +1 -1
- package/dist/util/trivia-tables.js +13 -63
- package/dist/util/trivia-tables.js.map +1 -1
- package/dist/util/trivia.d.ts +10 -3
- package/dist/util/trivia.d.ts.map +1 -1
- package/dist/util/trivia.js +209 -79
- package/dist/util/trivia.js.map +1 -1
- package/dist/util/windows-process-drain.d.ts.map +1 -1
- package/dist/util/windows-process-drain.js.map +1 -1
- package/dist/util/worker-threads.d.ts +16 -0
- package/dist/util/worker-threads.d.ts.map +1 -1
- package/dist/util/worker-threads.js +118 -0
- package/dist/util/worker-threads.js.map +1 -1
- package/dist/worker/native-worker-pool.d.ts.map +1 -1
- package/dist/worker/native-worker-pool.js +2 -1
- package/dist/worker/native-worker-pool.js.map +1 -1
- package/docs/mcp.md +27 -2
- package/package.json +8 -8
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import path from "node:path";
|
|
1
2
|
import { supportForFileWithoutHeaderSample } from "../languages.js";
|
|
3
|
+
import { isJsTsLanguage } from "../languages/js-family.js";
|
|
4
|
+
import { pythonPropertyDecorator } from "./python-property-decorator.js";
|
|
2
5
|
import { ensureParsedContext } from "./parse-context.js";
|
|
3
6
|
import { getCompilationUnitPeers, IMPLICIT_UNIT_LANGUAGES } from "./compilation-units.js";
|
|
4
7
|
import { getReverseNeighbors, graphAdjacencyFor } from "../graphs/adjacency.js";
|
|
@@ -6,6 +9,7 @@ import { isGoExportedMemberName } from "./declaration-visibility.js";
|
|
|
6
9
|
import { memberSyntaxNamesFreeFunction } from "../util/member-access-tables.js";
|
|
7
10
|
import { phpObjectCreationKeyword } from "../graphs/symbol-graph-detailed/receiver-calls.js";
|
|
8
11
|
import { findCsharpPartialTypeEquivalents, innermostNamespaceImport, resolveMemberAccessDefinition, resolvePhpObjectCreationTarget, resolveRubySuperDefinition, sharedOwnerMemberUnitComplete, supportsReceiverMemberNavigation, } from "./navigation-goto.js";
|
|
12
|
+
import { isPythonReceiverAttributeAssignmentName } from "../languages/definitions/python.js";
|
|
9
13
|
import { findClosestBinding, findClosestScopeBinding, findDeclarationNameNode, getOrBuildScopeIndex, toModuleRef, } from "./navigation-local.js";
|
|
10
14
|
import { typescriptCallableCandidatesInContainer } from "./ts-callables.js";
|
|
11
15
|
import { isExplicitMethodCall, scopeNodesFor } from "./scope-nodes.js";
|
|
@@ -14,23 +18,28 @@ import { effectiveExplicitBinding, findRubyReopenedConstantParts, isExpandedStar
|
|
|
14
18
|
import { createNavigationProvenance, okGoToResult } from "./navigation-provenance.js";
|
|
15
19
|
import { getPhpQualifiedReference, inferPhpQualifiedReferenceImportType, isPhpCaseInsensitiveSymbolKind, normalizePhpQualifiedReference, phpLastIdentifierSegment, } from "./navigation-php.js";
|
|
16
20
|
import { ensurePhpNamespaceSymbolIndex, phpReferenceRoleMatchesKind } from "./php-namespace-symbols.js";
|
|
17
|
-
import { buildIndexedCandidateCoverage, buildPhpQualifiedNames, cppCanonicalStructuralExport, describeReferenceStrategies, collectVerifiedNamedNodeReferences, isMemberAccessPropertyRange, getCachedScope, exportFromIdentifier, getCachedReferenceCandidateFiles, getCandidateReferenceNames, hasExpandedNamedImport, pythonParentPackageNamespacePaths, importBindingDeclarationRangeKeys, importBindingIdentityVerificationSites, importBindingReferenceSites, rangeIdentityKey, referenceSiteKey, } from "./navigation-references.js";
|
|
18
|
-
import { directModuleValueEntry, javaStaticNamedImportIncludes, resolveExport, resolveImported, resolveModuleExports, resolvePhpExportByImportType, } from "./navigation-resolve.js";
|
|
21
|
+
import { buildIndexedCandidateCoverage, buildPhpQualifiedNames, markNameEquivalenceGap, cppCanonicalStructuralExport, describeReferenceStrategies, collectVerifiedNamedNodeReferences, isMemberAccessPropertyRange, getCachedScope, exportFromIdentifier, getCachedReferenceCandidateFiles, getCandidateReferenceNames, hasExpandedNamedImport, pythonParentPackageNamespacePaths, importBindingDeclarationRangeKeys, importBindingIdentityVerificationSites, importBindingReferenceSites, rangeIdentityKey, referenceSiteKey, } from "./navigation-references.js";
|
|
22
|
+
import { directModuleValueEntry, csharpNamespaceImportDirectories, csharpShadowedImports, javaStaticNamedImportIncludes, resolveExport, resolveImported, resolveModuleExports, resolvePhpExportByImportType, } from "./navigation-resolve.js";
|
|
19
23
|
import { extractEnclosingBlock, extractLineContext, rangeContains, sameDef } from "./reference-context.js";
|
|
20
24
|
import { DEFAULT_REF_CONTEXT_LINES } from "./shared.js";
|
|
21
25
|
import {} from "../types.js";
|
|
22
26
|
import { loadNearestTsconfigFor, resolveImportSpecifier } from "../util/resolution.js";
|
|
23
|
-
import { fileIdentityKey } from "../util/paths.js";
|
|
27
|
+
import { fileIdentityKey, normalizePath } from "../util/paths.js";
|
|
24
28
|
import { sliceText, toRange } from "../util/ast.js";
|
|
25
29
|
import { foldPhpIdentifierCase } from "../util/identifiers.js";
|
|
26
|
-
import { getMemberAccessParts, isMemberAccessNode, isMemberObjectIdentifier, isMemberReferencePropertyIdentifier, isReceiverNameNode, } from "../util/member-access.js";
|
|
30
|
+
import { collectMemberAccessChain, getMemberAccessParts, isMemberAccessNode, isMemberObjectIdentifier, isMemberReferencePropertyIdentifier, isReceiverNameNode, } from "../util/member-access.js";
|
|
27
31
|
import { cppOutOfLineOwnerPath, cppOutOfLineMemberName, cppOutOfLineMemberDeclarationNode, cppQualifiedNameSegments, } from "../graphs/symbol-graph-detailed/receiver-calls.js";
|
|
28
32
|
import { cppEquivalentCallableBindings } from "./cpp-callables.js";
|
|
29
33
|
import { resolveCppExportedCallables, resolveCppQualifiedMemberContainer } from "./navigation-cpp.js";
|
|
30
34
|
import { SymbolKind, } from "./types.js";
|
|
31
|
-
import { findSqlReferences, goToSqlDefinition } from "../sql/navigation.js";
|
|
35
|
+
import { findSqlReferences, goToSqlDefinition, sqlPositionIsProvenObjectOrRoutineMention } from "../sql/navigation.js";
|
|
36
|
+
import { findScssReferences, goToScssDefinition } from "../scss/navigation.js";
|
|
37
|
+
import { scssBlockLocalExistenceUnproven, scssFactsForFile, scssFlowLocalUnproven, scssLocalSpellingGap, scssMemberForDefinition, scssNearerEquivalentLocal, scssScopedCallableDynamicUnproven, scssScopedCallableReferences, } from "../scss/resolution.js";
|
|
38
|
+
import { findTerraformReferences, goToTerraformDefinition } from "../terraform/navigation.js";
|
|
32
39
|
import { createLoadingParsedFileProvider, fileBindingIsUnshadowed, phpImportTypeAtPosition, resolveBareName, settleNameResolution, withParsedFiles, } from "./name-resolution.js";
|
|
33
40
|
import { resolveCppQualifiedName } from "./name-lookup-policies/c-family.js";
|
|
41
|
+
import { createUnionFind } from "../util/collections.js";
|
|
42
|
+
import { toTreeSitterPosition } from "./shared.js";
|
|
34
43
|
export { resolveExport, resolveImported } from "./navigation-resolve.js";
|
|
35
44
|
const CPP_MEMBER_CONTAINER_TYPES = new Set(["class_specifier", "struct_specifier", "union_specifier"]);
|
|
36
45
|
const MAX_REFERENCE_NAMESPACE_DEPTH = 8;
|
|
@@ -43,6 +52,12 @@ export async function goToDefinition(index, req, parsedContext) {
|
|
|
43
52
|
const sqlResult = await goToSqlDefinition(index, req);
|
|
44
53
|
if (sqlResult)
|
|
45
54
|
return sqlResult;
|
|
55
|
+
const terraformResult = await goToTerraformDefinition(index, req);
|
|
56
|
+
if (terraformResult)
|
|
57
|
+
return terraformResult;
|
|
58
|
+
const scssResult = await goToScssDefinition(index, req);
|
|
59
|
+
if (scssResult)
|
|
60
|
+
return scssResult;
|
|
46
61
|
const context = parsedContext ??
|
|
47
62
|
(await ensureParsedContext(file, index.parsed?.get(fileIdentityKey(file)), index.languageExtensions));
|
|
48
63
|
const sup = context.sup;
|
|
@@ -50,10 +65,7 @@ export async function goToDefinition(index, req, parsedContext) {
|
|
|
50
65
|
const tree = context.tree;
|
|
51
66
|
if (sup.id === "php")
|
|
52
67
|
await ensurePhpNamespaceSymbolIndex(index);
|
|
53
|
-
const pos = {
|
|
54
|
-
row: Math.max(0, line - 1),
|
|
55
|
-
column: Math.max(0, column - 1),
|
|
56
|
-
};
|
|
68
|
+
const pos = toTreeSitterPosition({ line, column });
|
|
57
69
|
let node = tree.rootNode.descendantForPosition(pos, pos);
|
|
58
70
|
// A position at the start of `b` in `a?.b` also touches the end of the `?.` token, which the
|
|
59
71
|
// parser reports first. The use is the name that starts at the position.
|
|
@@ -362,22 +374,7 @@ export async function recoverIncludedCallableStar(index, mod, languageId, name,
|
|
|
362
374
|
familyOf.set(key, defs);
|
|
363
375
|
return defs;
|
|
364
376
|
};
|
|
365
|
-
const
|
|
366
|
-
const find = (start) => {
|
|
367
|
-
let current = start;
|
|
368
|
-
while (parent[current] !== current) {
|
|
369
|
-
const next = parent[current];
|
|
370
|
-
parent[current] = parent[next] ?? next;
|
|
371
|
-
current = next;
|
|
372
|
-
}
|
|
373
|
-
return current;
|
|
374
|
-
};
|
|
375
|
-
const unite = (left, right) => {
|
|
376
|
-
const leftRoot = find(left);
|
|
377
|
-
const rightRoot = find(right);
|
|
378
|
-
if (leftRoot !== rightRoot)
|
|
379
|
-
parent[rightRoot] = leftRoot;
|
|
380
|
-
};
|
|
377
|
+
const { find, unite } = createUnionFind(functions.length);
|
|
381
378
|
for (let left = 0; left < functions.length; left += 1) {
|
|
382
379
|
const defs = await family(functions[left].def);
|
|
383
380
|
for (let right = left + 1; right < functions.length; right += 1) {
|
|
@@ -421,22 +418,90 @@ export async function getCppEquivalentCallableDefinitions(index, def, parsedCont
|
|
|
421
418
|
const family = await cppEquivalentCallableFamily(index, def, parsedContext);
|
|
422
419
|
return [family.definition, ...family.equivalents];
|
|
423
420
|
}
|
|
421
|
+
/** Adds the requested `line` or `block` context to each reference, parsing each file once. */
|
|
422
|
+
export async function attachReferenceContext(index, refs, opts) {
|
|
423
|
+
if (!opts?.context)
|
|
424
|
+
return;
|
|
425
|
+
const perFileCache = new Map();
|
|
426
|
+
for (const ref of refs) {
|
|
427
|
+
let cached = perFileCache.get(fileIdentityKey(ref.file));
|
|
428
|
+
if (!cached) {
|
|
429
|
+
const parsedEntry = index.parsed?.get(fileIdentityKey(ref.file));
|
|
430
|
+
const parsed = await ensureParsedContext(ref.file, parsedEntry, index.languageExtensions);
|
|
431
|
+
cached = { source: parsed.source, tree: parsed.tree, sup: parsed.sup };
|
|
432
|
+
perFileCache.set(fileIdentityKey(ref.file), cached);
|
|
433
|
+
}
|
|
434
|
+
if (opts.context === "line") {
|
|
435
|
+
const lines = opts.lines ?? DEFAULT_REF_CONTEXT_LINES;
|
|
436
|
+
ref.context = extractLineContext(cached.source, ref.range.start.line, lines);
|
|
437
|
+
}
|
|
438
|
+
else if (opts.context === "block") {
|
|
439
|
+
const maxLines = opts.blockMaxLines ?? 60;
|
|
440
|
+
ref.context = extractEnclosingBlock(cached.source, cached.tree, ref.range, maxLines, cached.sup);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
export async function canonicalizePythonReceiverAttributeDefinition(index, def, position = {
|
|
445
|
+
file: def.file,
|
|
446
|
+
line: def.range.start.line,
|
|
447
|
+
column: def.range.start.column,
|
|
448
|
+
}) {
|
|
449
|
+
if (supportForFileWithoutHeaderSample(position.file, index.languageExtensions)?.id !== "python")
|
|
450
|
+
return null;
|
|
451
|
+
const context = await ensureParsedContext(position.file, index.parsed?.get(fileIdentityKey(position.file)), index.languageExtensions);
|
|
452
|
+
if (context.sup.id !== "python")
|
|
453
|
+
return null;
|
|
454
|
+
const nodePosition = { row: position.line - 1, column: position.column - 1 };
|
|
455
|
+
const node = context.tree.rootNode.descendantForPosition(nodePosition, nodePosition);
|
|
456
|
+
if (!isPythonReceiverAttributeAssignmentName(node))
|
|
457
|
+
return null;
|
|
458
|
+
return await goToDefinition(index, position, context);
|
|
459
|
+
}
|
|
424
460
|
async function findReferencesInternal(index, req, opts, collectionMode) {
|
|
425
461
|
let def = null;
|
|
426
462
|
let provenance;
|
|
427
463
|
if ("def" in req) {
|
|
428
464
|
def = req.def;
|
|
429
465
|
provenance = createNavigationProvenance("exact", "high");
|
|
466
|
+
const canonical = await canonicalizePythonReceiverAttributeDefinition(index, def);
|
|
467
|
+
if (canonical?.status === "ok") {
|
|
468
|
+
def = canonical.definition;
|
|
469
|
+
provenance = canonical.provenance;
|
|
470
|
+
}
|
|
430
471
|
}
|
|
431
472
|
else {
|
|
432
473
|
const module = index.byFile.get(fileIdentityKey(req.file));
|
|
474
|
+
// A SQL definition spans its whole statement, so a position inside it can name another object: the
|
|
475
|
+
// function a trigger runs, a call in a routine body, or a table a view reads. Resolve that name first.
|
|
476
|
+
const sqlTarget = module ? await goToSqlDefinition(index, req) : null;
|
|
433
477
|
const localAtPosition = module?.locals.find((local) => rangeContains(local.range, {
|
|
434
478
|
row: req.line,
|
|
435
479
|
column: req.column,
|
|
436
480
|
}));
|
|
437
|
-
|
|
481
|
+
// A column can share a table's name. Only a syntactically proven object or routine mention
|
|
482
|
+
// overrides the definition that encloses the position; a column stays on that definition.
|
|
483
|
+
const namesObject = sqlTarget && localAtPosition ? await sqlPositionIsProvenObjectOrRoutineMention(index, req) : false;
|
|
484
|
+
// A proven mention that no single definition owns, such as an overloaded callee, is unresolved.
|
|
485
|
+
// It is not a reference to the definition around it.
|
|
486
|
+
if (namesObject && sqlTarget?.status === "not_found")
|
|
487
|
+
return { status: "not_found", reason: sqlTarget.reason };
|
|
488
|
+
const sqlMention = sqlTarget?.status === "ok" && (!localAtPosition || namesObject);
|
|
489
|
+
if (sqlMention && sqlTarget?.status === "ok") {
|
|
490
|
+
def = sqlTarget.definition;
|
|
491
|
+
provenance = sqlTarget.provenance;
|
|
492
|
+
}
|
|
493
|
+
else if (localAtPosition) {
|
|
438
494
|
def = localAtPosition;
|
|
439
495
|
provenance = createNavigationProvenance("exact", "high");
|
|
496
|
+
const canonical = await canonicalizePythonReceiverAttributeDefinition(index, def, {
|
|
497
|
+
file: req.file,
|
|
498
|
+
line: req.line,
|
|
499
|
+
column: req.column,
|
|
500
|
+
});
|
|
501
|
+
if (canonical?.status === "ok") {
|
|
502
|
+
def = canonical.definition;
|
|
503
|
+
provenance = canonical.provenance;
|
|
504
|
+
}
|
|
440
505
|
}
|
|
441
506
|
else {
|
|
442
507
|
const gotoResult = await goToDefinition(index, req);
|
|
@@ -462,13 +527,35 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
|
|
|
462
527
|
}
|
|
463
528
|
const maxReferences = typeof opts?.maxReferences === "number" && opts.maxReferences > 0 ? opts.maxReferences : undefined;
|
|
464
529
|
const sqlReferences = await findSqlReferences(index, def, {
|
|
465
|
-
|
|
530
|
+
// A SQL definition spans its whole statement, so rename finds the declaration's name through here.
|
|
531
|
+
includeDefinition: collectionMode !== "usages",
|
|
532
|
+
// Rename edits the name in `public.f`, not the qualifier that comes with it.
|
|
533
|
+
renameRanges: collectionMode === "rename",
|
|
466
534
|
...(maxReferences === undefined ? {} : { maxReferences }),
|
|
467
535
|
});
|
|
468
536
|
if (sqlReferences)
|
|
469
537
|
return sqlReferences;
|
|
538
|
+
const terraformReferences = await findTerraformReferences(index, def, {
|
|
539
|
+
includeDefinition: collectionMode === "all",
|
|
540
|
+
...(maxReferences === undefined ? {} : { maxReferences }),
|
|
541
|
+
});
|
|
542
|
+
if (terraformReferences) {
|
|
543
|
+
if (terraformReferences.status === "ok")
|
|
544
|
+
await attachReferenceContext(index, terraformReferences.references, opts);
|
|
545
|
+
return terraformReferences;
|
|
546
|
+
}
|
|
547
|
+
const scssReferences = await findScssReferences(index, def, {
|
|
548
|
+
includeDefinition: collectionMode === "all",
|
|
549
|
+
...(maxReferences === undefined ? {} : { maxReferences }),
|
|
550
|
+
});
|
|
551
|
+
if (scssReferences) {
|
|
552
|
+
if (scssReferences.status === "ok")
|
|
553
|
+
await attachReferenceContext(index, scssReferences.references, opts);
|
|
554
|
+
return scssReferences;
|
|
555
|
+
}
|
|
470
556
|
const definitionFile = def.file;
|
|
471
557
|
const definitionSiteKey = referenceSiteKey(definitionFile, def.range);
|
|
558
|
+
const explicitNamespaceMemberAliasFiles = new Set();
|
|
472
559
|
const includeReference = (ref) => {
|
|
473
560
|
if (collectionMode === "all")
|
|
474
561
|
return true;
|
|
@@ -476,6 +563,10 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
|
|
|
476
563
|
return false;
|
|
477
564
|
if (collectionMode === "usages")
|
|
478
565
|
return ref.via?.importBinding === undefined;
|
|
566
|
+
if (ref.via?.namespaceMember) {
|
|
567
|
+
const hasExplicitAlias = namespaceBindingHasExplicitAlias(ref.via.import);
|
|
568
|
+
return ref.via.namespaceMember === def.localName && !hasExplicitAlias;
|
|
569
|
+
}
|
|
479
570
|
const binding = ref.via?.import;
|
|
480
571
|
if (!binding || binding.kind === "star" || binding.kind === "namespace")
|
|
481
572
|
return true;
|
|
@@ -547,6 +638,78 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
|
|
|
547
638
|
}
|
|
548
639
|
const matchesReferenceDefinition = (candidate) => sameDef(candidate, definition, index.languageExtensions) ||
|
|
549
640
|
equivalentDefinitions.some((equivalent) => sameDef(candidate, equivalent, index.languageExtensions));
|
|
641
|
+
const hasExplicitExportAliasForDefinition = async (candidateModule) => {
|
|
642
|
+
const definitionExportNames = new Set();
|
|
643
|
+
for (const entry of candidateModule.exports) {
|
|
644
|
+
if (!("exportedAs" in entry))
|
|
645
|
+
continue;
|
|
646
|
+
const hit = resolveExport(index, candidateModule.file, entry.exportedAs, exportOptions);
|
|
647
|
+
if (hit?.kind === "resolved" && matchesReferenceDefinition(hit.def)) {
|
|
648
|
+
definitionExportNames.add(entry.exportedAs);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
if (!definitionExportNames.size)
|
|
652
|
+
return false;
|
|
653
|
+
const parsedModule = await ensureParsedContext(candidateModule.file, index.parsed?.get(fileIdentityKey(candidateModule.file)), index.languageExtensions);
|
|
654
|
+
const pending = [parsedModule.tree.rootNode];
|
|
655
|
+
while (pending.length) {
|
|
656
|
+
const node = pending.pop();
|
|
657
|
+
const alias = node.type === "export_specifier" ? node.childForFieldName("alias") : undefined;
|
|
658
|
+
if (alias && definitionExportNames.has(alias.text))
|
|
659
|
+
return true;
|
|
660
|
+
pending.push(...node.namedChildren);
|
|
661
|
+
}
|
|
662
|
+
return false;
|
|
663
|
+
};
|
|
664
|
+
// Alias uncertainty only affects rename safety; reference and usage queries skip the scan.
|
|
665
|
+
for (const candidateModule of collectionMode === "rename" ? index.byFile.values() : []) {
|
|
666
|
+
if (await hasExplicitExportAliasForDefinition(candidateModule)) {
|
|
667
|
+
explicitNamespaceMemberAliasFiles.add(fileIdentityKey(candidateModule.file));
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
let namespaceExportAliasUncertainty = false;
|
|
671
|
+
const namespaceBindingHasExplicitAlias = (binding) => {
|
|
672
|
+
if (!binding)
|
|
673
|
+
return false;
|
|
674
|
+
const namespaceFiles = [];
|
|
675
|
+
if (binding.kind === "namespace" && typeof binding.resolved === "string") {
|
|
676
|
+
namespaceFiles.push(binding.resolved);
|
|
677
|
+
}
|
|
678
|
+
else if (binding.kind === "named" && typeof binding.resolved === "string") {
|
|
679
|
+
const target = resolveExport(index, binding.resolved, binding.imported);
|
|
680
|
+
if (target?.kind === "namespace")
|
|
681
|
+
namespaceFiles.push(target.file);
|
|
682
|
+
}
|
|
683
|
+
const visited = new Set();
|
|
684
|
+
const modulePathHasAlias = (file) => {
|
|
685
|
+
const fileKey = fileIdentityKey(file);
|
|
686
|
+
if (visited.has(fileKey))
|
|
687
|
+
return false;
|
|
688
|
+
visited.add(fileKey);
|
|
689
|
+
if (explicitNamespaceMemberAliasFiles.has(fileKey))
|
|
690
|
+
return true;
|
|
691
|
+
const targetModule = index.byFile.get(fileKey);
|
|
692
|
+
for (const entry of targetModule?.exports ?? []) {
|
|
693
|
+
// A star or namespace forward keeps an aliased export reachable under the forwarding module's own names.
|
|
694
|
+
if ((entry.type === "namespaceReexport" || entry.type === "exportStar") &&
|
|
695
|
+
modulePathHasAlias(entry.fromModule)) {
|
|
696
|
+
return true;
|
|
697
|
+
}
|
|
698
|
+
if (entry.type !== "reexport")
|
|
699
|
+
continue;
|
|
700
|
+
const hit = resolveExport(index, file, entry.exportedAs, exportOptions);
|
|
701
|
+
// A named re-export forwards the definition itself or a namespace that can reach it.
|
|
702
|
+
const forwardsDefinition = hit?.kind === "resolved" && matchesReferenceDefinition(hit.def);
|
|
703
|
+
if ((forwardsDefinition || hit?.kind === "namespace") && modulePathHasAlias(entry.fromModule))
|
|
704
|
+
return true;
|
|
705
|
+
}
|
|
706
|
+
return false;
|
|
707
|
+
};
|
|
708
|
+
const hasAlias = namespaceFiles.some(modulePathHasAlias);
|
|
709
|
+
if (hasAlias)
|
|
710
|
+
namespaceExportAliasUncertainty = true;
|
|
711
|
+
return hasAlias;
|
|
712
|
+
};
|
|
550
713
|
const exportedNames = [];
|
|
551
714
|
for (const candidate of [definition, ...equivalentDefinitions]) {
|
|
552
715
|
const candidateModule = index.byFile.get(fileIdentityKey(candidate.file));
|
|
@@ -737,6 +900,61 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
|
|
|
737
900
|
}
|
|
738
901
|
return scopeIndex;
|
|
739
902
|
};
|
|
903
|
+
const scannedNamespaceMemberRoots = new Set();
|
|
904
|
+
const scanNamespaceMemberPaths = async (importBinding, namespacePaths) => {
|
|
905
|
+
const rootPath = namespacePaths[0];
|
|
906
|
+
if (!rootPath)
|
|
907
|
+
return;
|
|
908
|
+
const rootKey = fileIdentityKey(rootPath.file) + "::" + rootPath.name;
|
|
909
|
+
if (scannedNamespaceMemberRoots.has(rootKey))
|
|
910
|
+
return;
|
|
911
|
+
scannedNamespaceMemberRoots.add(rootKey);
|
|
912
|
+
for (let pathIndex = 0; pathIndex < namespacePaths.length; pathIndex++) {
|
|
913
|
+
if (hasReachedCollectionLimit())
|
|
914
|
+
return;
|
|
915
|
+
if (pathIndex >= MAX_REFERENCE_NAMESPACE_PATHS) {
|
|
916
|
+
receiverProofUnavailableFiles.set(fileIdentityKey(fileId), fileId);
|
|
917
|
+
return;
|
|
918
|
+
}
|
|
919
|
+
const namespacePath = namespacePaths[pathIndex];
|
|
920
|
+
const namespaceExports = resolveModuleExports(index, namespacePath.file, { allowLocalFallback: false });
|
|
921
|
+
if (namespacePath.depth) {
|
|
922
|
+
for (const [visibleMemberName, nestedHit] of namespaceExports) {
|
|
923
|
+
if (nestedHit.kind !== "resolved" || !matchesReferenceDefinition(nestedHit.def))
|
|
924
|
+
continue;
|
|
925
|
+
const parsed = await ensureCandidateParsed();
|
|
926
|
+
const ranges = await collectNamespaceMemberRefs(fileId, namespacePath.name, visibleMemberName, parsed, index.languageExtensions, importBinding, module.imports, await ensureScope());
|
|
927
|
+
for (const range of ranges) {
|
|
928
|
+
if (hasReachedCollectionLimit())
|
|
929
|
+
return;
|
|
930
|
+
const proof = await goToDefinition(index, { file: fileId, line: range.start.line, column: range.start.column }, parsed);
|
|
931
|
+
if (proof.status !== "ok" || !matchesReferenceDefinition(proof.definition))
|
|
932
|
+
continue;
|
|
933
|
+
pushRef({
|
|
934
|
+
file: fileId,
|
|
935
|
+
range,
|
|
936
|
+
via: { import: importBinding, namespaceMember: visibleMemberName },
|
|
937
|
+
});
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
if (namespacePath.depth >= MAX_REFERENCE_NAMESPACE_DEPTH) {
|
|
942
|
+
if ([...namespaceExports.values()].some((entry) => entry.kind === "namespace")) {
|
|
943
|
+
receiverProofUnavailableFiles.set(fileIdentityKey(fileId), fileId);
|
|
944
|
+
}
|
|
945
|
+
continue;
|
|
946
|
+
}
|
|
947
|
+
for (const [alias, entry] of namespaceExports) {
|
|
948
|
+
if (entry.kind !== "namespace")
|
|
949
|
+
continue;
|
|
950
|
+
namespacePaths.push({
|
|
951
|
+
file: entry.file,
|
|
952
|
+
name: `${namespacePath.name}.${alias}`,
|
|
953
|
+
depth: namespacePath.depth + 1,
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
};
|
|
740
958
|
if (supportForFileWithoutHeaderSample(fileId, index.languageExtensions)?.supportsExportFromReferences) {
|
|
741
959
|
for (const entry of module.exports) {
|
|
742
960
|
if (hasReachedCollectionLimit())
|
|
@@ -764,7 +982,31 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
|
|
|
764
982
|
break;
|
|
765
983
|
if (cNamespace && imp.kind === "named" && (imp.cNamespace ?? "ordinary") !== cNamespace)
|
|
766
984
|
continue;
|
|
767
|
-
|
|
985
|
+
// A C# directive that an enclosing namespace shadows resolves nothing, so it is verified like an unresolved import.
|
|
986
|
+
const targetFile = typeof imp.resolved === "string" && !csharpShadowedImports(index).has(imp) ? imp.resolved : undefined;
|
|
987
|
+
if (!targetFile && parsedContext.sup.id === "csharp" && imp.kind === "namespace") {
|
|
988
|
+
const namespaceTargets = csharpNamespaceImportDirectories(index).get(imp) ?? [];
|
|
989
|
+
const targetDirectories = new Set(namespaceTargets.map((target) => fileIdentityKey(path.posix.dirname(normalizePath(target)))));
|
|
990
|
+
const definitionIsTargeted = [definition, ...equivalentDefinitions].some((candidate) => targetDirectories.has(fileIdentityKey(path.posix.dirname(normalizePath(candidate.file)))));
|
|
991
|
+
if (definitionIsTargeted) {
|
|
992
|
+
for (const exportedName of exportedNames) {
|
|
993
|
+
if (hasReachedCollectionLimit())
|
|
994
|
+
break;
|
|
995
|
+
const ranges = await collectVerifiedNamedNodeReferences(index, fileId, exportedName, definition, (params, parsed) => goToDefinition(index, params, parsed), remainingCollectionSlots(), verifiedReferenceFilter(fileId), (unavailableFile) => receiverProofUnavailableFiles.set(fileIdentityKey(unavailableFile), unavailableFile), equivalentDefinitions);
|
|
996
|
+
for (const { range, provenance, via } of ranges) {
|
|
997
|
+
if (hasReachedCollectionLimit())
|
|
998
|
+
break;
|
|
999
|
+
pushRef({
|
|
1000
|
+
file: fileId,
|
|
1001
|
+
range,
|
|
1002
|
+
via: { import: imp, ...(via ?? {}) },
|
|
1003
|
+
...(provenance ? { provenance } : {}),
|
|
1004
|
+
});
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
continue;
|
|
1009
|
+
}
|
|
768
1010
|
const bindingSites = importBindingReferenceSites(imp);
|
|
769
1011
|
let verifiedBindingMatches;
|
|
770
1012
|
const bindingMatchesDefinition = async () => {
|
|
@@ -837,65 +1079,25 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
|
|
|
837
1079
|
// Python binds the first segment of an unaliased dotted import, while an alias
|
|
838
1080
|
// binds the whole module. Other namespaces use their local name directly.
|
|
839
1081
|
const namespaceSearchName = imp.mechanism === "python" && imp.from.includes(".") && !imp.explicitAlias ? imp.from : imp.localNS;
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
continue;
|
|
844
|
-
}
|
|
845
|
-
// A namespace re-export exposes a member at paths such as W.helpers.helper,
|
|
1082
|
+
const targetModule = index.byFile.get(fileIdentityKey(targetFile));
|
|
1083
|
+
if (targetModule?.exports.some((entry) => entry.type === "namespaceReexport" || entry.type === "exportStar" || entry.type === "reexport")) {
|
|
1084
|
+
// A forwarded namespace can expose a member at paths such as W.helpers.helper,
|
|
846
1085
|
// not as a bare export of the intermediate module. Follow only export-proven
|
|
847
1086
|
// namespace edges, then verify each use through the same goto resolver.
|
|
848
|
-
|
|
849
|
-
{ file: targetFile, name: namespaceSearchName, depth: 0 },
|
|
850
|
-
];
|
|
851
|
-
for (let pathIndex = 0; pathIndex < namespacePaths.length; pathIndex++) {
|
|
852
|
-
if (pathIndex >= MAX_REFERENCE_NAMESPACE_PATHS) {
|
|
853
|
-
receiverProofUnavailableFiles.set(fileIdentityKey(fileId), fileId);
|
|
854
|
-
break;
|
|
855
|
-
}
|
|
856
|
-
const namespacePath = namespacePaths[pathIndex];
|
|
857
|
-
if (namespacePath.depth) {
|
|
858
|
-
const nestedHit = resolveExport(index, namespacePath.file, exportedName, {
|
|
859
|
-
allowLocalFallback: false,
|
|
860
|
-
...(exportOptions ?? {}),
|
|
861
|
-
});
|
|
862
|
-
if (nestedHit?.kind === "resolved" && matchesReferenceDefinition(nestedHit.def)) {
|
|
863
|
-
const parsed = await ensureCandidateParsed();
|
|
864
|
-
const ranges = await collectNamespaceMemberRefs(fileId, namespacePath.name, exportedName, parsed, index.languageExtensions, imp, module.imports, await ensureScope());
|
|
865
|
-
for (const range of ranges) {
|
|
866
|
-
if (hasReachedCollectionLimit())
|
|
867
|
-
break;
|
|
868
|
-
const proof = await goToDefinition(index, { file: fileId, line: range.start.line, column: range.start.column }, parsed);
|
|
869
|
-
if (proof.status !== "ok" || !matchesReferenceDefinition(proof.definition))
|
|
870
|
-
continue;
|
|
871
|
-
pushRef({ file: fileId, range, via: { import: imp, namespaceMember: exportedName } });
|
|
872
|
-
}
|
|
873
|
-
}
|
|
874
|
-
}
|
|
875
|
-
const exports = resolveModuleExports(index, namespacePath.file, { allowLocalFallback: false });
|
|
876
|
-
if (namespacePath.depth >= MAX_REFERENCE_NAMESPACE_DEPTH) {
|
|
877
|
-
if ([...exports.values()].some((entry) => entry.kind === "namespace")) {
|
|
878
|
-
receiverProofUnavailableFiles.set(fileIdentityKey(fileId), fileId);
|
|
879
|
-
}
|
|
880
|
-
continue;
|
|
881
|
-
}
|
|
882
|
-
for (const [alias, entry] of exports) {
|
|
883
|
-
if (entry.kind !== "namespace")
|
|
884
|
-
continue;
|
|
885
|
-
namespacePaths.push({
|
|
886
|
-
file: entry.file,
|
|
887
|
-
name: `${namespacePath.name}.${alias}`,
|
|
888
|
-
depth: namespacePath.depth + 1,
|
|
889
|
-
});
|
|
890
|
-
}
|
|
891
|
-
}
|
|
892
|
-
continue;
|
|
1087
|
+
await scanNamespaceMemberPaths(imp, [{ file: targetFile, name: namespaceSearchName, depth: 0 }]);
|
|
893
1088
|
}
|
|
1089
|
+
if (!matchesDef)
|
|
1090
|
+
continue;
|
|
894
1091
|
const parsed = await ensureCandidateParsed();
|
|
895
1092
|
const ranges = await collectNamespaceMemberRefs(fileId, namespaceSearchName, exportedName, parsed, index.languageExtensions, imp, module.imports, await ensureScope());
|
|
896
1093
|
for (const range of ranges) {
|
|
897
1094
|
if (hasReachedCollectionLimit())
|
|
898
1095
|
break;
|
|
1096
|
+
if (parsed.sup.id === "csharp" && imp.localRange) {
|
|
1097
|
+
const proof = await goToDefinition(index, { file: fileId, line: range.start.line, column: range.start.column }, parsed);
|
|
1098
|
+
if (proof.status !== "ok" || !matchesReferenceDefinition(proof.definition))
|
|
1099
|
+
continue;
|
|
1100
|
+
}
|
|
899
1101
|
pushRef({
|
|
900
1102
|
file: fileId,
|
|
901
1103
|
range,
|
|
@@ -994,6 +1196,17 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
|
|
|
994
1196
|
continue;
|
|
995
1197
|
}
|
|
996
1198
|
}
|
|
1199
|
+
const candidateLanguage = supportForFileWithoutHeaderSample(fileId, index.languageExtensions)?.id;
|
|
1200
|
+
if (!matchesDef &&
|
|
1201
|
+
imp.kind === "named" &&
|
|
1202
|
+
hit?.kind === "namespace" &&
|
|
1203
|
+
candidateLanguage &&
|
|
1204
|
+
isJsTsLanguage(candidateLanguage)) {
|
|
1205
|
+
// `import { nested }` binds the namespace object. Member lookup starts in that
|
|
1206
|
+
// module; `import * as ns` still starts at the barrel and descends. Goto proves the site.
|
|
1207
|
+
await scanNamespaceMemberPaths(imp, [{ file: hit.file, name: imp.local, depth: 1 }]);
|
|
1208
|
+
continue;
|
|
1209
|
+
}
|
|
997
1210
|
if (!matchesDef) {
|
|
998
1211
|
// The requested export slot itself does not exist at all (as opposed to existing
|
|
999
1212
|
// and structurally naming a different, already-proven definition): the binding may
|
|
@@ -1131,6 +1344,38 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
|
|
|
1131
1344
|
}
|
|
1132
1345
|
}
|
|
1133
1346
|
}
|
|
1347
|
+
// A scoped mixin or function is not a module member. The scope walker misses function calls
|
|
1348
|
+
// (`function_name` is not an identifier) and treats `-` and `_` as different spellings, and a
|
|
1349
|
+
// later include outside the block can attach to the nested mixin. Bare same-kind calls and
|
|
1350
|
+
// includes inside the scanned scope are the references; anything else the walker added is not.
|
|
1351
|
+
let scssScopedCallableUnproven = false;
|
|
1352
|
+
if (parsedContext.sup.id === "scss") {
|
|
1353
|
+
const scoped = await scssScopedCallableReferences(index, definition);
|
|
1354
|
+
if (scoped?.unproven) {
|
|
1355
|
+
scssScopedCallableUnproven = true;
|
|
1356
|
+
}
|
|
1357
|
+
else if (scoped) {
|
|
1358
|
+
const owned = new Set(scoped.ranges.map((range) => referenceSiteKey(definitionFile, range)));
|
|
1359
|
+
const definitionKey = referenceSiteKey(definition.file, definition.range);
|
|
1360
|
+
const kept = [];
|
|
1361
|
+
seenRefs.clear();
|
|
1362
|
+
for (const ref of refs) {
|
|
1363
|
+
const key = referenceSiteKey(ref.file, ref.range);
|
|
1364
|
+
if (key !== definitionSiteKey && key !== definitionKey && !owned.has(key))
|
|
1365
|
+
continue;
|
|
1366
|
+
seenRefs.set(key, kept.length);
|
|
1367
|
+
kept.push(ref);
|
|
1368
|
+
}
|
|
1369
|
+
refs.length = 0;
|
|
1370
|
+
refs.push(...kept);
|
|
1371
|
+
for (const range of scoped.ranges)
|
|
1372
|
+
pushRef({ file: definitionFile, range });
|
|
1373
|
+
// Those static uses stay. A lookup in the same span may still name the callable by a
|
|
1374
|
+
// string, which this walk does not edit, so coverage must not claim to be complete.
|
|
1375
|
+
if (await scssScopedCallableDynamicUnproven(index, definition))
|
|
1376
|
+
scssScopedCallableUnproven = true;
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1134
1379
|
const truncated = maxReferences !== undefined && refs.length > maxReferences;
|
|
1135
1380
|
if (truncated) {
|
|
1136
1381
|
refs.length = maxReferences;
|
|
@@ -1143,32 +1388,67 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
|
|
|
1143
1388
|
}
|
|
1144
1389
|
return left.file.localeCompare(right.file);
|
|
1145
1390
|
});
|
|
1146
|
-
|
|
1147
|
-
|
|
1391
|
+
// A block local's lexical scope can run past the block. A use the SCSS resolver proves is a
|
|
1392
|
+
// module member is not a reference of that local. The local's own uses stay: they resolve as a
|
|
1393
|
+
// shadow and the generic walker keeps them. A nearer binding with the same Sass name and a
|
|
1394
|
+
// different `-`/`_` spelling owns the read; the exact-name walk would keep it on this declaration.
|
|
1395
|
+
let scssNearerSpellingDropped = false;
|
|
1396
|
+
if (parsedContext.sup.id === "scss" &&
|
|
1397
|
+
definition.localName.startsWith("$") &&
|
|
1398
|
+
!(await scssMemberForDefinition(index, definition))) {
|
|
1399
|
+
const facts = await scssFactsForFile(index, definition.file);
|
|
1400
|
+
const definitionKey = fileIdentityKey(definition.file);
|
|
1401
|
+
const kept = [];
|
|
1148
1402
|
for (const ref of refs) {
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
const parsed = await ensureParsedContext(ref.file, parsedEntry, index.languageExtensions);
|
|
1153
|
-
cached = { source: parsed.source, tree: parsed.tree, sup: parsed.sup };
|
|
1154
|
-
perFileCache.set(fileIdentityKey(ref.file), cached);
|
|
1155
|
-
}
|
|
1156
|
-
if (opts.context === "line") {
|
|
1157
|
-
const lines = opts.lines ?? DEFAULT_REF_CONTEXT_LINES;
|
|
1158
|
-
ref.context = extractLineContext(cached.source, ref.range.start.line, lines);
|
|
1403
|
+
if (referenceSiteKey(ref.file, ref.range) === definitionSiteKey) {
|
|
1404
|
+
kept.push(ref);
|
|
1405
|
+
continue;
|
|
1159
1406
|
}
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
ref.
|
|
1407
|
+
const resolved = await goToScssDefinition(index, {
|
|
1408
|
+
file: ref.file,
|
|
1409
|
+
line: ref.range.start.line,
|
|
1410
|
+
column: ref.range.start.column,
|
|
1411
|
+
});
|
|
1412
|
+
if (resolved?.status === "ok")
|
|
1413
|
+
continue;
|
|
1414
|
+
if (facts &&
|
|
1415
|
+
fileIdentityKey(ref.file) === definitionKey &&
|
|
1416
|
+
scssNearerEquivalentLocal(facts, definition, ref.range.start)) {
|
|
1417
|
+
scssNearerSpellingDropped = true;
|
|
1418
|
+
continue;
|
|
1163
1419
|
}
|
|
1420
|
+
kept.push(ref);
|
|
1164
1421
|
}
|
|
1422
|
+
refs.length = 0;
|
|
1423
|
+
refs.push(...kept);
|
|
1165
1424
|
}
|
|
1425
|
+
await attachReferenceContext(index, refs, opts);
|
|
1166
1426
|
const scannedFiles = [definitionFile, ...candidateFiles, ...receiverScannedFiles];
|
|
1167
1427
|
// Top-level implicit-unit names and C# partial / Swift shared-owner members are both bounded
|
|
1168
1428
|
// by the source-unit relation; an unproven boundary leaves their reference set partial.
|
|
1169
1429
|
const implicitUnitComplete = !definition.isMember && IMPLICIT_UNIT_LANGUAGES[parsedContext.sup.id]
|
|
1170
1430
|
? getCompilationUnitPeers(index, definitionFile, parsedContext.sup.id === "csharp" ? { csharpQualifiedName: true } : undefined).complete
|
|
1171
1431
|
: await sharedOwnerMemberUnitComplete(index, definition);
|
|
1432
|
+
const strategyUnavailableFiles = [
|
|
1433
|
+
...receiverProofUnavailableFiles.values(),
|
|
1434
|
+
...(rubyReopen?.incomplete ? [definition.file] : []),
|
|
1435
|
+
...(namespaceExportAliasUncertainty ? [definition.file] : []),
|
|
1436
|
+
];
|
|
1437
|
+
if (parsedContext.sup.id === "scss" && definition.localName.startsWith("$")) {
|
|
1438
|
+
const facts = await scssFactsForFile(index, definition.file);
|
|
1439
|
+
if (scssNearerSpellingDropped || (facts && scssLocalSpellingGap(facts, definition))) {
|
|
1440
|
+
markNameEquivalenceGap(index, definition);
|
|
1441
|
+
}
|
|
1442
|
+
if (await scssFlowLocalUnproven(index, definition))
|
|
1443
|
+
strategyUnavailableFiles.push(definition.file);
|
|
1444
|
+
if (await scssBlockLocalExistenceUnproven(index, definition))
|
|
1445
|
+
strategyUnavailableFiles.push(definition.file);
|
|
1446
|
+
}
|
|
1447
|
+
if (parsedContext.sup.id === "python" && pythonPropertyAccessorNeedsPartialCoverage(parsedContext, definition)) {
|
|
1448
|
+
strategyUnavailableFiles.push(definition.file);
|
|
1449
|
+
}
|
|
1450
|
+
if (scssScopedCallableUnproven)
|
|
1451
|
+
strategyUnavailableFiles.push(definition.file);
|
|
1172
1452
|
const referenceCoverage = buildIndexedCandidateCoverage({
|
|
1173
1453
|
index,
|
|
1174
1454
|
def: definition,
|
|
@@ -1193,10 +1473,7 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
|
|
|
1193
1473
|
? { implicitUnitPeers: { applicable: true, executed: implicitUnitComplete } }
|
|
1194
1474
|
: {}),
|
|
1195
1475
|
}),
|
|
1196
|
-
strategyUnavailableFiles
|
|
1197
|
-
...receiverProofUnavailableFiles.values(),
|
|
1198
|
-
...(rubyReopen?.incomplete ? [definition.file] : []),
|
|
1199
|
-
],
|
|
1476
|
+
strategyUnavailableFiles,
|
|
1200
1477
|
});
|
|
1201
1478
|
return {
|
|
1202
1479
|
status: "ok",
|
|
@@ -1206,11 +1483,43 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
|
|
|
1206
1483
|
...(provenance ? { provenance } : {}),
|
|
1207
1484
|
};
|
|
1208
1485
|
}
|
|
1486
|
+
function pythonPropertyAccessorNeedsPartialCoverage(parsedContext, definition) {
|
|
1487
|
+
const nameNode = syntaxNodeForDefinition(parsedContext, definition);
|
|
1488
|
+
if (nameNode.type !== "identifier")
|
|
1489
|
+
return false;
|
|
1490
|
+
const assignment = nameNode.parent;
|
|
1491
|
+
if (assignment?.type === "assignment" && assignment.childForFieldName("left")?.id === nameNode.id) {
|
|
1492
|
+
const value = assignment.childForFieldName("right");
|
|
1493
|
+
const argumentsNode = value?.childForFieldName("arguments");
|
|
1494
|
+
if (value?.type === "call" && value.childForFieldName("function")?.text === "property" && argumentsNode) {
|
|
1495
|
+
const positionalArguments = argumentsNode.namedChildren.filter((argument) => argument.type !== "keyword_argument");
|
|
1496
|
+
if (positionalArguments[1] && positionalArguments[1].text !== "None")
|
|
1497
|
+
return true;
|
|
1498
|
+
return argumentsNode.namedChildren.some((argument) => argument.type === "keyword_argument" &&
|
|
1499
|
+
argument.childForFieldName("name")?.text === "fset" &&
|
|
1500
|
+
argument.childForFieldName("value")?.text !== "None");
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
let functionNode = nameNode;
|
|
1504
|
+
while (functionNode && functionNode.type !== "function_definition")
|
|
1505
|
+
functionNode = functionNode.parent;
|
|
1506
|
+
if (functionNode?.type !== "function_definition")
|
|
1507
|
+
return false;
|
|
1508
|
+
const functionName = functionNode.childForFieldName("name");
|
|
1509
|
+
if (functionName?.startIndex !== nameNode.startIndex || functionName.endIndex !== nameNode.endIndex)
|
|
1510
|
+
return false;
|
|
1511
|
+
const decoratedDefinition = functionNode.parent;
|
|
1512
|
+
if (decoratedDefinition?.type !== "decorated_definition")
|
|
1513
|
+
return false;
|
|
1514
|
+
return decoratedDefinition.namedChildren.some((child) => {
|
|
1515
|
+
const decorator = pythonPropertyDecorator(child);
|
|
1516
|
+
if (decorator?.kind === "property")
|
|
1517
|
+
return true;
|
|
1518
|
+
return decorator?.kind === "accessor" && decorator.propertyName === definition.localName;
|
|
1519
|
+
});
|
|
1520
|
+
}
|
|
1209
1521
|
function syntaxNodeForDefinition(parsedContext, def) {
|
|
1210
|
-
const position =
|
|
1211
|
-
row: def.range.start.line - 1,
|
|
1212
|
-
column: def.range.start.column - 1,
|
|
1213
|
-
};
|
|
1522
|
+
const position = toTreeSitterPosition(def.range.start);
|
|
1214
1523
|
return parsedContext.tree.rootNode.descendantForPosition(position, position);
|
|
1215
1524
|
}
|
|
1216
1525
|
/**
|
|
@@ -1576,6 +1885,7 @@ export async function collectNamespaceMemberRefs(file, ns, member, parsedContext
|
|
|
1576
1885
|
// Identifier equality follows the language rule, so C# `@X::@Target` matches alias `X` member `Target`.
|
|
1577
1886
|
const normalize = sup.normalizeIdentifier;
|
|
1578
1887
|
const normalizedNs = normalize(ns);
|
|
1888
|
+
const namespaceSegments = normalizedNs.includes(".") ? normalizedNs.split(".") : undefined;
|
|
1579
1889
|
const normalizedMember = normalize(member);
|
|
1580
1890
|
let effectivePythonBinding;
|
|
1581
1891
|
if (sup.id === "python" && importBinding && imports) {
|
|
@@ -1599,13 +1909,23 @@ export async function collectNamespaceMemberRefs(file, ns, member, parsedContext
|
|
|
1599
1909
|
if (obj && prop && isMemberReferencePropertyIdentifier(sup, prop.type)) {
|
|
1600
1910
|
const objectName = sliceText(obj, source);
|
|
1601
1911
|
const propertyName = sliceText(prop, source);
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1912
|
+
let objectMatches = false;
|
|
1913
|
+
if (namespaceSegments) {
|
|
1914
|
+
const chain = collectMemberAccessChain({ sup, source, chainNode: obj });
|
|
1915
|
+
if (chain &&
|
|
1916
|
+
isMemberObjectIdentifier(chain.base.type) &&
|
|
1917
|
+
chain.names.length === namespaceSegments.length - 1) {
|
|
1918
|
+
objectMatches = normalize(sliceText(chain.base, source)) === namespaceSegments[0];
|
|
1919
|
+
for (let segmentIndex = 0; objectMatches && segmentIndex < chain.names.length; segmentIndex += 1) {
|
|
1920
|
+
objectMatches =
|
|
1921
|
+
normalize(chain.names[segmentIndex]) ===
|
|
1922
|
+
namespaceSegments[namespaceSegments.length - 1 - segmentIndex];
|
|
1923
|
+
}
|
|
1924
|
+
}
|
|
1925
|
+
}
|
|
1926
|
+
else {
|
|
1927
|
+
objectMatches = isMemberObjectIdentifier(obj.type) && normalize(objectName) === normalizedNs;
|
|
1928
|
+
}
|
|
1609
1929
|
if (objectMatches && normalize(propertyName) === normalizedMember) {
|
|
1610
1930
|
let receiver = obj;
|
|
1611
1931
|
while (!isMemberObjectIdentifier(receiver.type) && receiver.namedChildren.length) {
|