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 implementation of reference target collection #237

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
56 changes: 51 additions & 5 deletions decoder/expr_list_ref_targets.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/hashicorp/hcl-lang/lang"
"github.com/hashicorp/hcl-lang/reference"
"github.com/hashicorp/hcl-lang/schema"
"github.com/hashicorp/hcl/v2/hclsyntax"
"github.com/zclconf/go-cty/cty"
)
Expand All @@ -19,14 +20,18 @@ func (list List) ReferenceTargets(ctx context.Context, targetCtx *TargetContext)
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 {
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,49 @@ 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

// 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: list.expr.Range().Ptr(),
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: list.expr.Range().Ptr(),
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
36 changes: 34 additions & 2 deletions decoder/expr_set_ref_targets.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import (
"context"

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

func (set Set) ReferenceTargets(ctx context.Context, targetCtx *TargetContext) reference.Targets {
Expand All @@ -19,8 +21,38 @@ func (set Set) ReferenceTargets(ctx context.Context, targetCtx *TargetContext) r

targets := make(reference.Targets, 0)

// TODO: collect parent target for the whole set
// See https://github.com/hashicorp/hcl-lang/issues/228
if targetCtx != nil {
// collect target for the whole set

// type-aware
elemCons, ok := set.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.Set(elemType),
ScopeId: targetCtx.ScopeId,
RangePtr: set.expr.Range().Ptr(),
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: set.expr.Range().Ptr(),
LocalAddr: targetCtx.ParentLocalAddress,
TargetableFromRangePtr: targetCtx.TargetableFromRangePtr,
})
}
}

return targets
}
54 changes: 49 additions & 5 deletions decoder/expr_tuple_ref_targets.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,7 @@ func (tuple Tuple) ReferenceTargets(ctx context.Context, targetCtx *TargetContex
return reference.Targets{}
}

targets := make(reference.Targets, 0)

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

for i, elemExpr := range eType.Exprs {
if i+1 > len(tuple.cons.Elems) {
Expand All @@ -31,6 +28,13 @@ func (tuple Tuple) ReferenceTargets(ctx context.Context, targetCtx *TargetContex

expr := newExpression(tuple.pathCtx, elemExpr, tuple.cons.Elems[i])
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 @@ -40,8 +44,48 @@ func (tuple Tuple) ReferenceTargets(ctx context.Context, targetCtx *TargetContex
Key: cty.NumberIntVal(int64(i)),
})
}
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 tuple

// type-aware
elemType, ok := tuple.cons.ConstraintType()
if targetCtx.AsExprType && ok {
if ok {
targets = append(targets, reference.Target{
Addr: targetCtx.ParentAddress,
Name: targetCtx.FriendlyName,
Type: elemType,
ScopeId: targetCtx.ScopeId,
RangePtr: tuple.expr.Range().Ptr(),
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: tuple.expr.Range().Ptr(),
NestedTargets: elemTargets,
LocalAddr: targetCtx.ParentLocalAddress,
TargetableFromRangePtr: targetCtx.TargetableFromRangePtr,
})
}
} else {
// treat element targets as 1st class ones
// if the tuple itself isn't targetable
targets = elemTargets
}

return targets
Expand Down