parser: be more specific about keys and identifiers
This commit is contained in:
parent
62caacf06f
commit
17205f8484
@ -8,12 +8,13 @@ type Node interface {
|
|||||||
Pos() scanner.Pos
|
Pos() scanner.Pos
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ObjectList) node() {}
|
func (ObjectList) node() {}
|
||||||
func (ObjectItem) node() {}
|
func (ObjectItem) node() {}
|
||||||
|
func (ObjectKey) node() {}
|
||||||
|
|
||||||
func (ObjectType) node() {}
|
func (ObjectType) node() {}
|
||||||
func (LiteralType) node() {}
|
func (LiteralType) node() {}
|
||||||
func (ListType) node() {}
|
func (ListType) node() {}
|
||||||
func (Ident) node() {}
|
|
||||||
|
|
||||||
// ObjectList represents a list of ObjectItems. An HCL file itself is an
|
// ObjectList represents a list of ObjectItems. An HCL file itself is an
|
||||||
// ObjectList.
|
// ObjectList.
|
||||||
@ -33,11 +34,10 @@ func (o *ObjectList) Pos() scanner.Pos {
|
|||||||
// ObjectItem represents a HCL Object Item. An item is represented with a key
|
// ObjectItem represents a HCL Object Item. An item is represented with a key
|
||||||
// (or keys). It can be an assignment or an object (both normal and nested)
|
// (or keys). It can be an assignment or an object (both normal and nested)
|
||||||
type ObjectItem struct {
|
type ObjectItem struct {
|
||||||
// key is either an Identifier or a String. The slice is only one lenght
|
// keys is only one lenght long if it's of type assignment. If it's a
|
||||||
// long, however if it's a nested object it'll can be larger than one. In
|
// nested object it can be larger than one. In that case "assign" is
|
||||||
// that case "assign" is invalid as there is no assignments for a nested
|
// invalid as there is no assignments for a nested object.
|
||||||
// object.
|
keys []*ObjectKey
|
||||||
key []Ident
|
|
||||||
|
|
||||||
// assign contains the position of "=", if any
|
// assign contains the position of "=", if any
|
||||||
assign scanner.Pos
|
assign scanner.Pos
|
||||||
@ -49,16 +49,25 @@ type ObjectItem struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (o *ObjectItem) Pos() scanner.Pos {
|
func (o *ObjectItem) Pos() scanner.Pos {
|
||||||
return o.key[0].Pos()
|
return o.keys[0].Pos()
|
||||||
}
|
}
|
||||||
|
|
||||||
// IdentStatement represents an identifier.
|
// ObjectKeys are either an identifier or of type string.
|
||||||
type Ident struct {
|
type ObjectKey struct {
|
||||||
token scanner.Token
|
token scanner.Token
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *Ident) Pos() scanner.Pos {
|
func (o *ObjectKey) Pos() scanner.Pos {
|
||||||
return i.token.Pos
|
return o.token.Pos
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *ObjectKey) IsValid() bool {
|
||||||
|
switch o.token.Type {
|
||||||
|
case scanner.IDENT, scanner.STRING:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// LiteralType represents a literal of basic type. Valid types are:
|
// LiteralType represents a literal of basic type. Valid types are:
|
||||||
|
@ -47,6 +47,7 @@ func (p *Parser) Parse() (Node, error) {
|
|||||||
return node, nil
|
return node, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseObjectItem parses a single object item
|
||||||
func (p *Parser) parseObjectItem() (*ObjectItem, error) {
|
func (p *Parser) parseObjectItem() (*ObjectItem, error) {
|
||||||
defer un(trace(p, "ParseObjectItem"))
|
defer un(trace(p, "ParseObjectItem"))
|
||||||
|
|
||||||
@ -69,15 +70,6 @@ func (p *Parser) parseObjectItem() (*ObjectItem, error) {
|
|||||||
return nil, fmt.Errorf("not yet implemented: %s", tok.Type)
|
return nil, fmt.Errorf("not yet implemented: %s", tok.Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseIdent parses a generic identifier and returns a Ident AST
|
|
||||||
func (p *Parser) parseIdent() (*Ident, error) {
|
|
||||||
defer un(trace(p, "ParseIdent"))
|
|
||||||
|
|
||||||
return &Ident{
|
|
||||||
token: p.tok,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// parseLiteralType parses a literal type and returns a LiteralType AST
|
// parseLiteralType parses a literal type and returns a LiteralType AST
|
||||||
func (p *Parser) parseLiteralType() (*LiteralType, error) {
|
func (p *Parser) parseLiteralType() (*LiteralType, error) {
|
||||||
defer un(trace(p, "ParseLiteral"))
|
defer un(trace(p, "ParseLiteral"))
|
||||||
|
Loading…
Reference in New Issue
Block a user