d754d5a269
Although our underlying parse tree retains all of the token content, it doesn't necessarily retain all of the spacing information under editing, and so formatting on save ensures that we'll produce a canonical result even if some edits have been applied that have changed the expected alignment of objects, etc.
111 lines
1.9 KiB
Go
111 lines
1.9 KiB
Go
package hclwrite
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
)
|
|
|
|
type File struct {
|
|
inTree
|
|
|
|
srcBytes []byte
|
|
body *node
|
|
}
|
|
|
|
// Body returns the root body of the file, which contains the top-level
|
|
// attributes and blocks.
|
|
func (f *File) Body() *Body {
|
|
return f.body.content.(*Body)
|
|
}
|
|
|
|
// WriteTo writes the tokens underlying the receiving file to the given writer.
|
|
//
|
|
// The tokens first have a simple formatting pass applied that adjusts only
|
|
// the spaces between them.
|
|
func (f *File) WriteTo(wr io.Writer) (int, error) {
|
|
tokens := f.inTree.children.BuildTokens(nil)
|
|
format(tokens)
|
|
return tokens.WriteTo(wr)
|
|
}
|
|
|
|
// Bytes returns a buffer containing the source code resulting from the
|
|
// tokens underlying the receiving file. If any updates have been made via
|
|
// the AST API, these will be reflected in the result.
|
|
func (f *File) Bytes() []byte {
|
|
buf := &bytes.Buffer{}
|
|
f.WriteTo(buf)
|
|
return buf.Bytes()
|
|
}
|
|
|
|
type comments struct {
|
|
leafNode
|
|
|
|
parent *node
|
|
tokens Tokens
|
|
}
|
|
|
|
func newComments(tokens Tokens) *comments {
|
|
return &comments{
|
|
tokens: tokens,
|
|
}
|
|
}
|
|
|
|
func (c *comments) BuildTokens(to Tokens) Tokens {
|
|
return c.tokens.BuildTokens(to)
|
|
}
|
|
|
|
type identifier struct {
|
|
leafNode
|
|
|
|
parent *node
|
|
token *Token
|
|
}
|
|
|
|
func newIdentifier(token *Token) *identifier {
|
|
return &identifier{
|
|
token: token,
|
|
}
|
|
}
|
|
|
|
func (i *identifier) BuildTokens(to Tokens) Tokens {
|
|
return append(to, i.token)
|
|
}
|
|
|
|
func (i *identifier) hasName(name string) bool {
|
|
return name == string(i.token.Bytes)
|
|
}
|
|
|
|
type number struct {
|
|
leafNode
|
|
|
|
parent *node
|
|
token *Token
|
|
}
|
|
|
|
func newNumber(token *Token) *number {
|
|
return &number{
|
|
token: token,
|
|
}
|
|
}
|
|
|
|
func (n *number) BuildTokens(to Tokens) Tokens {
|
|
return append(to, n.token)
|
|
}
|
|
|
|
type quoted struct {
|
|
leafNode
|
|
|
|
parent *node
|
|
tokens Tokens
|
|
}
|
|
|
|
func newQuoted(tokens Tokens) *quoted {
|
|
return "ed{
|
|
tokens: tokens,
|
|
}
|
|
}
|
|
|
|
func (q *quoted) BuildTokens(to Tokens) Tokens {
|
|
return q.tokens.BuildTokens(to)
|
|
}
|