diff --git a/hclsyntax/expression_template.go b/hclsyntax/expression_template.go index ff9a6e5..dfce942 100644 --- a/hclsyntax/expression_template.go +++ b/hclsyntax/expression_template.go @@ -152,6 +152,7 @@ func (e *TemplateJoinExpr) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnosti return cty.UnknownVal(cty.String), diags } + tuple, marks := tuple.Unmark() buf := &bytes.Buffer{} it := tuple.ElementIterator() for it.Next() { @@ -171,7 +172,7 @@ func (e *TemplateJoinExpr) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnosti continue } if val.Type() == cty.DynamicPseudoType { - return cty.UnknownVal(cty.String), diags + return cty.UnknownVal(cty.String).WithMarks(marks), diags } strVal, err := convert.Convert(val, cty.String) if err != nil { @@ -189,13 +190,13 @@ func (e *TemplateJoinExpr) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnosti continue } if !val.IsKnown() { - return cty.UnknownVal(cty.String), diags + return cty.UnknownVal(cty.String).WithMarks(marks), diags } buf.WriteString(strVal.AsString()) } - return cty.StringVal(buf.String()), diags + return cty.StringVal(buf.String()).WithMarks(marks), diags } func (e *TemplateJoinExpr) Range() hcl.Range { diff --git a/hclsyntax/expression_template_test.go b/hclsyntax/expression_template_test.go index c92157b..6219c50 100644 --- a/hclsyntax/expression_template_test.go +++ b/hclsyntax/expression_template_test.go @@ -316,6 +316,20 @@ trim`, cty.StringVal(`Authenticate with "my voice is my passport"`).WithMarks(cty.NewValueMarks("sensitive")), 0, }, + { // can loop over marked collections + `%{ for s in secrets }${s}%{ endfor }`, + &hcl.EvalContext{ + Variables: map[string]cty.Value{ + "secrets": cty.ListVal([]cty.Value{ + cty.StringVal("foo"), + cty.StringVal("bar"), + cty.StringVal("baz"), + }).Mark("sensitive"), + }, + }, + cty.StringVal("foobarbaz").Mark("sensitive"), + 0, + }, } for _, test := range tests {