hclwrite: Suspend indentation adjustment inside heredocs
Leading whitespace is significant in heredocs, so we'll avoid making any indentation adjustments for lines between OHeredoc and CHeredoc. This fixes #31.
This commit is contained in:
parent
002296d7bb
commit
4c4fdbdcc0
@ -54,14 +54,22 @@ func formatIndent(lines []formatLine) {
|
|||||||
// which should be more than enough for reasonable HCL uses.
|
// which should be more than enough for reasonable HCL uses.
|
||||||
indents := make([]int, 0, 10)
|
indents := make([]int, 0, 10)
|
||||||
|
|
||||||
|
inHeredoc := false
|
||||||
for i := range lines {
|
for i := range lines {
|
||||||
// TODO: need to track when we're inside a multi-line template and
|
|
||||||
// suspend indentation processing.
|
|
||||||
|
|
||||||
line := &lines[i]
|
line := &lines[i]
|
||||||
if len(line.lead) == 0 {
|
if len(line.lead) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if inHeredoc {
|
||||||
|
for _, token := range line.lead {
|
||||||
|
if token.Type == hclsyntax.TokenCHeredoc {
|
||||||
|
inHeredoc = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue // don't touch indentation inside heredocs
|
||||||
|
}
|
||||||
|
|
||||||
if line.lead[0].Type == hclsyntax.TokenNewline {
|
if line.lead[0].Type == hclsyntax.TokenNewline {
|
||||||
// Never place spaces before a newline
|
// Never place spaces before a newline
|
||||||
line.lead[0].SpacesBefore = 0
|
line.lead[0].SpacesBefore = 0
|
||||||
@ -74,6 +82,9 @@ func formatIndent(lines []formatLine) {
|
|||||||
}
|
}
|
||||||
for _, token := range line.assign {
|
for _, token := range line.assign {
|
||||||
netBrackets += tokenBracketChange(token)
|
netBrackets += tokenBracketChange(token)
|
||||||
|
if token.Type == hclsyntax.TokenOHeredoc {
|
||||||
|
inHeredoc = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
@ -309,6 +320,15 @@ func spaceAfterToken(subject, before, after *Token) bool {
|
|||||||
// Never spaces before colons
|
// Never spaces before colons
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
// In the unlikely event that an interpolation expression is just
|
||||||
|
// a single object constructor, we'll put a space between the ${ and
|
||||||
|
// the following { to make this more obvious, and then the same
|
||||||
|
// thing for the two braces at the end.
|
||||||
|
case (subject.Type == hclsyntax.TokenTemplateInterp || subject.Type == hclsyntax.TokenTemplateControl) && after.Type == hclsyntax.TokenOBrace:
|
||||||
|
return true
|
||||||
|
case subject.Type == hclsyntax.TokenCBrace && after.Type == hclsyntax.TokenTemplateSeqEnd:
|
||||||
|
return true
|
||||||
|
|
||||||
case tokenBracketChange(subject) > 0:
|
case tokenBracketChange(subject) > 0:
|
||||||
// No spaces after open brackets
|
// No spaces after open brackets
|
||||||
return false
|
return false
|
||||||
@ -371,6 +391,7 @@ func linesForFormat(tokens Tokens) []formatLine {
|
|||||||
|
|
||||||
// Now we'll pick off any trailing comments and attribute assignments
|
// Now we'll pick off any trailing comments and attribute assignments
|
||||||
// to shuffle off into the "comment" and "assign" cells.
|
// to shuffle off into the "comment" and "assign" cells.
|
||||||
|
inHeredoc := false
|
||||||
for i := range lines {
|
for i := range lines {
|
||||||
line := &lines[i]
|
line := &lines[i]
|
||||||
if len(line.lead) == 0 {
|
if len(line.lead) == 0 {
|
||||||
@ -380,6 +401,26 @@ func linesForFormat(tokens Tokens) []formatLine {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if inHeredoc {
|
||||||
|
for _, tok := range line.lead {
|
||||||
|
if tok.Type == hclsyntax.TokenCHeredoc {
|
||||||
|
inHeredoc = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Inside a heredoc everything is "lead", even if there's a
|
||||||
|
// template interpolation embedded in there that might otherwise
|
||||||
|
// confuse our logic below.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tok := range line.lead {
|
||||||
|
if tok.Type == hclsyntax.TokenOHeredoc {
|
||||||
|
inHeredoc = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if len(line.lead) > 1 && line.lead[len(line.lead)-1].Type == hclsyntax.TokenComment {
|
if len(line.lead) > 1 && line.lead[len(line.lead)-1].Type == hclsyntax.TokenComment {
|
||||||
line.comment = line.lead[len(line.lead)-1:]
|
line.comment = line.lead[len(line.lead)-1:]
|
||||||
line.lead = line.lead[:len(line.lead)-1]
|
line.lead = line.lead[:len(line.lead)-1]
|
||||||
|
@ -416,6 +416,86 @@ foo {
|
|||||||
# ...
|
# ...
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
`
|
||||||
|
foo {
|
||||||
|
bar = <<EOT
|
||||||
|
Foo bar baz
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
`
|
||||||
|
foo {
|
||||||
|
bar = <<EOT
|
||||||
|
Foo bar baz
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
`
|
||||||
|
foo {
|
||||||
|
bar = <<-EOT
|
||||||
|
Foo bar baz
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
`
|
||||||
|
foo {
|
||||||
|
bar = <<-EOT
|
||||||
|
Foo bar baz
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
`
|
||||||
|
foo {
|
||||||
|
bar = <<-EOT
|
||||||
|
Foo bar baz
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
`
|
||||||
|
foo {
|
||||||
|
bar = <<-EOT
|
||||||
|
Foo bar baz
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
`
|
||||||
|
foo {
|
||||||
|
bar = <<-EOT
|
||||||
|
blahblahblah = x
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
`
|
||||||
|
foo {
|
||||||
|
bar = <<-EOT
|
||||||
|
blahblahblah = x
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
`
|
||||||
|
foo {
|
||||||
|
bar = <<-EOT
|
||||||
|
${{ blahblahblah = x }}
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
`
|
||||||
|
foo {
|
||||||
|
bar = <<-EOT
|
||||||
|
${ { blahblahblah = x } }
|
||||||
|
EOT
|
||||||
|
}
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user