diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go index 476ed04da..8dd73e0c3 100644 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go @@ -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 diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go b/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go index 5d2b74bdd..a73315979 100644 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go @@ -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++ { diff --git a/vendor/vendor.json b/vendor/vendor.json index 5e3519ba4..b9b1dee31 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -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=",