Blame vendor/github.com/gobwas/glob/syntax/ast/ast.go
|
Packit |
63bb0d |
package ast
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
import (
|
|
Packit |
63bb0d |
"bytes"
|
|
Packit |
63bb0d |
"fmt"
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type Node struct {
|
|
Packit |
63bb0d |
Parent *Node
|
|
Packit |
63bb0d |
Children []*Node
|
|
Packit |
63bb0d |
Value interface{}
|
|
Packit |
63bb0d |
Kind Kind
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func NewNode(k Kind, v interface{}, ch ...*Node) *Node {
|
|
Packit |
63bb0d |
n := &Node{
|
|
Packit |
63bb0d |
Kind: k,
|
|
Packit |
63bb0d |
Value: v,
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
for _, c := range ch {
|
|
Packit |
63bb0d |
Insert(n, c)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return n
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (a *Node) Equal(b *Node) bool {
|
|
Packit |
63bb0d |
if a.Kind != b.Kind {
|
|
Packit |
63bb0d |
return false
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
if a.Value != b.Value {
|
|
Packit |
63bb0d |
return false
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
if len(a.Children) != len(b.Children) {
|
|
Packit |
63bb0d |
return false
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
for i, c := range a.Children {
|
|
Packit |
63bb0d |
if !c.Equal(b.Children[i]) {
|
|
Packit |
63bb0d |
return false
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return true
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (a *Node) String() string {
|
|
Packit |
63bb0d |
var buf bytes.Buffer
|
|
Packit |
63bb0d |
buf.WriteString(a.Kind.String())
|
|
Packit |
63bb0d |
if a.Value != nil {
|
|
Packit |
63bb0d |
buf.WriteString(" =")
|
|
Packit |
63bb0d |
buf.WriteString(fmt.Sprintf("%v", a.Value))
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
if len(a.Children) > 0 {
|
|
Packit |
63bb0d |
buf.WriteString(" [")
|
|
Packit |
63bb0d |
for i, c := range a.Children {
|
|
Packit |
63bb0d |
if i > 0 {
|
|
Packit |
63bb0d |
buf.WriteString(", ")
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
buf.WriteString(c.String())
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
buf.WriteString("]")
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return buf.String()
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func Insert(parent *Node, children ...*Node) {
|
|
Packit |
63bb0d |
parent.Children = append(parent.Children, children...)
|
|
Packit |
63bb0d |
for _, ch := range children {
|
|
Packit |
63bb0d |
ch.Parent = parent
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type List struct {
|
|
Packit |
63bb0d |
Not bool
|
|
Packit |
63bb0d |
Chars string
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type Range struct {
|
|
Packit |
63bb0d |
Not bool
|
|
Packit |
63bb0d |
Lo, Hi rune
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type Text struct {
|
|
Packit |
63bb0d |
Text string
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type Kind int
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
const (
|
|
Packit |
63bb0d |
KindNothing Kind = iota
|
|
Packit |
63bb0d |
KindPattern
|
|
Packit |
63bb0d |
KindList
|
|
Packit |
63bb0d |
KindRange
|
|
Packit |
63bb0d |
KindText
|
|
Packit |
63bb0d |
KindAny
|
|
Packit |
63bb0d |
KindSuper
|
|
Packit |
63bb0d |
KindSingle
|
|
Packit |
63bb0d |
KindAnyOf
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (k Kind) String() string {
|
|
Packit |
63bb0d |
switch k {
|
|
Packit |
63bb0d |
case KindNothing:
|
|
Packit |
63bb0d |
return "Nothing"
|
|
Packit |
63bb0d |
case KindPattern:
|
|
Packit |
63bb0d |
return "Pattern"
|
|
Packit |
63bb0d |
case KindList:
|
|
Packit |
63bb0d |
return "List"
|
|
Packit |
63bb0d |
case KindRange:
|
|
Packit |
63bb0d |
return "Range"
|
|
Packit |
63bb0d |
case KindText:
|
|
Packit |
63bb0d |
return "Text"
|
|
Packit |
63bb0d |
case KindAny:
|
|
Packit |
63bb0d |
return "Any"
|
|
Packit |
63bb0d |
case KindSuper:
|
|
Packit |
63bb0d |
return "Super"
|
|
Packit |
63bb0d |
case KindSingle:
|
|
Packit |
63bb0d |
return "Single"
|
|
Packit |
63bb0d |
case KindAnyOf:
|
|
Packit |
63bb0d |
return "AnyOf"
|
|
Packit |
63bb0d |
default:
|
|
Packit |
63bb0d |
return ""
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|