decoder: Fix collection of implied declared targets of complex types #259
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
As discovered in #251
UX Impact
There currently aren't any constraints in the Terraform schema involving targetable
List
/Set
/Tuple
/Map
/Object
- most occurrences are either not targetable or are implied throughLiteralType
orAnyExpression
, or part ofOneOf
whereAnyExpression
takes precedence when collecting targets.TL;DR there's no expected UX impact on Terraform LS users.
This was only discovered because some existing tests being updated in #251
Implementation Notes
There are situations where the schema may be vague and the user may benefit from seeing the fully inferred type, rather than just
any
in certain contexts. We already do that for the most obvious case ofLiteralType{Type: cty.DynamicPseudoType}
andAnyExpression{}
equivalent.hcl-lang/decoder/expr_literal_type_ref_targets.go
Lines 18 to 23 in d2c7ba3
We could potentially implement
InferType()
for all the impacted types, but there's no immediate benefit given the above + this would require some more changes to take advantage of such type inference. We'd e.g. have to introduceTypeHint
toTargetContext
and get all the expression types to actually use the inferred type when collecting the targets.The edge cases this could handle involve either explicit
List
,Set
,Tuple
,Map
orObject
constraints withcty.DynamicPseudoType
element type, orLiteralType{Type: cty.List(cty.DynamicPseudoType)}
and similar.