Generic ast (#1829)

Remove dependency on yaml.Node for internal AST representation. Yaml decoder is now just another decoder.
This commit is contained in:
Mike Farah
2023-10-18 12:11:53 +11:00
committed by GitHub
parent 7430419413
commit 13d1bbb45f
171 changed files with 6402 additions and 2421 deletions
+16 -28
View File
@@ -7,8 +7,6 @@ import (
"strconv"
"strings"
"time"
yaml "gopkg.in/yaml.v3"
)
func sortOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) {
@@ -26,18 +24,15 @@ func sortByOperator(d *dataTreeNavigator, context Context, expressionNode *Expre
for el := context.MatchingNodes.Front(); el != nil; el = el.Next() {
candidate := el.Value.(*CandidateNode)
candidateNode := unwrapDoc(candidate.Node)
if candidateNode.Kind != yaml.SequenceNode {
return context, fmt.Errorf("node at path [%v] is not an array (it's a %v)", candidate.GetNicePath(), candidate.GetNiceTag())
if candidate.Kind != SequenceNode {
return context, fmt.Errorf("node at path [%v] is not an array (it's a %v)", candidate.GetNicePath(), candidate.Tag)
}
sortableArray := make(sortableNodeArray, len(candidateNode.Content))
sortableArray := make(sortableNodeArray, len(candidate.Content))
for i, originalNode := range candidateNode.Content {
for i, originalNode := range candidate.Content {
childCandidate := candidate.CreateChildInArray(i, originalNode)
compareContext, err := d.GetMatchingNodes(context.SingleReadonlyChildContext(childCandidate), expressionNode.RHS)
compareContext, err := d.GetMatchingNodes(context.SingleReadonlyChildContext(originalNode), expressionNode.RHS)
if err != nil {
return Context{}, err
}
@@ -48,19 +43,18 @@ func sortByOperator(d *dataTreeNavigator, context Context, expressionNode *Expre
sort.Stable(sortableArray)
sortedList := &yaml.Node{Kind: yaml.SequenceNode, Tag: "!!seq", Style: candidateNode.Style}
sortedList.Content = make([]*yaml.Node, len(candidateNode.Content))
sortedList := candidate.CreateReplacementWithComments(SequenceNode, "!!seq", candidate.Style)
for i, sortedNode := range sortableArray {
sortedList.Content[i] = sortedNode.Node
for _, sortedNode := range sortableArray {
sortedList.AddChild(sortedNode.Node)
}
results.PushBack(candidate.CreateReplacementWithDocWrappers(sortedList))
results.PushBack(sortedList)
}
return context.ChildContext(results), nil
}
type sortableNode struct {
Node *yaml.Node
Node *CandidateNode
CompareContext Context
dateTimeLayout string
}
@@ -79,7 +73,7 @@ func (a sortableNodeArray) Less(i, j int) bool {
lhs := lhsEl.Value.(*CandidateNode)
rhs := rhsEl.Value.(*CandidateNode)
result := a.compare(lhs.Node, rhs.Node, a[i].dateTimeLayout)
result := a.compare(lhs, rhs, a[i].dateTimeLayout)
if result < 0 {
return true
@@ -92,18 +86,18 @@ func (a sortableNodeArray) Less(i, j int) bool {
return false
}
func (a sortableNodeArray) compare(lhs *yaml.Node, rhs *yaml.Node, dateTimeLayout string) int {
func (a sortableNodeArray) compare(lhs *CandidateNode, rhs *CandidateNode, dateTimeLayout string) int {
lhsTag := lhs.Tag
rhsTag := rhs.Tag
if !strings.HasPrefix(lhsTag, "!!") {
// custom tag - we have to have a guess
lhsTag = guessTagFromCustomType(lhs)
lhsTag = lhs.guessTagFromCustomType()
}
if !strings.HasPrefix(rhsTag, "!!") {
// custom tag - we have to have a guess
rhsTag = guessTagFromCustomType(rhs)
rhsTag = rhs.guessTagFromCustomType()
}
isDateTime := lhsTag == "!!timestamp" && rhsTag == "!!timestamp"
@@ -124,15 +118,9 @@ func (a sortableNodeArray) compare(lhs *yaml.Node, rhs *yaml.Node, dateTimeLayou
} else if lhsTag != "!!bool" && rhsTag == "!!bool" {
return 1
} else if lhsTag == "!!bool" && rhsTag == "!!bool" {
lhsTruthy, err := isTruthyNode(lhs)
if err != nil {
panic(fmt.Errorf("could not parse %v as boolean: %w", lhs.Value, err))
}
lhsTruthy := isTruthyNode(lhs)
rhsTruthy, err := isTruthyNode(rhs)
if err != nil {
panic(fmt.Errorf("could not parse %v as boolean: %w", rhs.Value, err))
}
rhsTruthy := isTruthyNode(rhs)
if lhsTruthy == rhsTruthy {
return 0
} else if lhsTruthy {