Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Finish reference target collection for all constraints #239

Merged
merged 26 commits into from
Mar 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
4c13c0e
decoder: Finish implementing reference targets for List
radeksimko Mar 20, 2023
1132de1
decoder: Finish implementing reference targets for Set
radeksimko Mar 20, 2023
2bb0fb7
decoder: Finish implementing reference targets for Tuple
radeksimko Mar 20, 2023
9f40446
decoder: Avoid collecting non-addressable attributes as targets in List
radeksimko Mar 24, 2023
2d5db62
decoder: Avoid collecting non-addressable attributes as targets in Tuple
radeksimko Mar 24, 2023
4b9f4b8
decoder: Finish implementing reference targets for Map
radeksimko Mar 24, 2023
51f5bec
decoder: Finish implementing reference targets for Object
radeksimko Mar 24, 2023
877782d
decoder: Collect undeclared attributes in Object as targets too
radeksimko Mar 20, 2023
d3c888b
decoder: Use AttrStep syntax to target Object attributes if possible
radeksimko Mar 20, 2023
94c8008
decoder: Account for (Def)Ranges of attributes
radeksimko Mar 20, 2023
6d15668
decoder: Collect primitive type targets correctly in LiteralType
radeksimko Mar 20, 2023
3ebb7ee
decoder: Collect 'any' type by inferring it from value (LiteralType/O…
radeksimko Mar 24, 2023
e26004e
decoder: fix block body inferred target collection
radeksimko Mar 29, 2023
3a6053f
decoder: Account for JSON in ref. targets for LiteralType
radeksimko Mar 24, 2023
7ea314c
decoder: Account for JSON keys in rawObjectKey
radeksimko Mar 27, 2023
bd005c7
decoder: Account for JSON when collecting targets for Map/Object
radeksimko Mar 27, 2023
e7f8aa9
decoder: Add tests for reference targets (OneOf)
radeksimko Mar 27, 2023
25b482b
decoder: Account for legacy JSON syntax in Reference
radeksimko Mar 28, 2023
70449de
schema: Fix typo in validation error
radeksimko Mar 28, 2023
7b5359e
decoder: Only pass TargetContext when there are targets to collect
radeksimko Mar 28, 2023
baea9c1
decoder: Add tests for reference targets (List)
radeksimko Mar 28, 2023
0c30af2
decoder: Add tests for reference targets (Set)
radeksimko Mar 28, 2023
d687428
decoder: Add tests for reference targets (Tuple)
radeksimko Mar 28, 2023
3831dd7
decoder: Add tests for reference targets (Object)
radeksimko Mar 28, 2023
387fb09
decoder: Add tests for reference targets (Map)
radeksimko Mar 28, 2023
261c5e6
decoder: Add tests for reference targets (LiteralType)
radeksimko Mar 28, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 65 additions & 10 deletions decoder/expr_list_ref_targets.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,33 @@ import (

"github.com/hashicorp/hcl-lang/lang"
"github.com/hashicorp/hcl-lang/reference"
"github.com/hashicorp/hcl/v2/hclsyntax"
"github.com/hashicorp/hcl-lang/schema"
"github.com/hashicorp/hcl/v2"
"github.com/zclconf/go-cty/cty"
)

func (list List) ReferenceTargets(ctx context.Context, targetCtx *TargetContext) reference.Targets {
eType, ok := list.expr.(*hclsyntax.TupleConsExpr)
if !ok {
elems, diags := hcl.ExprList(list.expr)
if diags.HasErrors() {
return reference.Targets{}
}

if len(eType.Exprs) == 0 || list.cons.Elem == nil {
if list.cons.Elem == nil {
return reference.Targets{}
}

targets := make(reference.Targets, 0)

// TODO: collect parent target for the whole list
// See https://github.com/hashicorp/hcl-lang/issues/228
elemTargets := make(reference.Targets, 0)

for i, elemExpr := range eType.Exprs {
for i, elemExpr := range elems {
expr := newExpression(list.pathCtx, elemExpr, list.cons.Elem)
if e, ok := expr.(ReferenceTargetsExpression); ok {
if targetCtx == nil {
// collect any targets inside the expression
// if attribute itself isn't targetable
elemTargets = append(elemTargets, e.ReferenceTargets(ctx, nil)...)
continue
}

elemCtx := targetCtx.Copy()
elemCtx.ParentAddress = append(elemCtx.ParentAddress, lang.IndexStep{
Key: cty.NumberIntVal(int64(i)),
Expand All @@ -37,8 +42,58 @@ func (list List) ReferenceTargets(ctx context.Context, targetCtx *TargetContext)
})
}

targets = append(targets, e.ReferenceTargets(ctx, elemCtx)...)
elemTargets = append(elemTargets, e.ReferenceTargets(ctx, elemCtx)...)
}
}

targets := make(reference.Targets, 0)

if targetCtx != nil {
// collect target for the whole list

var rangePtr *hcl.Range
if targetCtx.ParentRangePtr != nil {
rangePtr = targetCtx.ParentRangePtr
} else {
rangePtr = list.expr.Range().Ptr()
}

// type-aware
elemCons, ok := list.cons.Elem.(schema.TypeAwareConstraint)
if targetCtx.AsExprType && ok {
elemType, ok := elemCons.ConstraintType()
if ok {
targets = append(targets, reference.Target{
Addr: targetCtx.ParentAddress,
Name: targetCtx.FriendlyName,
Type: cty.List(elemType),
ScopeId: targetCtx.ScopeId,
RangePtr: rangePtr,
DefRangePtr: targetCtx.ParentDefRangePtr,
NestedTargets: elemTargets,
LocalAddr: targetCtx.ParentLocalAddress,
TargetableFromRangePtr: targetCtx.TargetableFromRangePtr,
})
}
}

// type-unaware
if targetCtx.AsReference {
targets = append(targets, reference.Target{
Addr: targetCtx.ParentAddress,
Name: targetCtx.FriendlyName,
ScopeId: targetCtx.ScopeId,
RangePtr: rangePtr,
DefRangePtr: targetCtx.ParentDefRangePtr,
NestedTargets: elemTargets,
LocalAddr: targetCtx.ParentLocalAddress,
TargetableFromRangePtr: targetCtx.TargetableFromRangePtr,
})
}
} else {
// treat element targets as 1st class ones
// if the list itself isn't targetable
targets = elemTargets
}

return targets
Expand Down
Loading