@lzehrung/codegraph 2.4.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -4
- package/codegraph-skill/codegraph/SKILL.md +3 -3
- package/dist/agent/call-hierarchy.js +2 -4
- package/dist/agent/call-hierarchy.js.map +1 -1
- package/dist/agent/explore.d.ts +1 -1
- package/dist/agent/explore.d.ts.map +1 -1
- package/dist/agent/explore.js +3 -2
- package/dist/agent/explore.js.map +1 -1
- package/dist/agent/refactor-plan.js +2 -4
- package/dist/agent/refactor-plan.js.map +1 -1
- package/dist/agent/rename-preview.d.ts.map +1 -1
- package/dist/agent/rename-preview.js +58 -8
- package/dist/agent/rename-preview.js.map +1 -1
- package/dist/agent/search.js +2 -3
- package/dist/agent/search.js.map +1 -1
- package/dist/agent/semantic-symbols.d.ts.map +1 -1
- package/dist/agent/semantic-symbols.js +2 -3
- package/dist/agent/semantic-symbols.js.map +1 -1
- package/dist/agent/type-hierarchy.js +2 -4
- package/dist/agent/type-hierarchy.js.map +1 -1
- package/dist/agent/workspace-symbols.d.ts.map +1 -1
- package/dist/agent/workspace-symbols.js +2 -3
- package/dist/agent/workspace-symbols.js.map +1 -1
- package/dist/agent-tools.d.ts +0 -4
- package/dist/agent-tools.d.ts.map +1 -1
- package/dist/agent-tools.js +3 -6
- package/dist/agent-tools.js.map +1 -1
- package/dist/analysis-summary.d.ts +8 -4
- package/dist/analysis-summary.d.ts.map +1 -1
- package/dist/analysis-summary.js +15 -66
- package/dist/analysis-summary.js.map +1 -1
- package/dist/bin/cli.js +14417 -16886
- package/dist/bin/query-index-worker.js +229 -99
- package/dist/cli/command-table.d.ts.map +1 -1
- package/dist/cli/command-table.js +9 -17
- package/dist/cli/command-table.js.map +1 -1
- package/dist/cli/context.js +10 -10
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/drift.d.ts +0 -2
- package/dist/cli/drift.d.ts.map +1 -1
- package/dist/cli/drift.js +0 -1
- package/dist/cli/drift.js.map +1 -1
- package/dist/cli/graph-delta.d.ts +0 -2
- package/dist/cli/graph-delta.d.ts.map +1 -1
- package/dist/cli/graph-delta.js +0 -4
- package/dist/cli/graph-delta.js.map +1 -1
- package/dist/cli/graph.d.ts +0 -3
- package/dist/cli/graph.d.ts.map +1 -1
- package/dist/cli/graph.js +4 -14
- package/dist/cli/graph.js.map +1 -1
- package/dist/cli/help.d.ts +34 -34
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +6 -13
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/impact.d.ts +0 -2
- package/dist/cli/impact.d.ts.map +1 -1
- package/dist/cli/impact.js +0 -1
- package/dist/cli/impact.js.map +1 -1
- package/dist/cli/index.d.ts +0 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/inspect.d.ts +0 -2
- package/dist/cli/inspect.d.ts.map +1 -1
- package/dist/cli/inspect.js +5 -8
- package/dist/cli/inspect.js.map +1 -1
- package/dist/cli/invocation-context.d.ts +0 -3
- package/dist/cli/invocation-context.d.ts.map +1 -1
- package/dist/cli/invocation-context.js +4 -16
- package/dist/cli/invocation-context.js.map +1 -1
- package/dist/cli/navigation.d.ts +0 -2
- package/dist/cli/navigation.d.ts.map +1 -1
- package/dist/cli/navigation.js +0 -1
- package/dist/cli/navigation.js.map +1 -1
- package/dist/cli/options.d.ts.map +1 -1
- package/dist/cli/options.js +2 -12
- package/dist/cli/options.js.map +1 -1
- package/dist/cli/review.d.ts +0 -2
- package/dist/cli/review.d.ts.map +1 -1
- package/dist/cli/review.js +0 -5
- package/dist/cli/review.js.map +1 -1
- package/dist/cli/root-policy.d.ts +0 -2
- package/dist/cli/root-policy.d.ts.map +1 -1
- package/dist/cli/root-policy.js +0 -8
- package/dist/cli/root-policy.js.map +1 -1
- package/dist/cli/server.d.ts.map +1 -1
- package/dist/cli/server.js +0 -2
- package/dist/cli/server.js.map +1 -1
- package/dist/drift/git.d.ts.map +1 -1
- package/dist/drift/git.js +0 -1
- package/dist/drift/git.js.map +1 -1
- package/dist/drift/snapshot.d.ts.map +1 -1
- package/dist/drift/snapshot.js +0 -1
- package/dist/drift/snapshot.js.map +1 -1
- package/dist/drift/types.d.ts +0 -2
- package/dist/drift/types.d.ts.map +1 -1
- package/dist/drift/types.js.map +1 -1
- package/dist/duplicates/unit-cache.d.ts +0 -1
- package/dist/duplicates/unit-cache.d.ts.map +1 -1
- package/dist/duplicates/unit-cache.js +3 -11
- package/dist/duplicates/unit-cache.js.map +1 -1
- package/dist/duplicates/units.d.ts +5 -5
- package/dist/duplicates/units.d.ts.map +1 -1
- package/dist/duplicates/units.js +25 -88
- package/dist/duplicates/units.js.map +1 -1
- package/dist/graph-builder.d.ts +0 -6
- package/dist/graph-builder.d.ts.map +1 -1
- package/dist/graph-builder.js +2 -5
- package/dist/graph-builder.js.map +1 -1
- package/dist/graph-edge-collector.d.ts +1 -6
- package/dist/graph-edge-collector.d.ts.map +1 -1
- package/dist/graph-edge-collector.js +23 -21
- package/dist/graph-edge-collector.js.map +1 -1
- package/dist/graphs/edge-resolution.d.ts +1 -1
- package/dist/graphs/edge-resolution.d.ts.map +1 -1
- package/dist/graphs/edge-resolution.js +22 -98
- package/dist/graphs/edge-resolution.js.map +1 -1
- package/dist/graphs/specifiers.d.ts +4 -13
- package/dist/graphs/specifiers.d.ts.map +1 -1
- package/dist/graphs/specifiers.js +76 -173
- package/dist/graphs/specifiers.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts +12 -3
- package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/edge-passes.js +315 -177
- package/dist/graphs/symbol-graph-detailed/edge-passes.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/import-aliases.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/import-aliases.js +11 -0
- package/dist/graphs/symbol-graph-detailed/import-aliases.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts +25 -22
- package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed/receiver-calls.js +216 -147
- package/dist/graphs/symbol-graph-detailed/receiver-calls.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed.d.ts.map +1 -1
- package/dist/graphs/symbol-graph-detailed.js +80 -71
- package/dist/graphs/symbol-graph-detailed.js.map +1 -1
- package/dist/graphs/symbol-graph.d.ts +1 -1
- package/dist/graphs/symbol-graph.d.ts.map +1 -1
- package/dist/graphs/symbol-graph.js +12 -4
- package/dist/graphs/symbol-graph.js.map +1 -1
- package/dist/graphs/types.d.ts +0 -4
- package/dist/graphs/types.d.ts.map +1 -1
- package/dist/graphs.d.ts +1 -1
- package/dist/graphs.d.ts.map +1 -1
- package/dist/impact/analyzer.d.ts.map +1 -1
- package/dist/impact/analyzer.js +94 -1
- package/dist/impact/analyzer.js.map +1 -1
- package/dist/impact/call-compatibility.d.ts.map +1 -1
- package/dist/impact/call-compatibility.js +39 -43
- package/dist/impact/call-compatibility.js.map +1 -1
- package/dist/impact/transitive.d.ts +6 -2
- package/dist/impact/transitive.d.ts.map +1 -1
- package/dist/impact/transitive.js +23 -11
- package/dist/impact/transitive.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/indexer/build-cache/module-cache.d.ts +1 -1
- package/dist/indexer/build-cache/module-cache.d.ts.map +1 -1
- package/dist/indexer/build-cache/module-cache.js +67 -12
- package/dist/indexer/build-cache/module-cache.js.map +1 -1
- package/dist/indexer/build-cache/options.d.ts +17 -2
- package/dist/indexer/build-cache/options.d.ts.map +1 -1
- package/dist/indexer/build-cache/options.js +19 -29
- package/dist/indexer/build-cache/options.js.map +1 -1
- package/dist/indexer/build-cache/project-snapshot.d.ts +3 -4
- package/dist/indexer/build-cache/project-snapshot.d.ts.map +1 -1
- package/dist/indexer/build-cache/project-snapshot.js +53 -62
- package/dist/indexer/build-cache/project-snapshot.js.map +1 -1
- package/dist/indexer/build-cache/reports.d.ts +0 -2
- package/dist/indexer/build-cache/reports.d.ts.map +1 -1
- package/dist/indexer/build-cache/reports.js +0 -97
- package/dist/indexer/build-cache/reports.js.map +1 -1
- package/dist/indexer/build-cache.d.ts +1 -1
- package/dist/indexer/build-cache.d.ts.map +1 -1
- package/dist/indexer/build-cache.js +1 -1
- package/dist/indexer/build-cache.js.map +1 -1
- package/dist/indexer/build-index.d.ts.map +1 -1
- package/dist/indexer/build-index.js +72 -58
- package/dist/indexer/build-index.js.map +1 -1
- package/dist/indexer/build-workers.d.ts.map +1 -1
- package/dist/indexer/build-workers.js +9 -9
- package/dist/indexer/build-workers.js.map +1 -1
- package/dist/indexer/callable-identity.d.ts +24 -0
- package/dist/indexer/callable-identity.d.ts.map +1 -0
- package/dist/indexer/callable-identity.js +111 -0
- package/dist/indexer/callable-identity.js.map +1 -0
- package/dist/indexer/compilation-units.d.ts +2 -0
- package/dist/indexer/compilation-units.d.ts.map +1 -1
- package/dist/indexer/compilation-units.js +20 -18
- package/dist/indexer/compilation-units.js.map +1 -1
- package/dist/indexer/cpp-callables.d.ts +12 -7
- package/dist/indexer/cpp-callables.d.ts.map +1 -1
- package/dist/indexer/cpp-callables.js +42 -34
- package/dist/indexer/cpp-callables.js.map +1 -1
- package/dist/indexer/declaration-visibility.d.ts +7 -0
- package/dist/indexer/declaration-visibility.d.ts.map +1 -1
- package/dist/indexer/declaration-visibility.js +22 -0
- package/dist/indexer/declaration-visibility.js.map +1 -1
- package/dist/indexer/declarations.d.ts.map +1 -1
- package/dist/indexer/declarations.js +32 -7
- package/dist/indexer/declarations.js.map +1 -1
- package/dist/indexer/expand-star-imports.d.ts +6 -1
- package/dist/indexer/expand-star-imports.d.ts.map +1 -1
- package/dist/indexer/expand-star-imports.js +120 -48
- package/dist/indexer/expand-star-imports.js.map +1 -1
- package/dist/indexer/finalize.d.ts.map +1 -1
- package/dist/indexer/finalize.js +0 -1
- package/dist/indexer/finalize.js.map +1 -1
- package/dist/indexer/import-resolution-tables.d.ts +72 -0
- package/dist/indexer/import-resolution-tables.d.ts.map +1 -0
- package/dist/indexer/import-resolution-tables.js +147 -0
- package/dist/indexer/import-resolution-tables.js.map +1 -0
- package/dist/indexer/import-types.d.ts +18 -1
- package/dist/indexer/import-types.d.ts.map +1 -1
- package/dist/indexer/import-types.js.map +1 -1
- package/dist/indexer/imports/context.d.ts +6 -1
- package/dist/indexer/imports/context.d.ts.map +1 -1
- package/dist/indexer/imports/import-binding-tables.d.ts +3 -2
- package/dist/indexer/imports/import-binding-tables.d.ts.map +1 -1
- package/dist/indexer/imports/import-binding-tables.js +19 -22
- package/dist/indexer/imports/import-binding-tables.js.map +1 -1
- package/dist/indexer/imports/native-captures.d.ts.map +1 -1
- package/dist/indexer/imports/native-captures.js +10 -4
- package/dist/indexer/imports/native-captures.js.map +1 -1
- package/dist/indexer/imports/python.d.ts.map +1 -1
- package/dist/indexer/imports/python.js +46 -81
- package/dist/indexer/imports/python.js.map +1 -1
- package/dist/indexer/imports/text-import-extractors.d.ts.map +1 -1
- package/dist/indexer/imports/text-import-extractors.js +17 -7
- package/dist/indexer/imports/text-import-extractors.js.map +1 -1
- package/dist/indexer/imports.d.ts +3 -4
- package/dist/indexer/imports.d.ts.map +1 -1
- package/dist/indexer/imports.js +106 -81
- package/dist/indexer/imports.js.map +1 -1
- package/dist/indexer/incremental-plan.d.ts.map +1 -1
- package/dist/indexer/incremental-plan.js +27 -11
- package/dist/indexer/incremental-plan.js.map +1 -1
- package/dist/indexer/locals-and-exports.d.ts +1 -2
- package/dist/indexer/locals-and-exports.d.ts.map +1 -1
- package/dist/indexer/locals-and-exports.js +121 -43
- package/dist/indexer/locals-and-exports.js.map +1 -1
- package/dist/indexer/member-selection.d.ts +46 -0
- package/dist/indexer/member-selection.d.ts.map +1 -0
- package/dist/indexer/member-selection.js +169 -0
- package/dist/indexer/member-selection.js.map +1 -0
- package/dist/indexer/name-lookup-policies/c-family.d.ts +1 -1
- package/dist/indexer/name-lookup-policies/c-family.d.ts.map +1 -1
- package/dist/indexer/name-lookup-policies/c-family.js +30 -10
- package/dist/indexer/name-lookup-policies/c-family.js.map +1 -1
- package/dist/indexer/name-lookup-policies/implicit-self.d.ts.map +1 -1
- package/dist/indexer/name-lookup-policies/implicit-self.js +14 -8
- package/dist/indexer/name-lookup-policies/implicit-self.js.map +1 -1
- package/dist/indexer/name-lookup-policies/index.d.ts.map +1 -1
- package/dist/indexer/name-lookup-policies/index.js +29 -3
- package/dist/indexer/name-lookup-policies/index.js.map +1 -1
- package/dist/indexer/name-lookup-policies/php.d.ts.map +1 -1
- package/dist/indexer/name-lookup-policies/php.js +9 -2
- package/dist/indexer/name-lookup-policies/php.js.map +1 -1
- package/dist/indexer/name-resolution-types.d.ts +2 -0
- package/dist/indexer/name-resolution-types.d.ts.map +1 -1
- package/dist/indexer/name-resolution.d.ts +5 -0
- package/dist/indexer/name-resolution.d.ts.map +1 -1
- package/dist/indexer/name-resolution.js +17 -2
- package/dist/indexer/name-resolution.js.map +1 -1
- package/dist/indexer/navigation-cpp.d.ts +8 -0
- package/dist/indexer/navigation-cpp.d.ts.map +1 -1
- package/dist/indexer/navigation-cpp.js +283 -2
- package/dist/indexer/navigation-cpp.js.map +1 -1
- package/dist/indexer/navigation-goto.d.ts +11 -2
- package/dist/indexer/navigation-goto.d.ts.map +1 -1
- package/dist/indexer/navigation-goto.js +675 -333
- package/dist/indexer/navigation-goto.js.map +1 -1
- package/dist/indexer/navigation-local.d.ts +4 -1
- package/dist/indexer/navigation-local.d.ts.map +1 -1
- package/dist/indexer/navigation-local.js +43 -23
- package/dist/indexer/navigation-local.js.map +1 -1
- package/dist/indexer/navigation-provenance.d.ts +1 -1
- package/dist/indexer/navigation-provenance.d.ts.map +1 -1
- package/dist/indexer/navigation-provenance.js +4 -13
- package/dist/indexer/navigation-provenance.js.map +1 -1
- package/dist/indexer/navigation-references.d.ts +1 -1
- package/dist/indexer/navigation-references.d.ts.map +1 -1
- package/dist/indexer/navigation-references.js +44 -16
- package/dist/indexer/navigation-references.js.map +1 -1
- package/dist/indexer/navigation-resolve.d.ts +13 -0
- package/dist/indexer/navigation-resolve.d.ts.map +1 -1
- package/dist/indexer/navigation-resolve.js +158 -5
- package/dist/indexer/navigation-resolve.js.map +1 -1
- package/dist/indexer/navigation.d.ts +2 -1
- package/dist/indexer/navigation.d.ts.map +1 -1
- package/dist/indexer/navigation.js +82 -57
- package/dist/indexer/navigation.js.map +1 -1
- package/dist/indexer/parse-context.d.ts +2 -3
- package/dist/indexer/parse-context.d.ts.map +1 -1
- package/dist/indexer/parse-context.js +8 -21
- package/dist/indexer/parse-context.js.map +1 -1
- package/dist/indexer/reference-candidates.d.ts.map +1 -1
- package/dist/indexer/reference-candidates.js +13 -7
- package/dist/indexer/reference-candidates.js.map +1 -1
- package/dist/indexer/reference-context.d.ts.map +1 -1
- package/dist/indexer/reference-context.js +4 -1
- package/dist/indexer/reference-context.js.map +1 -1
- package/dist/indexer/scope-nodes.d.ts.map +1 -1
- package/dist/indexer/scope-nodes.js +5 -0
- package/dist/indexer/scope-nodes.js.map +1 -1
- package/dist/indexer/scope-types.d.ts +4 -0
- package/dist/indexer/scope-types.d.ts.map +1 -1
- package/dist/indexer/scope.d.ts +2 -3
- package/dist/indexer/scope.d.ts.map +1 -1
- package/dist/indexer/scope.js +85 -13
- package/dist/indexer/scope.js.map +1 -1
- package/dist/indexer/shared-owner-identity.js +1 -1
- package/dist/indexer/shared-owner-identity.js.map +1 -1
- package/dist/indexer/star-import-precedence.d.ts +6 -7
- package/dist/indexer/star-import-precedence.d.ts.map +1 -1
- package/dist/indexer/star-import-precedence.js +18 -12
- package/dist/indexer/star-import-precedence.js.map +1 -1
- package/dist/indexer/ts-callables.d.ts +15 -24
- package/dist/indexer/ts-callables.d.ts.map +1 -1
- package/dist/indexer/ts-callables.js +44 -75
- package/dist/indexer/ts-callables.js.map +1 -1
- package/dist/indexer/types.d.ts +23 -26
- package/dist/indexer/types.d.ts.map +1 -1
- package/dist/indexer/types.js +4 -0
- package/dist/indexer/types.js.map +1 -1
- package/dist/indexer.d.ts +2 -7
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js.map +1 -1
- package/dist/languages/all.d.ts +1 -0
- package/dist/languages/all.d.ts.map +1 -1
- package/dist/languages/all.js +1 -0
- package/dist/languages/all.js.map +1 -1
- package/dist/languages/callable-arity.d.ts +21 -0
- package/dist/languages/callable-arity.d.ts.map +1 -1
- package/dist/languages/callable-arity.js +17 -0
- package/dist/languages/callable-arity.js.map +1 -1
- package/dist/languages/definitions/terraform.d.ts +9 -0
- package/dist/languages/definitions/terraform.d.ts.map +1 -0
- package/dist/languages/definitions/terraform.js +84 -0
- package/dist/languages/definitions/terraform.js.map +1 -0
- package/dist/languages/definitions/zig.d.ts.map +1 -1
- package/dist/languages/definitions/zig.js +6 -0
- package/dist/languages/definitions/zig.js.map +1 -1
- package/dist/languages.d.ts +1 -0
- package/dist/languages.d.ts.map +1 -1
- package/dist/languages.js +1 -0
- package/dist/languages.js.map +1 -1
- package/dist/lifecycle/manifest.d.ts.map +1 -1
- package/dist/lifecycle/manifest.js +0 -1
- package/dist/lifecycle/manifest.js.map +1 -1
- package/dist/native/byte-index.d.ts +6 -0
- package/dist/native/byte-index.d.ts.map +1 -1
- package/dist/native/byte-index.js +11 -6
- package/dist/native/byte-index.js.map +1 -1
- package/dist/native/contracts.d.ts +2 -3
- package/dist/native/contracts.d.ts.map +1 -1
- package/dist/native/execution.d.ts +9 -9
- package/dist/native/execution.d.ts.map +1 -1
- package/dist/native/execution.js +37 -77
- package/dist/native/execution.js.map +1 -1
- package/dist/native/js-bridge.d.ts +2 -15
- package/dist/native/js-bridge.d.ts.map +1 -1
- package/dist/native/js-bridge.js +2 -15
- package/dist/native/js-bridge.js.map +1 -1
- package/dist/native/query-results.js +2 -2
- package/dist/native/query-results.js.map +1 -1
- package/dist/native/runtime.d.ts +12 -12
- package/dist/native/runtime.d.ts.map +1 -1
- package/dist/native/runtime.js +24 -69
- package/dist/native/runtime.js.map +1 -1
- package/dist/native/tree-sitter-native.d.ts +3 -3
- package/dist/native/tree-sitter-native.d.ts.map +1 -1
- package/dist/native/tree-sitter-native.js +2 -2
- package/dist/native/tree-sitter-native.js.map +1 -1
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +0 -4
- package/dist/presets.js.map +1 -1
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +2 -20
- package/dist/review.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +0 -5
- package/dist/session.js.map +1 -1
- package/dist/sql/navigation.js +1 -1
- package/dist/sql/navigation.js.map +1 -1
- package/dist/terraform/navigation.d.ts +20 -0
- package/dist/terraform/navigation.d.ts.map +1 -0
- package/dist/terraform/navigation.js +142 -0
- package/dist/terraform/navigation.js.map +1 -0
- package/dist/terraform/resolution.d.ts +82 -0
- package/dist/terraform/resolution.d.ts.map +1 -0
- package/dist/terraform/resolution.js +324 -0
- package/dist/terraform/resolution.js.map +1 -0
- package/dist/terraform/syntax.d.ts +109 -0
- package/dist/terraform/syntax.d.ts.map +1 -0
- package/dist/terraform/syntax.js +441 -0
- package/dist/terraform/syntax.js.map +1 -0
- package/dist/util/bloom-filter.d.ts +1 -0
- package/dist/util/bloom-filter.d.ts.map +1 -1
- package/dist/util/bloom-filter.js +3 -0
- package/dist/util/bloom-filter.js.map +1 -1
- package/dist/util/glob.d.ts +32 -0
- package/dist/util/glob.d.ts.map +1 -0
- package/dist/util/glob.js +137 -0
- package/dist/util/glob.js.map +1 -0
- package/dist/util/member-access-tables.d.ts.map +1 -1
- package/dist/util/member-access-tables.js +5 -0
- package/dist/util/member-access-tables.js.map +1 -1
- package/dist/util/member-access.d.ts.map +1 -1
- package/dist/util/member-access.js +5 -2
- package/dist/util/member-access.js.map +1 -1
- package/dist/util/project-files.d.ts +2 -10
- package/dist/util/project-files.d.ts.map +1 -1
- package/dist/util/project-files.js +32 -52
- package/dist/util/project-files.js.map +1 -1
- package/dist/util/python-type-checking.d.ts +18 -0
- package/dist/util/python-type-checking.d.ts.map +1 -0
- package/dist/util/python-type-checking.js +160 -0
- package/dist/util/python-type-checking.js.map +1 -0
- package/dist/util/resolution/jvm.d.ts +7 -3
- package/dist/util/resolution/jvm.d.ts.map +1 -1
- package/dist/util/resolution/jvm.js +56 -38
- package/dist/util/resolution/jvm.js.map +1 -1
- package/dist/util/resolution/rust.d.ts +0 -1
- package/dist/util/resolution/rust.d.ts.map +1 -1
- package/dist/util/resolution/rust.js +0 -9
- package/dist/util/resolution/rust.js.map +1 -1
- package/dist/util/resolution/specifier-targets.d.ts +44 -0
- package/dist/util/resolution/specifier-targets.d.ts.map +1 -0
- package/dist/util/resolution/specifier-targets.js +157 -0
- package/dist/util/resolution/specifier-targets.js.map +1 -0
- package/dist/util/resolution/terraform.d.ts +18 -0
- package/dist/util/resolution/terraform.d.ts.map +1 -0
- package/dist/util/resolution/terraform.js +64 -0
- package/dist/util/resolution/terraform.js.map +1 -0
- package/dist/util/resolution.d.ts.map +1 -1
- package/dist/util/resolution.js +5 -10
- package/dist/util/resolution.js.map +1 -1
- package/dist/util/specifiers.d.ts +9 -1
- package/dist/util/specifiers.d.ts.map +1 -1
- package/dist/util/specifiers.js +27 -8
- package/dist/util/specifiers.js.map +1 -1
- package/dist/util/trivia-tables.d.ts.map +1 -1
- package/dist/util/trivia-tables.js +9 -0
- package/dist/util/trivia-tables.js.map +1 -1
- package/dist/util/trivia.d.ts.map +1 -1
- package/dist/util/trivia.js +49 -30
- package/dist/util/trivia.js.map +1 -1
- package/dist/util/workspace.d.ts.map +1 -1
- package/dist/util/workspace.js +32 -4
- package/dist/util/workspace.js.map +1 -1
- package/package.json +6 -8
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { getCompilationUnitPeers } from "../indexer/compilation-units.js";
|
|
3
|
+
import { ensureParsedContext } from "../indexer/parse-context.js";
|
|
4
|
+
import { supportForFileWithoutHeaderSample } from "../languages.js";
|
|
5
|
+
import { isNativeRequiredUnavailableError } from "../native/runtime.js";
|
|
6
|
+
import { fileIdentityKey } from "../util/paths.js";
|
|
7
|
+
import { terraformLocalModuleDirectory } from "../util/resolution/terraform.js";
|
|
8
|
+
import { extractTerraformFacts, terraformOutputSelectionReadsOutput, } from "./syntax.js";
|
|
9
|
+
/**
|
|
10
|
+
* The one place that decides what a Terraform reference names. `goToDefinition`,
|
|
11
|
+
* `findReferences`, and rename preview all resolve sites here.
|
|
12
|
+
*
|
|
13
|
+
* - `var`, `local`, `module`, resource, and data source references resolve within the module
|
|
14
|
+
* directory of the referring file.
|
|
15
|
+
* - `module.<name>.<output>` and module call arguments resolve in the directory named by the
|
|
16
|
+
* call's literal local `source`. Registry, Git, and other remote sources are not followed.
|
|
17
|
+
* - A name declared more than once in one module is ambiguous and resolves to nothing.
|
|
18
|
+
*/
|
|
19
|
+
export const TERRAFORM_LANGUAGE_ID = "terraform";
|
|
20
|
+
export function isTerraformFile(index, file) {
|
|
21
|
+
return supportForFileWithoutHeaderSample(file, index.languageExtensions)?.id === TERRAFORM_LANGUAGE_ID;
|
|
22
|
+
}
|
|
23
|
+
const factsByModule = new WeakMap();
|
|
24
|
+
async function computeFacts(index, module) {
|
|
25
|
+
try {
|
|
26
|
+
const parsed = await ensureParsedContext(module.file, index.parsed?.get(fileIdentityKey(module.file)), index.languageExtensions);
|
|
27
|
+
if (parsed.sup.id !== TERRAFORM_LANGUAGE_ID)
|
|
28
|
+
return null;
|
|
29
|
+
return extractTerraformFacts(parsed.tree.rootNode);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (isNativeRequiredUnavailableError(error))
|
|
33
|
+
throw error;
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Declarations and reference sites of one indexed Terraform file, or null when the file is not
|
|
39
|
+
* indexed or could not be parsed. Cached per indexed module, so a re-indexed file is re-read.
|
|
40
|
+
*/
|
|
41
|
+
export function terraformFactsForFile(index, file) {
|
|
42
|
+
const module = index.byFile.get(fileIdentityKey(file));
|
|
43
|
+
if (!module)
|
|
44
|
+
return Promise.resolve(null);
|
|
45
|
+
let facts = factsByModule.get(module);
|
|
46
|
+
if (!facts) {
|
|
47
|
+
facts = computeFacts(index, module);
|
|
48
|
+
factsByModule.set(module, facts);
|
|
49
|
+
}
|
|
50
|
+
return facts;
|
|
51
|
+
}
|
|
52
|
+
/** Indexed Terraform files of the module (directory) that contains `file`, including `file`. */
|
|
53
|
+
export function terraformModuleFiles(index, file) {
|
|
54
|
+
return [...getCompilationUnitPeers(index, file).files]
|
|
55
|
+
.filter((peer) => isTerraformFile(index, peer))
|
|
56
|
+
.sort((left, right) => left.localeCompare(right));
|
|
57
|
+
}
|
|
58
|
+
const directoryLookups = new WeakMap();
|
|
59
|
+
/** One indexed Terraform file per module directory, for resolving a module call's directory. */
|
|
60
|
+
function indexedTerraformFileInDirectory(index, directory) {
|
|
61
|
+
let lookup = directoryLookups.get(index);
|
|
62
|
+
if (!lookup || lookup.source !== index.byFile || lookup.size !== index.byFile.size) {
|
|
63
|
+
const files = new Map();
|
|
64
|
+
for (const module of index.byFile.values()) {
|
|
65
|
+
if (!isTerraformFile(index, module.file))
|
|
66
|
+
continue;
|
|
67
|
+
const key = fileIdentityKey(path.dirname(module.file));
|
|
68
|
+
if (!files.has(key))
|
|
69
|
+
files.set(key, module.file);
|
|
70
|
+
}
|
|
71
|
+
lookup = { source: index.byFile, size: index.byFile.size, files };
|
|
72
|
+
directoryLookups.set(index, lookup);
|
|
73
|
+
}
|
|
74
|
+
return lookup.files.get(fileIdentityKey(directory));
|
|
75
|
+
}
|
|
76
|
+
/** Every indexed Terraform file, in path order. */
|
|
77
|
+
export function indexedTerraformFiles(index) {
|
|
78
|
+
return [...index.byFile.values()]
|
|
79
|
+
.map((module) => module.file)
|
|
80
|
+
.filter((file) => isTerraformFile(index, file))
|
|
81
|
+
.sort((left, right) => left.localeCompare(right));
|
|
82
|
+
}
|
|
83
|
+
function definitionForDeclaration(index, file, declaration) {
|
|
84
|
+
const module = index.byFile.get(fileIdentityKey(file));
|
|
85
|
+
return module?.locals.find((local) => local.localName === declaration.name && local.range.start.index === declaration.range.start.index);
|
|
86
|
+
}
|
|
87
|
+
function describe(query) {
|
|
88
|
+
return query.type ? `${query.kind} ${query.type}.${query.name}` : `${query.kind} ${query.name}`;
|
|
89
|
+
}
|
|
90
|
+
/** Declarations matching `query` in `files`, and the files whose facts could not be loaded. */
|
|
91
|
+
async function matchingDeclarations(index, files, query) {
|
|
92
|
+
const matches = [];
|
|
93
|
+
let unreadable = 0;
|
|
94
|
+
for (const file of files) {
|
|
95
|
+
const facts = await terraformFactsForFile(index, file);
|
|
96
|
+
if (!facts) {
|
|
97
|
+
unreadable += 1;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
for (const declaration of facts.declarations) {
|
|
101
|
+
if (declaration.kind !== query.kind || declaration.name !== query.name)
|
|
102
|
+
continue;
|
|
103
|
+
if (query.type !== undefined && declaration.type !== query.type)
|
|
104
|
+
continue;
|
|
105
|
+
matches.push({ file, declaration });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return { matches, unreadable };
|
|
109
|
+
}
|
|
110
|
+
function indexedDefinitions(index, matches) {
|
|
111
|
+
return matches.flatMap((match) => {
|
|
112
|
+
const def = definitionForDeclaration(index, match.file, match.declaration);
|
|
113
|
+
return def ? [def] : [];
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/** An unreadable module file may also declare the name, so no match is proven. */
|
|
117
|
+
function unreadableModuleFiles(query) {
|
|
118
|
+
return {
|
|
119
|
+
status: "not_found",
|
|
120
|
+
reason: `A Terraform file of the module could not be read, so ${describe(query)} is unproven`,
|
|
121
|
+
unproven: true,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function declaredMoreThanOnce(query) {
|
|
125
|
+
return {
|
|
126
|
+
status: "not_found",
|
|
127
|
+
reason: `Terraform ${describe(query)} is declared more than once in the module`,
|
|
128
|
+
unproven: true,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async function findDeclaration(index, files, query) {
|
|
132
|
+
const { matches, unreadable } = await matchingDeclarations(index, files, query);
|
|
133
|
+
if (unreadable)
|
|
134
|
+
return unreadableModuleFiles(query);
|
|
135
|
+
const [match, ...others] = matches;
|
|
136
|
+
if (!match)
|
|
137
|
+
return { status: "not_found", reason: `No Terraform ${describe(query)} declaration in the module` };
|
|
138
|
+
if (others.length)
|
|
139
|
+
return declaredMoreThanOnce(query);
|
|
140
|
+
const def = definitionForDeclaration(index, match.file, match.declaration);
|
|
141
|
+
if (!def)
|
|
142
|
+
return { status: "not_found", reason: `Terraform ${describe(query)} declaration is not indexed` };
|
|
143
|
+
return { status: "ok", file: match.file, declaration: match.declaration, def };
|
|
144
|
+
}
|
|
145
|
+
/** The directory a module call in `file`'s module sources, or a reason it has none. */
|
|
146
|
+
async function calledModuleDirectory(index, file, moduleName) {
|
|
147
|
+
const query = { kind: "module", name: moduleName };
|
|
148
|
+
const call = await findDeclaration(index, terraformModuleFiles(index, file), query);
|
|
149
|
+
if (call.status !== "ok")
|
|
150
|
+
return call;
|
|
151
|
+
const source = call.declaration.source;
|
|
152
|
+
if (source === undefined)
|
|
153
|
+
return { status: "not_found", reason: `Module ${moduleName} has no literal source` };
|
|
154
|
+
const directory = terraformLocalModuleDirectory(call.file, source);
|
|
155
|
+
if (!directory)
|
|
156
|
+
return { status: "not_found", reason: `Module source ${source} is not a local path` };
|
|
157
|
+
return { status: "ok", directory, instancing: call.declaration.instancing ?? "single" };
|
|
158
|
+
}
|
|
159
|
+
/** Indexed files of the module that a module call in `file` sources, or a reason it has none. */
|
|
160
|
+
async function calledModuleFiles(index, file, moduleName, selection) {
|
|
161
|
+
const called = await calledModuleDirectory(index, file, moduleName);
|
|
162
|
+
if (called.status !== "ok")
|
|
163
|
+
return called;
|
|
164
|
+
if (selection && !terraformOutputSelectionReadsOutput(selection, called.instancing)) {
|
|
165
|
+
return { status: "not_found", reason: `The indexes after module ${moduleName} do not select an output` };
|
|
166
|
+
}
|
|
167
|
+
const childFile = indexedTerraformFileInDirectory(index, called.directory);
|
|
168
|
+
if (!childFile)
|
|
169
|
+
return { status: "not_found", reason: `Module ${moduleName} source has no indexed Terraform files` };
|
|
170
|
+
return { status: "ok", files: terraformModuleFiles(index, childFile) };
|
|
171
|
+
}
|
|
172
|
+
function isModuleDirectoryOf(directory, def) {
|
|
173
|
+
return fileIdentityKey(directory) === fileIdentityKey(path.dirname(def.file));
|
|
174
|
+
}
|
|
175
|
+
/** True when `use` in `file` may read an output of the module whose files include `def`, unproven. */
|
|
176
|
+
export async function terraformModuleUseTargetsDefinition(index, file, use, def) {
|
|
177
|
+
const called = await calledModuleDirectory(index, file, use.module);
|
|
178
|
+
if (called.status !== "ok")
|
|
179
|
+
return called.unproven === true;
|
|
180
|
+
// A selection that fits the call names its output; the reference loop resolves that site.
|
|
181
|
+
if (use.selection && terraformOutputSelectionReadsOutput(use.selection, called.instancing))
|
|
182
|
+
return false;
|
|
183
|
+
return isModuleDirectoryOf(called.directory, def);
|
|
184
|
+
}
|
|
185
|
+
/** Resolves one reference target written in `file` to its indexed declaration. */
|
|
186
|
+
export async function resolveTerraformTarget(index, file, target) {
|
|
187
|
+
let files;
|
|
188
|
+
let query;
|
|
189
|
+
if (target.kind === "output" || target.kind === "input") {
|
|
190
|
+
const selection = target.kind === "output" ? target.selection : undefined;
|
|
191
|
+
const called = await calledModuleFiles(index, file, target.module, selection);
|
|
192
|
+
if (called.status !== "ok")
|
|
193
|
+
return called;
|
|
194
|
+
files = called.files;
|
|
195
|
+
query = { kind: target.kind === "output" ? "output" : "variable", name: target.name };
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
files = terraformModuleFiles(index, file);
|
|
199
|
+
query = target;
|
|
200
|
+
}
|
|
201
|
+
const match = await findDeclaration(index, files, query);
|
|
202
|
+
return match.status === "ok" ? { status: "ok", def: match.def } : match;
|
|
203
|
+
}
|
|
204
|
+
/** The Terraform declaration that an indexed definition names, if any. */
|
|
205
|
+
export async function terraformDeclarationForDefinition(index, def) {
|
|
206
|
+
const facts = await terraformFactsForFile(index, def.file);
|
|
207
|
+
return facts?.declarations.find((declaration) => declaration.name === def.localName && declaration.range.start.index === def.range.start.index);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Declarations in the same module that renaming `def` to `newName` would collide with. Terraform
|
|
211
|
+
* keeps one namespace per declaration kind (and per type for resources and data sources), so only
|
|
212
|
+
* a same-kind declaration with that name conflicts.
|
|
213
|
+
*/
|
|
214
|
+
export async function terraformRenameCollisions(index, def, newName) {
|
|
215
|
+
if (!isTerraformFile(index, def.file))
|
|
216
|
+
return [];
|
|
217
|
+
const declaration = await terraformDeclarationForDefinition(index, def);
|
|
218
|
+
if (!declaration)
|
|
219
|
+
return [];
|
|
220
|
+
const query = {
|
|
221
|
+
kind: declaration.kind,
|
|
222
|
+
...(declaration.type === undefined ? {} : { type: declaration.type }),
|
|
223
|
+
name: newName,
|
|
224
|
+
};
|
|
225
|
+
const { matches } = await matchingDeclarations(index, terraformModuleFiles(index, def.file), query);
|
|
226
|
+
return indexedDefinitions(index, matches);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Reference sites to a data source `def` that a `check` block would capture after renaming it to
|
|
230
|
+
* `newName`: the check declares its own `data "<type>" "<newName>"`, which wins inside the check.
|
|
231
|
+
*/
|
|
232
|
+
export async function terraformScopedDataCaptures(index, def, newName, references) {
|
|
233
|
+
if (!isTerraformFile(index, def.file))
|
|
234
|
+
return [];
|
|
235
|
+
const declaration = await terraformDeclarationForDefinition(index, def);
|
|
236
|
+
if (declaration?.kind !== "data")
|
|
237
|
+
return [];
|
|
238
|
+
const address = `${declaration.type}.${newName}`;
|
|
239
|
+
const captured = [];
|
|
240
|
+
for (const reference of references) {
|
|
241
|
+
const facts = await terraformFactsForFile(index, reference.file);
|
|
242
|
+
const start = reference.range.start.index ?? 0;
|
|
243
|
+
const inCapturingCheck = facts?.checkScopes.some((scope) => (scope.range.start.index ?? 0) <= start &&
|
|
244
|
+
start < (scope.range.end.index ?? 0) &&
|
|
245
|
+
scope.dataSources.includes(address));
|
|
246
|
+
if (inCapturingCheck)
|
|
247
|
+
captured.push(reference);
|
|
248
|
+
}
|
|
249
|
+
return captured;
|
|
250
|
+
}
|
|
251
|
+
/** Input variable names Terraform reserves because module calls use them as meta-arguments. */
|
|
252
|
+
const RESERVED_INPUT_NAMES = new Set([
|
|
253
|
+
"source",
|
|
254
|
+
"version",
|
|
255
|
+
"providers",
|
|
256
|
+
"count",
|
|
257
|
+
"for_each",
|
|
258
|
+
"lifecycle",
|
|
259
|
+
"depends_on",
|
|
260
|
+
"locals",
|
|
261
|
+
]);
|
|
262
|
+
/** True when renaming `def` to `newName` would give an input variable a reserved name. */
|
|
263
|
+
export async function isTerraformReservedRename(index, def, newName) {
|
|
264
|
+
if (!RESERVED_INPUT_NAMES.has(newName) || !isTerraformFile(index, def.file))
|
|
265
|
+
return false;
|
|
266
|
+
return (await terraformDeclarationForDefinition(index, def))?.kind === "variable";
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Files outside the declaring module that can reference a declaration: every file of each module
|
|
270
|
+
* that calls the declaring directory through a local source. Call arguments name input variables,
|
|
271
|
+
* and `module.<name>.<output>` can appear in any file of the calling module. `addressFiles` lists
|
|
272
|
+
* every file that holds a module resource address, which can name nested calls at any depth.
|
|
273
|
+
* `unavailable` lists files whose facts could not be loaded, so what they name is unknown.
|
|
274
|
+
*/
|
|
275
|
+
export async function terraformModuleCallerFiles(index, def) {
|
|
276
|
+
const directoryKey = fileIdentityKey(path.dirname(def.file));
|
|
277
|
+
const callers = new Map();
|
|
278
|
+
const addressFiles = [];
|
|
279
|
+
const unavailable = [];
|
|
280
|
+
for (const file of indexedTerraformFiles(index)) {
|
|
281
|
+
const facts = await terraformFactsForFile(index, file);
|
|
282
|
+
if (!facts) {
|
|
283
|
+
unavailable.push(file);
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
if (facts.moduleObjectUses.some((use) => use.addressChain))
|
|
287
|
+
addressFiles.push(file);
|
|
288
|
+
const callsDirectory = facts.declarations.some((declaration) => {
|
|
289
|
+
if (declaration.kind !== "module" || declaration.source === undefined)
|
|
290
|
+
return false;
|
|
291
|
+
const directory = terraformLocalModuleDirectory(file, declaration.source);
|
|
292
|
+
return directory !== null && fileIdentityKey(directory) === directoryKey;
|
|
293
|
+
});
|
|
294
|
+
if (!callsDirectory)
|
|
295
|
+
continue;
|
|
296
|
+
for (const peer of terraformModuleFiles(index, file))
|
|
297
|
+
callers.set(fileIdentityKey(peer), peer);
|
|
298
|
+
}
|
|
299
|
+
return { files: [...callers.values()], addressFiles, unavailable };
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* True when a module resource address written in `file` may name `def`: a nested module call in
|
|
303
|
+
* its chain, or a resource or data source of the last called module. Each chain segment resolves
|
|
304
|
+
* in the module the previous segment calls; an unproven segment may name anything.
|
|
305
|
+
*/
|
|
306
|
+
export async function terraformAddressMayName(index, file, chain, def, kind) {
|
|
307
|
+
let from = file;
|
|
308
|
+
for (const [position, moduleName] of chain.entries()) {
|
|
309
|
+
if (!from)
|
|
310
|
+
return false;
|
|
311
|
+
const called = await calledModuleDirectory(index, from, moduleName);
|
|
312
|
+
if (called.status !== "ok")
|
|
313
|
+
return called.unproven === true;
|
|
314
|
+
const nextModule = chain[position + 1];
|
|
315
|
+
if (nextModule === undefined) {
|
|
316
|
+
return (kind === "resource" || kind === "data") && isModuleDirectoryOf(called.directory, def);
|
|
317
|
+
}
|
|
318
|
+
if (kind === "module" && nextModule === def.localName && isModuleDirectoryOf(called.directory, def))
|
|
319
|
+
return true;
|
|
320
|
+
from = indexedTerraformFileInDirectory(index, called.directory);
|
|
321
|
+
}
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution.js","sourceRoot":"","sources":["../../src/terraform/resolution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { SyntaxNodeLike } from "../languages/types.js";
|
|
2
|
+
import type { Range } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Terraform declarations and references proven from HCL syntax.
|
|
5
|
+
*
|
|
6
|
+
* A Terraform module is a directory, so declarations here are keyed by kind, name, and (for
|
|
7
|
+
* resources and data sources) type within that directory. References name their target through
|
|
8
|
+
* a fixed address form: `var.<name>`, `local.<name>`, `module.<name>[.<output>]`,
|
|
9
|
+
* `data.<type>.<name>`, and `<type>.<name>` for a managed resource. Module call arguments name an
|
|
10
|
+
* input variable of the called module. Nothing here reads another file; `./resolution.ts` owns
|
|
11
|
+
* every cross-file decision.
|
|
12
|
+
*/
|
|
13
|
+
export type TerraformDeclarationKind = "variable" | "local" | "output" | "module" | "resource" | "data";
|
|
14
|
+
export type TerraformDeclaration = {
|
|
15
|
+
kind: TerraformDeclarationKind;
|
|
16
|
+
/** Resource or data source type label, such as `aws_instance`. */
|
|
17
|
+
type?: string;
|
|
18
|
+
name: string;
|
|
19
|
+
/** Range of the declared name: the label text or the `locals` attribute name. */
|
|
20
|
+
range: Range;
|
|
21
|
+
/** Literal `source` of a module call; absent when missing or not a plain string. */
|
|
22
|
+
source?: string;
|
|
23
|
+
/** How a module call is instanced: `count` and `for_each` calls need one index per instance. */
|
|
24
|
+
instancing?: TerraformModuleInstancing;
|
|
25
|
+
};
|
|
26
|
+
export type TerraformModuleInstancing = "single" | "count" | "for_each";
|
|
27
|
+
/** How `module.<module>...<output>` reaches its output: indexes before it, or a splat. */
|
|
28
|
+
export type TerraformOutputSelection = {
|
|
29
|
+
indexes: number;
|
|
30
|
+
splat: boolean;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* True when `selection` reads an output of a call with `instancing`. A splat reads each instance
|
|
34
|
+
* of a `count` list or the one single instance; a `for_each` value is a map, which a splat wraps as
|
|
35
|
+
* one element, so `module.m[*].key.out` selects instance `key`. Otherwise a `count` or `for_each`
|
|
36
|
+
* call needs exactly one instance index (`module.m["key"].out`), and a single call needs none:
|
|
37
|
+
* there, `module.m["key"].out` reads field `out` of output `key`.
|
|
38
|
+
*/
|
|
39
|
+
export declare function terraformOutputSelectionReadsOutput(selection: TerraformOutputSelection, instancing: TerraformModuleInstancing): boolean;
|
|
40
|
+
export type TerraformReferenceTarget = {
|
|
41
|
+
kind: "variable" | "local" | "module";
|
|
42
|
+
name: string;
|
|
43
|
+
} | {
|
|
44
|
+
kind: "resource" | "data";
|
|
45
|
+
type: string;
|
|
46
|
+
name: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* `module.<module>.<name>`: an output of the called module when `selection` matches the call's
|
|
50
|
+
* instancing (see `terraformOutputSelectionReadsOutput`).
|
|
51
|
+
*/
|
|
52
|
+
| {
|
|
53
|
+
kind: "output";
|
|
54
|
+
module: string;
|
|
55
|
+
name: string;
|
|
56
|
+
selection: TerraformOutputSelection;
|
|
57
|
+
}
|
|
58
|
+
/** An argument in `module "<module>" { <name> = ... }`: an input variable of the called module. */
|
|
59
|
+
| {
|
|
60
|
+
kind: "input";
|
|
61
|
+
module: string;
|
|
62
|
+
name: string;
|
|
63
|
+
};
|
|
64
|
+
export type TerraformReferenceSite = {
|
|
65
|
+
/** Range of the identifier that spells the target's name. */
|
|
66
|
+
range: Range;
|
|
67
|
+
target: TerraformReferenceTarget;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* A module call value that may read any of its outputs: a whole value (`module.net`) has no
|
|
71
|
+
* `selection`; an output site carries its `selection`, which reads something other than the named
|
|
72
|
+
* output when it does not match the call's instancing. An `addressChain` use is a resource address
|
|
73
|
+
* in `import`, `moved`, or `removed`, such as `module.parent.module.child.aws_instance.web`; the
|
|
74
|
+
* chain lists its module call names (`["parent", "child"]`), and the address names those nested
|
|
75
|
+
* calls and a resource or data source of the last called module rather than an output.
|
|
76
|
+
*/
|
|
77
|
+
export type TerraformModuleObjectUse = {
|
|
78
|
+
module: string;
|
|
79
|
+
range: Range;
|
|
80
|
+
selection?: TerraformOutputSelection;
|
|
81
|
+
addressChain?: string[];
|
|
82
|
+
};
|
|
83
|
+
/** A `check` block and the `<type>.<name>` addresses of the data sources it declares for itself. */
|
|
84
|
+
export type TerraformCheckScope = {
|
|
85
|
+
range: Range;
|
|
86
|
+
dataSources: string[];
|
|
87
|
+
};
|
|
88
|
+
export type TerraformFileFacts = {
|
|
89
|
+
declarations: TerraformDeclaration[];
|
|
90
|
+
references: TerraformReferenceSite[];
|
|
91
|
+
moduleObjectUses: TerraformModuleObjectUse[];
|
|
92
|
+
checkScopes: TerraformCheckScope[];
|
|
93
|
+
};
|
|
94
|
+
/** An HCL identifier: a letter or `_`, then letters, digits, `_`, or `-` (`my-server`). */
|
|
95
|
+
export declare const TERRAFORM_IDENTIFIER_PATTERN: RegExp;
|
|
96
|
+
/**
|
|
97
|
+
* The Terraform declaration a name node declares, or null. Shared by symbol classification and
|
|
98
|
+
* reference resolution so both read one declaration rule. Only top-level blocks with quoted,
|
|
99
|
+
* uninterpolated labels declare names.
|
|
100
|
+
*/
|
|
101
|
+
export declare function terraformDeclarationForNameNode(node: SyntaxNodeLike): {
|
|
102
|
+
kind: TerraformDeclarationKind;
|
|
103
|
+
type?: string;
|
|
104
|
+
} | null;
|
|
105
|
+
/** Symbol classification for `LanguageDefinition.classifyDefinition`. */
|
|
106
|
+
export declare function classifyTerraformDefinition(node: SyntaxNodeLike): string;
|
|
107
|
+
/** Extracts declarations and reference sites from one parsed Terraform file. */
|
|
108
|
+
export declare function extractTerraformFacts(root: SyntaxNodeLike): TerraformFileFacts;
|
|
109
|
+
//# sourceMappingURL=syntax.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntax.d.ts","sourceRoot":"","sources":["../../src/terraform/syntax.ts"],"names":[],"mappings":"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"}
|