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
}