Merge pull request #11396 from hashicorp/b-update-hcl
vendor update HCL
This commit is contained in:
commit
a74dab836c
|
@ -346,7 +346,7 @@ func (p *Parser) listType() (*ast.ListType, error) {
|
|||
}
|
||||
}
|
||||
switch tok.Type {
|
||||
case token.NUMBER, token.FLOAT, token.STRING, token.HEREDOC:
|
||||
case token.BOOL, token.NUMBER, token.FLOAT, token.STRING, token.HEREDOC:
|
||||
node, err := p.literalType()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -388,8 +388,6 @@ func (p *Parser) listType() (*ast.ListType, error) {
|
|||
}
|
||||
l.Add(node)
|
||||
needComma = true
|
||||
case token.BOOL:
|
||||
// TODO(arslan) should we support? not supported by HCL yet
|
||||
case token.LBRACK:
|
||||
// TODO(arslan) should we support nested lists? Even though it's
|
||||
// written in README of HCL, it's not a part of the grammar
|
||||
|
|
|
@ -171,7 +171,15 @@ func (p *printer) output(n interface{}) []byte {
|
|||
|
||||
buf.Write(p.output(t.Items[index]))
|
||||
if index != len(t.Items)-1 {
|
||||
buf.Write([]byte{newline, newline})
|
||||
// Always write a newline to separate us from the next item
|
||||
buf.WriteByte(newline)
|
||||
|
||||
// If the next item is an object that is exactly one line,
|
||||
// then we don't output another newline.
|
||||
next := t.Items[index+1]
|
||||
if next.Pos().Line != t.Items[index].Pos().Line+1 || !p.isSingleLineObject(next) {
|
||||
buf.WriteByte(newline)
|
||||
}
|
||||
}
|
||||
index++
|
||||
}
|
||||
|
@ -263,17 +271,24 @@ func (p *printer) objectType(o *ast.ObjectType) []byte {
|
|||
var nextItem token.Pos
|
||||
var commented, newlinePrinted bool
|
||||
for {
|
||||
// Determine the location of the next actual non-comment
|
||||
// item. If we're at the end, the next item is the closing brace
|
||||
if index != len(o.List.Items) {
|
||||
nextItem = o.List.Items[index].Pos()
|
||||
} else {
|
||||
nextItem = o.Rbrace
|
||||
}
|
||||
|
||||
// Print stand alone comments
|
||||
// Go through the standalone comments in the file and print out
|
||||
// the comments that we should be for this object item.
|
||||
for _, c := range p.standaloneComments {
|
||||
printed := false
|
||||
var lastCommentPos token.Pos
|
||||
for _, comment := range c.List {
|
||||
// if we hit the end, last item should be the brace
|
||||
if index != len(o.List.Items) {
|
||||
nextItem = o.List.Items[index].Pos()
|
||||
} else {
|
||||
nextItem = o.Rbrace
|
||||
}
|
||||
|
||||
// We only care about comments after the previous item
|
||||
// we've printed so that comments are printed in the
|
||||
// correct locations (between two objects for example).
|
||||
// And before the next item.
|
||||
if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) {
|
||||
// If there are standalone comments and the initial newline has not
|
||||
// been printed yet, do it now.
|
||||
|
@ -288,11 +303,33 @@ func (p *printer) objectType(o *ast.ObjectType) []byte {
|
|||
buf.WriteByte(newline)
|
||||
}
|
||||
|
||||
// Store this position
|
||||
lastCommentPos = comment.Pos()
|
||||
|
||||
// output the comment itself
|
||||
buf.Write(p.indent(p.heredocIndent([]byte(comment.Text))))
|
||||
|
||||
// Set printed to true to note that we printed something
|
||||
printed = true
|
||||
|
||||
/*
|
||||
if index != len(o.List.Items) {
|
||||
buf.WriteByte(newline) // do not print on the end
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
// Stuff to do if we had comments
|
||||
if printed {
|
||||
// Always write a newline
|
||||
buf.WriteByte(newline)
|
||||
|
||||
// If there is another item in the object and our comment
|
||||
// didn't hug it directly, then make sure there is a blank
|
||||
// line separating them.
|
||||
if nextItem != o.Rbrace && nextItem.Line != lastCommentPos.Line+1 {
|
||||
buf.WriteByte(newline)
|
||||
if index != len(o.List.Items) {
|
||||
buf.WriteByte(newline) // do not print on the end
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -474,6 +511,13 @@ func (p *printer) list(l *ast.ListType) []byte {
|
|||
insertSpaceBeforeItem := false
|
||||
lastHadLeadComment := false
|
||||
for i, item := range l.List {
|
||||
// Keep track of whether this item is a heredoc since that has
|
||||
// unique behavior.
|
||||
heredoc := false
|
||||
if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC {
|
||||
heredoc = true
|
||||
}
|
||||
|
||||
if item.Pos().Line != l.Lbrack.Line {
|
||||
// multiline list, add newline before we add each item
|
||||
buf.WriteByte(newline)
|
||||
|
@ -507,7 +551,7 @@ func (p *printer) list(l *ast.ListType) []byte {
|
|||
// if this item is a heredoc, then we output the comma on
|
||||
// the next line. This is the only case this happens.
|
||||
comma := []byte{','}
|
||||
if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC {
|
||||
if heredoc {
|
||||
buf.WriteByte(newline)
|
||||
comma = p.indent(comma)
|
||||
}
|
||||
|
@ -541,11 +585,36 @@ func (p *printer) list(l *ast.ListType) []byte {
|
|||
buf.WriteByte(blank)
|
||||
insertSpaceBeforeItem = false
|
||||
}
|
||||
buf.Write(p.output(item))
|
||||
|
||||
// Output the item itself
|
||||
// also indent each line
|
||||
val := p.output(item)
|
||||
curLen := len(val)
|
||||
buf.Write(val)
|
||||
|
||||
// If this is a heredoc item we always have to output a newline
|
||||
// so that it parses properly.
|
||||
if heredoc {
|
||||
buf.WriteByte(newline)
|
||||
}
|
||||
|
||||
// If this isn't the last element, write a comma.
|
||||
if i != len(l.List)-1 {
|
||||
buf.WriteString(",")
|
||||
insertSpaceBeforeItem = true
|
||||
}
|
||||
|
||||
if lit, ok := item.(*ast.LiteralType); ok && lit.LineComment != nil {
|
||||
// if the next item doesn't have any comments, do not align
|
||||
buf.WriteByte(blank) // align one space
|
||||
for i := 0; i < longestLine-curLen; i++ {
|
||||
buf.WriteByte(blank)
|
||||
}
|
||||
|
||||
for _, comment := range lit.LineComment.List {
|
||||
buf.WriteString(comment.Text)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -622,6 +691,36 @@ func (p *printer) heredocIndent(buf []byte) []byte {
|
|||
return res
|
||||
}
|
||||
|
||||
// isSingleLineObject tells whether the given object item is a single
|
||||
// line object such as "obj {}".
|
||||
//
|
||||
// A single line object:
|
||||
//
|
||||
// * has no lead comments (hence multi-line)
|
||||
// * has no assignment
|
||||
// * has no values in the stanza (within {})
|
||||
//
|
||||
func (p *printer) isSingleLineObject(val *ast.ObjectItem) bool {
|
||||
// If there is a lead comment, can't be one line
|
||||
if val.LeadComment != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
// If there is assignment, we always break by line
|
||||
if val.Assign.IsValid() {
|
||||
return false
|
||||
}
|
||||
|
||||
// If it isn't an object type, then its not a single line object
|
||||
ot, ok := val.Val.(*ast.ObjectType)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
// If the object has no items, it is single line!
|
||||
return len(ot.List.Items) == 0
|
||||
}
|
||||
|
||||
func lines(txt string) int {
|
||||
endline := 1
|
||||
for i := 0; i < len(txt); i++ {
|
||||
|
|
|
@ -1711,68 +1711,68 @@
|
|||
{
|
||||
"checksumSHA1": "Ok3Csn6Voou7pQT6Dv2mkwpqFtw=",
|
||||
"path": "github.com/hashicorp/hcl",
|
||||
"revision": "eb6f65b2d77ed5078887f960ff570fbddbbeb49d",
|
||||
"revisionTime": "2017-01-09T00:25:15Z"
|
||||
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
|
||||
"revisionTime": "2017-01-25T01:06:35Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "XQmjDva9JCGGkIecOgwtBEMCJhU=",
|
||||
"path": "github.com/hashicorp/hcl/hcl/ast",
|
||||
"revision": "eb6f65b2d77ed5078887f960ff570fbddbbeb49d",
|
||||
"revisionTime": "2017-01-09T00:25:15Z"
|
||||
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
|
||||
"revisionTime": "2017-01-25T01:06:35Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "DaQmLi48oUAwctWcX6A6DNN61UY=",
|
||||
"path": "github.com/hashicorp/hcl/hcl/fmtcmd",
|
||||
"revision": "eb6f65b2d77ed5078887f960ff570fbddbbeb49d",
|
||||
"revisionTime": "2017-01-09T00:25:15Z"
|
||||
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
|
||||
"revisionTime": "2017-01-25T01:06:35Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "vF6LLywGDoAaccTcAGrcY7mYvZc=",
|
||||
"checksumSHA1": "MPz4qnNmoYHHUXDhHj0TpJk4LHk=",
|
||||
"path": "github.com/hashicorp/hcl/hcl/parser",
|
||||
"revision": "eb6f65b2d77ed5078887f960ff570fbddbbeb49d",
|
||||
"revisionTime": "2017-01-09T00:25:15Z"
|
||||
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
|
||||
"revisionTime": "2017-01-25T01:06:35Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "K1gXmpTINkcQEh4tBjzq9UeKy/U=",
|
||||
"checksumSHA1": "J5zAZ+tMBDPRJ8A07742Pl/c++w=",
|
||||
"path": "github.com/hashicorp/hcl/hcl/printer",
|
||||
"revision": "eb6f65b2d77ed5078887f960ff570fbddbbeb49d",
|
||||
"revisionTime": "2017-01-09T00:25:15Z"
|
||||
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
|
||||
"revisionTime": "2017-01-25T01:06:35Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "z6wdP4mRw4GVjShkNHDaOWkbxS0=",
|
||||
"path": "github.com/hashicorp/hcl/hcl/scanner",
|
||||
"revision": "eb6f65b2d77ed5078887f960ff570fbddbbeb49d",
|
||||
"revisionTime": "2017-01-09T00:25:15Z"
|
||||
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
|
||||
"revisionTime": "2017-01-25T01:06:35Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "oS3SCN9Wd6D8/LG0Yx1fu84a7gI=",
|
||||
"path": "github.com/hashicorp/hcl/hcl/strconv",
|
||||
"revision": "eb6f65b2d77ed5078887f960ff570fbddbbeb49d",
|
||||
"revisionTime": "2017-01-09T00:25:15Z"
|
||||
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
|
||||
"revisionTime": "2017-01-25T01:06:35Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "c6yprzj06ASwCo18TtbbNNBHljA=",
|
||||
"path": "github.com/hashicorp/hcl/hcl/token",
|
||||
"revision": "eb6f65b2d77ed5078887f960ff570fbddbbeb49d",
|
||||
"revisionTime": "2017-01-09T00:25:15Z"
|
||||
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
|
||||
"revisionTime": "2017-01-25T01:06:35Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "138aCV5n8n7tkGYMsMVQQnnLq+0=",
|
||||
"path": "github.com/hashicorp/hcl/json/parser",
|
||||
"revision": "eb6f65b2d77ed5078887f960ff570fbddbbeb49d",
|
||||
"revisionTime": "2017-01-09T00:25:15Z"
|
||||
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
|
||||
"revisionTime": "2017-01-25T01:06:35Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "YdvFsNOMSWMLnY6fcliWQa0O5Fw=",
|
||||
"path": "github.com/hashicorp/hcl/json/scanner",
|
||||
"revision": "eb6f65b2d77ed5078887f960ff570fbddbbeb49d",
|
||||
"revisionTime": "2017-01-09T00:25:15Z"
|
||||
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
|
||||
"revisionTime": "2017-01-25T01:06:35Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "fNlXQCQEnb+B3k5UDL/r15xtSJY=",
|
||||
"path": "github.com/hashicorp/hcl/json/token",
|
||||
"revision": "eb6f65b2d77ed5078887f960ff570fbddbbeb49d",
|
||||
"revisionTime": "2017-01-09T00:25:15Z"
|
||||
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
|
||||
"revisionTime": "2017-01-25T01:06:35Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "2Nrl/YKrmowkRgCDLhA6UTFgYEY=",
|
||||
|
|
Loading…
Reference in New Issue