From 4804a93d856967c0e7f597b7be33cf51fe6ba227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Brauer?= Date: Fri, 10 Dec 2021 16:46:40 +0000 Subject: [PATCH] wip: track token end position --- pkg/exprparser/interpreter.go | 42 ++++++++++++++++++++++++++++++----- pkg/runner/expression.go | 10 +-------- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/pkg/exprparser/interpreter.go b/pkg/exprparser/interpreter.go index 3786ccdd695..261b0e76f75 100644 --- a/pkg/exprparser/interpreter.go +++ b/pkg/exprparser/interpreter.go @@ -53,12 +53,44 @@ func (impl *interperterImpl) Evaluate(input string) (interface{}, int, error) { result, err2 := impl.evaluateNode(exprNode) - // todo: this does not work and we need to calculate/track the - // node end position - fmt.Printf("read text: %s offset: %d line %d column %d\n", - exprNode.Token().Value, exprNode.Token().Offset, exprNode.Token().Line, exprNode.Token().Column) + return result, impl.bytesRead(exprNode), err2 +} - return result, len(exprNode.Token().Value), err2 +func (impl *interperterImpl) bytesRead(exprNode actionlint.ExprNode) int { + switch node := exprNode.(type) { + case *actionlint.VariableNode: + return len(node.Token().Value) + case *actionlint.BoolNode: + return len(node.Token().Value) + case *actionlint.NullNode: + return len(node.Token().Value) + case *actionlint.IntNode: + return len(node.Token().Value) + case *actionlint.FloatNode: + return len(node.Token().Value) + case *actionlint.StringNode: + return len(node.Token().Value) + case *actionlint.IndexAccessNode: + return node.Index.Token().Offset + len(node.Index.Token().Value) + 1 + case *actionlint.ObjectDerefNode: + return node.Receiver.Token().Offset + len(node.Property) + 1 + case *actionlint.ArrayDerefNode: + return node.Receiver.Token().Offset + 2 + case *actionlint.NotOpNode: + return 1 + case *actionlint.CompareOpNode: + return node.Right.Token().Offset + len(node.Right.Token().Value) + case *actionlint.LogicalOpNode: + return node.Right.Token().Offset + len(node.Right.Token().Value) + case *actionlint.FuncCallNode: + if len(node.Args) == 0 { + return node.Token().Offset + len(node.Token().Value) + } + lastArg := node.Args[len(node.Args)-1] + return lastArg.Token().Offset + impl.bytesRead(lastArg) + 1 + default: + panic(fmt.Sprintf("TODO: unknown node type: %s node: %+v", reflect.TypeOf(exprNode), exprNode)) + } } func (impl *interperterImpl) evaluateNode(exprNode actionlint.ExprNode) (interface{}, error) { diff --git a/pkg/runner/expression.go b/pkg/runner/expression.go index dfc8e42144b..9a71e040e7d 100644 --- a/pkg/runner/expression.go +++ b/pkg/runner/expression.go @@ -150,7 +150,6 @@ func (ee expressionEvaluator) InterpolateWithStringCheck(in string) (string, boo state = expressionStartDollar default: - fmt.Printf("%d output %c\n", i, character) output += string(character) } @@ -180,14 +179,11 @@ func (ee expressionEvaluator) InterpolateWithStringCheck(in string) (string, boo if skip == 0 { result, pos, err := ee.interpreter.Evaluate(in[i:]) if err != nil { - fmt.Printf("Failed to eval: %s\n", err) return "", false } output += ee.toString(result) - fmt.Printf("read %d in '%s'\n", pos, in[i:pos]) - if (pos - 1) == 0 { state = expressionEndBracket1 } else { @@ -204,14 +200,12 @@ func (ee expressionEvaluator) InterpolateWithStringCheck(in string) (string, boo // todo: handle error switch character { case '}': - fmt.Printf("first closing bracket\n") state = expressionEndBracket2 } case expressionEndBracket2: // todo: handle error switch character { case '}': - fmt.Printf("second closing bracket\n") state = passThrough } } @@ -220,12 +214,10 @@ func (ee expressionEvaluator) InterpolateWithStringCheck(in string) (string, boo if state != passThrough { switch state { case expressionStartDollar, expressionStartBracket1, expressionStartBracket2, expressionEndBracket1, expressionEndBracket2: - return "qwerydfkjökyxfd", false + panic("unexpected state while parsing expression") } } - fmt.Printf("eval result of '%s' is '%s'\n", in, output) - return output, true }