Tidy up divide/modulo operator node creation

This commit is contained in:
TJ Miller 2023-03-09 16:59:19 -08:00
parent c0fd3fe38b
commit b499322914
2 changed files with 24 additions and 30 deletions

View File

@ -14,10 +14,6 @@ func createDivideOp(lhs *ExpressionNode, rhs *ExpressionNode) *ExpressionNode {
RHS: rhs} RHS: rhs}
} }
// func divideAssignOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) {
// return compoundAssignFunction(d, context, expressionNode, createDivideOp)
// }
func divideOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) { func divideOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) {
log.Debugf("Divide operator") log.Debugf("Divide operator")
@ -34,9 +30,7 @@ func divide(d *dataTreeNavigator, context Context, lhs *CandidateNode, rhs *Cand
return nil, fmt.Errorf("%v (%v) cannot be divided by %v (%v)", lhsNode.Tag, lhs.GetNicePath(), rhs.Node.Tag, rhs.GetNicePath()) return nil, fmt.Errorf("%v (%v) cannot be divided by %v (%v)", lhsNode.Tag, lhs.GetNicePath(), rhs.Node.Tag, rhs.GetNicePath())
} }
target := lhs.CreateReplacement(&yaml.Node{ target := &yaml.Node{}
Anchor: lhs.Node.Anchor,
})
if lhsNode.Kind == yaml.ScalarNode && rhs.Node.Kind == yaml.ScalarNode { if lhsNode.Kind == yaml.ScalarNode && rhs.Node.Kind == yaml.ScalarNode {
if err := divideScalars(context, target, lhsNode, rhs.Node); err != nil { if err := divideScalars(context, target, lhsNode, rhs.Node); err != nil {
@ -46,10 +40,10 @@ func divide(d *dataTreeNavigator, context Context, lhs *CandidateNode, rhs *Cand
return nil, fmt.Errorf("%v (%v) cannot be divided by %v (%v)", lhsNode.Tag, lhs.GetNicePath(), rhs.Node.Tag, rhs.GetNicePath()) return nil, fmt.Errorf("%v (%v) cannot be divided by %v (%v)", lhsNode.Tag, lhs.GetNicePath(), rhs.Node.Tag, rhs.GetNicePath())
} }
return target, nil return lhs.CreateReplacement(target), nil
} }
func divideScalars(context Context, target *CandidateNode, lhs *yaml.Node, rhs *yaml.Node) error { func divideScalars(context Context, target *yaml.Node, lhs *yaml.Node, rhs *yaml.Node) error {
lhsTag := lhs.Tag lhsTag := lhs.Tag
rhsTag := guessTagFromCustomType(rhs) rhsTag := guessTagFromCustomType(rhs)
lhsIsCustom := false lhsIsCustom := false
@ -60,11 +54,13 @@ func divideScalars(context Context, target *CandidateNode, lhs *yaml.Node, rhs *
} }
if lhsTag == "!!str" && rhsTag == "!!str" { if lhsTag == "!!str" && rhsTag == "!!str" {
target.Node = split(lhs.Value, rhs.Value) res := split(lhs.Value, rhs.Value)
target.Node.Anchor = lhs.Anchor target.Kind = res.Kind
target.Tag = res.Tag
target.Content = res.Content
} else if (lhsTag == "!!int" || lhsTag == "!!float") && (rhsTag == "!!int" || rhsTag == "!!float") { } else if (lhsTag == "!!int" || lhsTag == "!!float") && (rhsTag == "!!int" || rhsTag == "!!float") {
target.Node.Kind = yaml.ScalarNode target.Kind = yaml.ScalarNode
target.Node.Style = lhs.Style target.Style = lhs.Style
lhsNum, err := strconv.ParseFloat(lhs.Value, 64) lhsNum, err := strconv.ParseFloat(lhs.Value, 64)
if err != nil { if err != nil {
@ -76,11 +72,11 @@ func divideScalars(context Context, target *CandidateNode, lhs *yaml.Node, rhs *
} }
quotient := lhsNum / rhsNum quotient := lhsNum / rhsNum
if lhsIsCustom { if lhsIsCustom {
target.Node.Tag = lhs.Tag target.Tag = lhs.Tag
} else { } else {
target.Node.Tag = "!!float" target.Tag = "!!float"
} }
target.Node.Value = fmt.Sprintf("%v", quotient) target.Value = fmt.Sprintf("%v", quotient)
} else { } else {
return fmt.Errorf("%v cannot be divided by %v", lhsTag, rhsTag) return fmt.Errorf("%v cannot be divided by %v", lhsTag, rhsTag)
} }

View File

@ -31,9 +31,7 @@ func modulo(d *dataTreeNavigator, context Context, lhs *CandidateNode, rhs *Cand
return nil, fmt.Errorf("%v (%v) cannot modulo by %v (%v)", lhsNode.Tag, lhs.GetNicePath(), rhs.Node.Tag, rhs.GetNicePath()) return nil, fmt.Errorf("%v (%v) cannot modulo by %v (%v)", lhsNode.Tag, lhs.GetNicePath(), rhs.Node.Tag, rhs.GetNicePath())
} }
target := lhs.CreateReplacement(&yaml.Node{ target := &yaml.Node{}
Anchor: lhs.Node.Anchor,
})
if lhsNode.Kind == yaml.ScalarNode && rhs.Node.Kind == yaml.ScalarNode { if lhsNode.Kind == yaml.ScalarNode && rhs.Node.Kind == yaml.ScalarNode {
if err := moduloScalars(context, target, lhsNode, rhs.Node); err != nil { if err := moduloScalars(context, target, lhsNode, rhs.Node); err != nil {
@ -43,10 +41,10 @@ func modulo(d *dataTreeNavigator, context Context, lhs *CandidateNode, rhs *Cand
return nil, fmt.Errorf("%v (%v) cannot modulo by %v (%v)", lhsNode.Tag, lhs.GetNicePath(), rhs.Node.Tag, rhs.GetNicePath()) return nil, fmt.Errorf("%v (%v) cannot modulo by %v (%v)", lhsNode.Tag, lhs.GetNicePath(), rhs.Node.Tag, rhs.GetNicePath())
} }
return target, nil return lhs.CreateReplacement(target), nil
} }
func moduloScalars(context Context, target *CandidateNode, lhs *yaml.Node, rhs *yaml.Node) error { func moduloScalars(context Context, target *yaml.Node, lhs *yaml.Node, rhs *yaml.Node) error {
lhsTag := lhs.Tag lhsTag := lhs.Tag
rhsTag := guessTagFromCustomType(rhs) rhsTag := guessTagFromCustomType(rhs)
lhsIsCustom := false lhsIsCustom := false
@ -57,8 +55,8 @@ func moduloScalars(context Context, target *CandidateNode, lhs *yaml.Node, rhs *
} }
if lhsTag == "!!int" && rhsTag == "!!int" { if lhsTag == "!!int" && rhsTag == "!!int" {
target.Node.Kind = yaml.ScalarNode target.Kind = yaml.ScalarNode
target.Node.Style = lhs.Style target.Style = lhs.Style
format, lhsNum, err := parseInt64(lhs.Value) format, lhsNum, err := parseInt64(lhs.Value)
if err != nil { if err != nil {
@ -73,11 +71,11 @@ func moduloScalars(context Context, target *CandidateNode, lhs *yaml.Node, rhs *
} }
remainder := lhsNum % rhsNum remainder := lhsNum % rhsNum
target.Node.Tag = lhs.Tag target.Tag = lhs.Tag
target.Node.Value = fmt.Sprintf(format, remainder) target.Value = fmt.Sprintf(format, remainder)
} else if (lhsTag == "!!int" || lhsTag == "!!float") && (rhsTag == "!!int" || rhsTag == "!!float") { } else if (lhsTag == "!!int" || lhsTag == "!!float") && (rhsTag == "!!int" || rhsTag == "!!float") {
target.Node.Kind = yaml.ScalarNode target.Kind = yaml.ScalarNode
target.Node.Style = lhs.Style target.Style = lhs.Style
lhsNum, err := strconv.ParseFloat(lhs.Value, 64) lhsNum, err := strconv.ParseFloat(lhs.Value, 64)
if err != nil { if err != nil {
@ -89,11 +87,11 @@ func moduloScalars(context Context, target *CandidateNode, lhs *yaml.Node, rhs *
} }
remainder := math.Mod(lhsNum, rhsNum) remainder := math.Mod(lhsNum, rhsNum)
if lhsIsCustom { if lhsIsCustom {
target.Node.Tag = lhs.Tag target.Tag = lhs.Tag
} else { } else {
target.Node.Tag = "!!float" target.Tag = "!!float"
} }
target.Node.Value = fmt.Sprintf("%v", remainder) target.Value = fmt.Sprintf("%v", remainder)
} else { } else {
return fmt.Errorf("%v cannot modulo by %v", lhsTag, rhsTag) return fmt.Errorf("%v cannot modulo by %v", lhsTag, rhsTag)
} }