From c9cddc35034837eab59a7e30d954725734f18940 Mon Sep 17 00:00:00 2001 From: tyamagu2 Date: Wed, 19 Jul 2023 18:13:47 +0900 Subject: [PATCH] fix: idx1 of variable expression without initializer Fix Idx1 of VariableExpression so that it points to the character right after the name literal if the expression does not have an initializer. --- ast/node.go | 2 +- parser/parser_test.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ast/node.go b/ast/node.go index 5fbce841..4ac013e3 100644 --- a/ast/node.go +++ b/ast/node.go @@ -483,7 +483,7 @@ func (ve *VariableExpression) Idx0() file.Idx { // Idx1 implements Node. func (ve *VariableExpression) Idx1() file.Idx { if ve.Initializer == nil { - return file.Idx(int(ve.Idx) + len(ve.Name) + 1) + return file.Idx(int(ve.Idx) + len(ve.Name)) } return ve.Initializer.Idx1() } diff --git a/parser/parser_test.go b/parser/parser_test.go index 3f545492..e026030c 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -1086,6 +1086,20 @@ func TestPosition(t *testing.T) { node = block.List[0].(*ast.ExpressionStatement).Expression.(*ast.UnaryExpression) is(node.Idx0(), 14) is(parser.slice(node.Idx0(), node.Idx1()), "xyz++") + + parser = newParser("", "(function(){ var abc, xyz = 1; })", 1, nil) + program, err = parser.parse() + is(err, nil) + block = program.Body[0].(*ast.ExpressionStatement).Expression.(*ast.FunctionLiteral).Body.(*ast.BlockStatement) + node = block.List[0].(*ast.VariableStatement) + is(node.Idx0(), 14) + is(parser.slice(node.Idx0(), node.Idx1()), "var abc, xyz = 1") + node = block.List[0].(*ast.VariableStatement).List[0].(*ast.VariableExpression) + is(node.Idx0(), 18) + is(parser.slice(node.Idx0(), node.Idx1()), "abc") + node = block.List[0].(*ast.VariableStatement).List[1].(*ast.VariableExpression) + is(node.Idx0(), 23) + is(parser.slice(node.Idx0(), node.Idx1()), "xyz = 1") }) }