From 0f5f5e7dc7980e0466c1dffada468c91756ff688 Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Sat, 26 Dec 2020 20:13:50 +0200 Subject: [PATCH] refactoring: update ast structure of "ArrayItem" node --- internal/php5/parser_test.go | 120 ++++++++++++++------------------ internal/php5/php5.go | 100 ++++++++++++-------------- internal/php5/php5.y | 36 ++++------ internal/php7/parser_test.go | 120 ++++++++++++++------------------ internal/php7/php7.go | 76 ++++++++++---------- internal/php7/php7.y | 18 ++--- pkg/ast/node.go | 1 + pkg/ast/visitor/dumper.go | 1 + pkg/ast/visitor/printer.go | 1 + pkg/ast/visitor/printer_test.go | 26 ++++++- 10 files changed, 228 insertions(+), 271 deletions(-) diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index 10e9084..eeca77d 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -30786,61 +30786,53 @@ func TestExprArray_Items(t *testing.T) { StartPos: 15, EndPos: 18, }, - Val: &ast.ExprReference{ + AmpersandTkn: &token.Token{ + ID: token.ID(38), + Value: []byte("&"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 15, - EndPos: 18, + EndPos: 16, }, - AmpersandTkn: &token.Token{ - ID: token.ID(38), - Value: []byte("&"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 15, - EndPos: 16, - }, - FreeFloating: []*token.Token{ - { - ID: token.T_WHITESPACE, - Value: []byte(" "), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 14, - EndPos: 15, - }, + FreeFloating: []*token.Token{ + { + ID: token.T_WHITESPACE, + Value: []byte(" "), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 14, + EndPos: 15, }, }, }, - Var: &ast.ExprVariable{ + }, + Val: &ast.ExprVariable{ + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 16, + EndPos: 18, + }, + VarName: &ast.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 16, EndPos: 18, }, - VarName: &ast.Identifier{ + IdentifierTkn: &token.Token{ + ID: token.T_VARIABLE, + Value: []byte("$b"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 16, EndPos: 18, }, - IdentifierTkn: &token.Token{ - ID: token.T_VARIABLE, - Value: []byte("$b"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 16, - EndPos: 18, - }, - }, - Value: []byte("$b"), }, + Value: []byte("$b"), }, }, }, @@ -39025,61 +39017,53 @@ func TestExprShortArray_Items(t *testing.T) { StartPos: 10, EndPos: 13, }, - Val: &ast.ExprReference{ + AmpersandTkn: &token.Token{ + ID: token.ID(38), + Value: []byte("&"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 10, - EndPos: 13, + EndPos: 11, }, - AmpersandTkn: &token.Token{ - ID: token.ID(38), - Value: []byte("&"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 10, - EndPos: 11, - }, - FreeFloating: []*token.Token{ - { - ID: token.T_WHITESPACE, - Value: []byte(" "), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 9, - EndPos: 10, - }, + FreeFloating: []*token.Token{ + { + ID: token.T_WHITESPACE, + Value: []byte(" "), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 9, + EndPos: 10, }, }, }, - Var: &ast.ExprVariable{ + }, + Val: &ast.ExprVariable{ + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 11, + EndPos: 13, + }, + VarName: &ast.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 11, EndPos: 13, }, - VarName: &ast.Identifier{ + IdentifierTkn: &token.Token{ + ID: token.T_VARIABLE, + Value: []byte("$b"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 11, EndPos: 13, }, - IdentifierTkn: &token.Token{ - ID: token.T_VARIABLE, - Value: []byte("$b"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 11, - EndPos: 13, - }, - }, - Value: []byte("$b"), }, + Value: []byte("$b"), }, }, }, diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 7fbb547..392b113 100644 --- a/internal/php5/php5.go +++ b/internal/php5/php5.go @@ -340,7 +340,7 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -// line internal/php5/php5.y:5669 +// line internal/php5/php5.y:5657 // line yacctab:1 var yyExca = [...]int{ @@ -7825,11 +7825,8 @@ yydefault: Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[3].node, yyDollar[6].node), Key: yyDollar[3].node, DoubleArrowTkn: yyDollar[4].token, - Val: &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[5].token, yyDollar[6].node), - AmpersandTkn: yyDollar[5].token, - Var: yyDollar[6].node, - }, + AmpersandTkn: yyDollar[5].token, + Val: yyDollar[6].node, } yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token) @@ -7839,15 +7836,12 @@ yydefault: } case 488: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5274 + // line internal/php5/php5.y:5271 { arrayItem := &ast.ExprArrayItem{ - Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[3].token, yyDollar[4].node), - Val: &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[3].token, yyDollar[4].node), - AmpersandTkn: yyDollar[3].token, - Var: yyDollar[4].node, - }, + Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[3].token, yyDollar[4].node), + AmpersandTkn: yyDollar[3].token, + Val: yyDollar[4].node, } yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token) @@ -7857,7 +7851,7 @@ yydefault: } case 489: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5290 + // line internal/php5/php5.y:5284 { yyVAL.node = &ast.ParserSeparatedList{ Items: []ast.Vertex{ @@ -7865,41 +7859,35 @@ yydefault: Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[1].node, yyDollar[4].node), Key: yyDollar[1].node, DoubleArrowTkn: yyDollar[2].token, - Val: &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[3].token, yyDollar[4].node), - AmpersandTkn: yyDollar[3].token, - Var: yyDollar[4].node, - }, + AmpersandTkn: yyDollar[3].token, + Val: yyDollar[4].node, }, }, } } case 490: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5307 + // line internal/php5/php5.y:5298 { yyVAL.node = &ast.ParserSeparatedList{ Items: []ast.Vertex{ &ast.ExprArrayItem{ - Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), - Val: &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), - AmpersandTkn: yyDollar[1].token, - Var: yyDollar[2].node, - }, + Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), + AmpersandTkn: yyDollar[1].token, + Val: yyDollar[2].node, }, }, } } case 491: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5325 + // line internal/php5/php5.y:5313 { yyVAL.list = append(yyDollar[1].list, yyDollar[2].node) } case 492: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5329 + // line internal/php5/php5.y:5317 { yyVAL.list = append( yyDollar[1].list, @@ -7912,13 +7900,13 @@ yydefault: } case 493: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5340 + // line internal/php5/php5.y:5328 { yyVAL.list = []ast.Vertex{yyDollar[1].node} } case 494: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5344 + // line internal/php5/php5.y:5332 { yyVAL.list = []ast.Vertex{ &ast.ScalarEncapsedStringPart{ @@ -7931,7 +7919,7 @@ yydefault: } case 495: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5358 + // line internal/php5/php5.y:5346 { yyVAL.node = &ast.ExprVariable{ Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), @@ -7944,7 +7932,7 @@ yydefault: } case 496: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5369 + // line internal/php5/php5.y:5357 { yyVAL.node = &ast.ExprArrayDimFetch{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -7963,7 +7951,7 @@ yydefault: } case 497: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5386 + // line internal/php5/php5.y:5374 { yyVAL.node = &ast.ExprPropertyFetch{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -7985,7 +7973,7 @@ yydefault: } case 498: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5406 + // line internal/php5/php5.y:5394 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -7999,7 +7987,7 @@ yydefault: } case 499: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5418 + // line internal/php5/php5.y:5406 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -8017,7 +8005,7 @@ yydefault: } case 500: yyDollar = yyS[yypt-6 : yypt+1] - // line internal/php5/php5.y:5434 + // line internal/php5/php5.y:5422 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[6].token), @@ -8041,7 +8029,7 @@ yydefault: } case 501: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5456 + // line internal/php5/php5.y:5444 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -8052,7 +8040,7 @@ yydefault: } case 502: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5468 + // line internal/php5/php5.y:5456 { yyVAL.node = &ast.ScalarString{ Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), @@ -8062,7 +8050,7 @@ yydefault: } case 503: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5476 + // line internal/php5/php5.y:5464 { // TODO: add option to handle 64 bit integer if _, err := strconv.Atoi(string(yyDollar[1].token.Value)); err == nil { @@ -8081,7 +8069,7 @@ yydefault: } case 504: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5493 + // line internal/php5/php5.y:5481 { yyVAL.node = &ast.ExprVariable{ Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), @@ -8094,7 +8082,7 @@ yydefault: } case 505: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5507 + // line internal/php5/php5.y:5495 { yyVAL.node = &ast.ExprIsset{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -8107,7 +8095,7 @@ yydefault: } case 506: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5518 + // line internal/php5/php5.y:5506 { yyVAL.node = &ast.ExprEmpty{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -8119,7 +8107,7 @@ yydefault: } case 507: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5528 + // line internal/php5/php5.y:5516 { yyVAL.node = &ast.ExprEmpty{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -8131,7 +8119,7 @@ yydefault: } case 508: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5538 + // line internal/php5/php5.y:5526 { yyVAL.node = &ast.ExprInclude{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -8141,7 +8129,7 @@ yydefault: } case 509: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5546 + // line internal/php5/php5.y:5534 { yyVAL.node = &ast.ExprIncludeOnce{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -8151,7 +8139,7 @@ yydefault: } case 510: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5554 + // line internal/php5/php5.y:5542 { yyVAL.node = &ast.ExprEval{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -8163,7 +8151,7 @@ yydefault: } case 511: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5564 + // line internal/php5/php5.y:5552 { yyVAL.node = &ast.ExprRequire{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -8173,7 +8161,7 @@ yydefault: } case 512: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5572 + // line internal/php5/php5.y:5560 { yyVAL.node = &ast.ExprRequireOnce{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -8183,7 +8171,7 @@ yydefault: } case 513: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5583 + // line internal/php5/php5.y:5571 { yyVAL.node = &ast.ParserSeparatedList{ Items: []ast.Vertex{yyDollar[1].node}, @@ -8191,7 +8179,7 @@ yydefault: } case 514: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5589 + // line internal/php5/php5.y:5577 { yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token) yyDollar[1].node.(*ast.ParserSeparatedList).Items = append(yyDollar[1].node.(*ast.ParserSeparatedList).Items, yyDollar[3].node) @@ -8200,19 +8188,19 @@ yydefault: } case 515: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5599 + // line internal/php5/php5.y:5587 { yyVAL.node = yyDollar[1].node } case 516: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5603 + // line internal/php5/php5.y:5591 { yyVAL.node = yyDollar[1].node } case 517: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5610 + // line internal/php5/php5.y:5598 { yyVAL.node = &ast.ExprClassConstFetch{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token), @@ -8227,7 +8215,7 @@ yydefault: } case 518: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5623 + // line internal/php5/php5.y:5611 { yyVAL.node = &ast.ExprClassConstFetch{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token), @@ -8242,7 +8230,7 @@ yydefault: } case 519: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5639 + // line internal/php5/php5.y:5627 { yyVAL.node = &ast.ExprClassConstFetch{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token), @@ -8257,7 +8245,7 @@ yydefault: } case 520: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5655 + // line internal/php5/php5.y:5643 { yyVAL.node = &ast.ExprClassConstFetch{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token), diff --git a/internal/php5/php5.y b/internal/php5/php5.y index 6b33687..a1bb134 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -5255,14 +5255,11 @@ non_empty_array_pair_list: | non_empty_array_pair_list ',' expr T_DOUBLE_ARROW '&' w_variable { arrayItem := &ast.ExprArrayItem{ - Position: yylex.(*Parser).builder.NewNodesPosition($3, $6), + Position: yylex.(*Parser).builder.NewNodesPosition($3, $6), Key: $3, DoubleArrowTkn: $4, - Val: &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokenNodePosition($5, $6), - AmpersandTkn: $5, - Var: $6, - }, + AmpersandTkn: $5, + Val: $6, } $1.(*ast.ParserSeparatedList).SeparatorTkns = append($1.(*ast.ParserSeparatedList).SeparatorTkns, $2) @@ -5273,12 +5270,9 @@ non_empty_array_pair_list: | non_empty_array_pair_list ',' '&' w_variable { arrayItem := &ast.ExprArrayItem{ - Position: yylex.(*Parser).builder.NewTokenNodePosition($3, $4), - Val: &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokenNodePosition($3, $4), - AmpersandTkn: $3, - Var: $4, - }, + Position: yylex.(*Parser).builder.NewTokenNodePosition($3, $4), + AmpersandTkn: $3, + Val: $4, } $1.(*ast.ParserSeparatedList).SeparatorTkns = append($1.(*ast.ParserSeparatedList).SeparatorTkns, $2) @@ -5291,14 +5285,11 @@ non_empty_array_pair_list: $$ = &ast.ParserSeparatedList{ Items: []ast.Vertex{ &ast.ExprArrayItem{ - Position: yylex.(*Parser).builder.NewNodesPosition($1, $4), + Position: yylex.(*Parser).builder.NewNodesPosition($1, $4), Key: $1, DoubleArrowTkn: $2, - Val: &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokenNodePosition($3, $4), - AmpersandTkn: $3, - Var: $4, - }, + AmpersandTkn: $3, + Val: $4, }, }, } @@ -5308,12 +5299,9 @@ non_empty_array_pair_list: $$ = &ast.ParserSeparatedList{ Items: []ast.Vertex{ &ast.ExprArrayItem{ - Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2), - Val: &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2), - AmpersandTkn: $1, - Var: $2, - }, + Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2), + AmpersandTkn: $1, + Val: $2, }, }, } diff --git a/internal/php7/parser_test.go b/internal/php7/parser_test.go index eb10949..cd532ff 100644 --- a/internal/php7/parser_test.go +++ b/internal/php7/parser_test.go @@ -34718,61 +34718,53 @@ func TestExprArray_Items(t *testing.T) { StartPos: 15, EndPos: 18, }, - Val: &ast.ExprReference{ + AmpersandTkn: &token.Token{ + ID: token.ID(38), + Value: []byte("&"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 15, - EndPos: 18, + EndPos: 16, }, - AmpersandTkn: &token.Token{ - ID: token.ID(38), - Value: []byte("&"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 15, - EndPos: 16, - }, - FreeFloating: []*token.Token{ - { - ID: token.T_WHITESPACE, - Value: []byte(" "), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 14, - EndPos: 15, - }, + FreeFloating: []*token.Token{ + { + ID: token.T_WHITESPACE, + Value: []byte(" "), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 14, + EndPos: 15, }, }, }, - Var: &ast.ExprVariable{ + }, + Val: &ast.ExprVariable{ + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 16, + EndPos: 18, + }, + VarName: &ast.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 16, EndPos: 18, }, - VarName: &ast.Identifier{ + IdentifierTkn: &token.Token{ + ID: token.T_VARIABLE, + Value: []byte("$b"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 16, EndPos: 18, }, - IdentifierTkn: &token.Token{ - ID: token.T_VARIABLE, - Value: []byte("$b"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 16, - EndPos: 18, - }, - }, - Value: []byte("$b"), }, + Value: []byte("$b"), }, }, }, @@ -43983,61 +43975,53 @@ func TestExprShortArray_Items(t *testing.T) { StartPos: 10, EndPos: 13, }, - Val: &ast.ExprReference{ + AmpersandTkn: &token.Token{ + ID: token.ID(38), + Value: []byte("&"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 10, - EndPos: 13, + EndPos: 11, }, - AmpersandTkn: &token.Token{ - ID: token.ID(38), - Value: []byte("&"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 10, - EndPos: 11, - }, - FreeFloating: []*token.Token{ - { - ID: token.T_WHITESPACE, - Value: []byte(" "), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 9, - EndPos: 10, - }, + FreeFloating: []*token.Token{ + { + ID: token.T_WHITESPACE, + Value: []byte(" "), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 9, + EndPos: 10, }, }, }, - Var: &ast.ExprVariable{ + }, + Val: &ast.ExprVariable{ + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 11, + EndPos: 13, + }, + VarName: &ast.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 11, EndPos: 13, }, - VarName: &ast.Identifier{ + IdentifierTkn: &token.Token{ + ID: token.T_VARIABLE, + Value: []byte("$b"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 11, EndPos: 13, }, - IdentifierTkn: &token.Token{ - ID: token.T_VARIABLE, - Value: []byte("$b"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 11, - EndPos: 13, - }, - }, - Value: []byte("$b"), }, + Value: []byte("$b"), }, }, }, diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 85bc391..2e0135b 100644 --- a/internal/php7/php7.go +++ b/internal/php7/php7.go @@ -339,7 +339,7 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -// line internal/php7/php7.y:4359 +// line internal/php7/php7.y:4353 // line yacctab:1 var yyExca = [...]int{ @@ -6677,29 +6677,23 @@ yydefault: Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[1].node, yyDollar[4].node), Key: yyDollar[1].node, DoubleArrowTkn: yyDollar[2].token, - Val: &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[3].token, yyDollar[4].node), - AmpersandTkn: yyDollar[3].token, - Var: yyDollar[4].node, - }, + AmpersandTkn: yyDollar[3].token, + Val: yyDollar[4].node, } } case 466: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php7/php7.y:4008 + // line internal/php7/php7.y:4005 { yyVAL.node = &ast.ExprArrayItem{ - Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), - Val: &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), - AmpersandTkn: yyDollar[1].token, - Var: yyDollar[2].node, - }, + Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), + AmpersandTkn: yyDollar[1].token, + Val: yyDollar[2].node, } } case 467: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php7/php7.y:4019 + // line internal/php7/php7.y:4013 { yyVAL.node = &ast.ExprArrayItem{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -6709,7 +6703,7 @@ yydefault: } case 468: yyDollar = yyS[yypt-6 : yypt+1] - // line internal/php7/php7.y:4027 + // line internal/php7/php7.y:4021 { yyVAL.node = &ast.ExprArrayItem{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[6].token), @@ -6727,7 +6721,7 @@ yydefault: } case 469: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php7/php7.y:4043 + // line internal/php7/php7.y:4037 { yyVAL.node = &ast.ExprArrayItem{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -6743,13 +6737,13 @@ yydefault: } case 470: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php7/php7.y:4060 + // line internal/php7/php7.y:4054 { yyVAL.list = append(yyDollar[1].list, yyDollar[2].node) } case 471: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php7/php7.y:4064 + // line internal/php7/php7.y:4058 { yyVAL.list = append( yyDollar[1].list, @@ -6762,13 +6756,13 @@ yydefault: } case 472: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php7/php7.y:4075 + // line internal/php7/php7.y:4069 { yyVAL.list = []ast.Vertex{yyDollar[1].node} } case 473: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php7/php7.y:4079 + // line internal/php7/php7.y:4073 { yyVAL.list = []ast.Vertex{ &ast.ScalarEncapsedStringPart{ @@ -6781,7 +6775,7 @@ yydefault: } case 474: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php7/php7.y:4093 + // line internal/php7/php7.y:4087 { yyVAL.node = &ast.ExprVariable{ Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), @@ -6794,7 +6788,7 @@ yydefault: } case 475: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php7/php7.y:4104 + // line internal/php7/php7.y:4098 { yyVAL.node = &ast.ExprArrayDimFetch{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -6813,7 +6807,7 @@ yydefault: } case 476: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php7/php7.y:4121 + // line internal/php7/php7.y:4115 { yyVAL.node = &ast.ExprPropertyFetch{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -6835,7 +6829,7 @@ yydefault: } case 477: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php7/php7.y:4141 + // line internal/php7/php7.y:4135 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -6849,7 +6843,7 @@ yydefault: } case 478: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php7/php7.y:4153 + // line internal/php7/php7.y:4147 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -6867,7 +6861,7 @@ yydefault: } case 479: yyDollar = yyS[yypt-6 : yypt+1] - // line internal/php7/php7.y:4169 + // line internal/php7/php7.y:4163 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[6].token), @@ -6891,7 +6885,7 @@ yydefault: } case 480: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php7/php7.y:4191 + // line internal/php7/php7.y:4185 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -6902,7 +6896,7 @@ yydefault: } case 481: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php7/php7.y:4203 + // line internal/php7/php7.y:4197 { yyVAL.node = &ast.ScalarString{ Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), @@ -6912,7 +6906,7 @@ yydefault: } case 482: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php7/php7.y:4211 + // line internal/php7/php7.y:4205 { // TODO: add option to handle 64 bit integer if _, err := strconv.Atoi(string(yyDollar[1].token.Value)); err == nil { @@ -6931,7 +6925,7 @@ yydefault: } case 483: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php7/php7.y:4228 + // line internal/php7/php7.y:4222 { _, err := strconv.Atoi(string(yyDollar[2].token.Value)) isInt := err == nil @@ -6957,7 +6951,7 @@ yydefault: } case 484: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php7/php7.y:4252 + // line internal/php7/php7.y:4246 { yyVAL.node = &ast.ExprVariable{ Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), @@ -6970,7 +6964,7 @@ yydefault: } case 485: yyDollar = yyS[yypt-5 : yypt+1] - // line internal/php7/php7.y:4266 + // line internal/php7/php7.y:4260 { if yyDollar[4].token != nil { yyDollar[3].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[3].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[4].token) @@ -6987,7 +6981,7 @@ yydefault: } case 486: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php7/php7.y:4281 + // line internal/php7/php7.y:4275 { yyVAL.node = &ast.ExprEmpty{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -6999,7 +6993,7 @@ yydefault: } case 487: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php7/php7.y:4291 + // line internal/php7/php7.y:4285 { yyVAL.node = &ast.ExprInclude{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -7009,7 +7003,7 @@ yydefault: } case 488: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php7/php7.y:4299 + // line internal/php7/php7.y:4293 { yyVAL.node = &ast.ExprIncludeOnce{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -7019,7 +7013,7 @@ yydefault: } case 489: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php7/php7.y:4307 + // line internal/php7/php7.y:4301 { yyVAL.node = &ast.ExprEval{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -7031,7 +7025,7 @@ yydefault: } case 490: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php7/php7.y:4317 + // line internal/php7/php7.y:4311 { yyVAL.node = &ast.ExprRequire{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -7041,7 +7035,7 @@ yydefault: } case 491: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php7/php7.y:4325 + // line internal/php7/php7.y:4319 { yyVAL.node = &ast.ExprRequireOnce{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -7051,7 +7045,7 @@ yydefault: } case 492: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php7/php7.y:4336 + // line internal/php7/php7.y:4330 { yyVAL.node = &ast.ParserSeparatedList{ Items: []ast.Vertex{yyDollar[1].node}, @@ -7059,7 +7053,7 @@ yydefault: } case 493: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php7/php7.y:4342 + // line internal/php7/php7.y:4336 { yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token) yyDollar[1].node.(*ast.ParserSeparatedList).Items = append(yyDollar[1].node.(*ast.ParserSeparatedList).Items, yyDollar[3].node) @@ -7068,7 +7062,7 @@ yydefault: } case 494: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php7/php7.y:4352 + // line internal/php7/php7.y:4346 { yyVAL.node = yyDollar[1].node } diff --git a/internal/php7/php7.y b/internal/php7/php7.y index f85ad45..3e7e479 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -3994,25 +3994,19 @@ array_pair: | expr T_DOUBLE_ARROW '&' variable { $$ = &ast.ExprArrayItem{ - Position: yylex.(*Parser).builder.NewNodesPosition($1, $4), + Position: yylex.(*Parser).builder.NewNodesPosition($1, $4), Key: $1, DoubleArrowTkn: $2, - Val: &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokenNodePosition($3, $4), - AmpersandTkn: $3, - Var: $4, - }, + AmpersandTkn: $3, + Val: $4, } } | '&' variable { $$ = &ast.ExprArrayItem{ - Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2), - Val: &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2), - AmpersandTkn: $1, - Var: $2, - }, + Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2), + AmpersandTkn: $1, + Val: $2, } } | T_ELLIPSIS expr diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 8a020b6..62d26a5 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -1177,6 +1177,7 @@ type ExprArrayItem struct { EllipsisTkn *token.Token Key Vertex DoubleArrowTkn *token.Token + AmpersandTkn *token.Token Val Vertex } diff --git a/pkg/ast/visitor/dumper.go b/pkg/ast/visitor/dumper.go index dfb5a64..598ab1f 100644 --- a/pkg/ast/visitor/dumper.go +++ b/pkg/ast/visitor/dumper.go @@ -1056,6 +1056,7 @@ func (v *Dumper) ExprArrayItem(n *ast.ExprArrayItem) { v.dumpToken("EllipsisTkn", n.EllipsisTkn) v.dumpVertex("Key", n.Key) v.dumpToken("DoubleArrowTkn", n.DoubleArrowTkn) + v.dumpToken("AmpersandTkn", n.AmpersandTkn) v.dumpVertex("Val", n.Val) v.indent-- diff --git a/pkg/ast/visitor/printer.go b/pkg/ast/visitor/printer.go index ff0fac5..479c98c 100644 --- a/pkg/ast/visitor/printer.go +++ b/pkg/ast/visitor/printer.go @@ -641,6 +641,7 @@ func (p *printer) ExprArrayItem(n *ast.ExprArrayItem) { p.printToken(n.EllipsisTkn, nil) p.printNode(n.Key) p.printToken(n.DoubleArrowTkn, p.ifNode(n.Key, []byte("=>"))) + p.printToken(n.AmpersandTkn, nil) p.printNode(n.Val) } diff --git a/pkg/ast/visitor/printer_test.go b/pkg/ast/visitor/printer_test.go index 8671134..187c173 100644 --- a/pkg/ast/visitor/printer_test.go +++ b/pkg/ast/visitor/printer_test.go @@ -1559,9 +1559,31 @@ func TestPrinterPrintExprArrayItem(t *testing.T) { p := visitor.NewPrinter(o).WithState(visitor.PrinterStatePHP) n := &ast.ExprArrayItem{ - Val: &ast.ExprReference{Var: &ast.ExprVariable{ + Val: &ast.ExprVariable{ VarName: &ast.Identifier{Value: []byte("$world")}, - }}, + }, + } + n.Accept(p) + + expected := `$world` + actual := o.String() + + if expected != actual { + t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) + } +} + +func TestPrinterPrintExprArrayItem_Reference(t *testing.T) { + o := bytes.NewBufferString("") + + p := visitor.NewPrinter(o).WithState(visitor.PrinterStatePHP) + n := &ast.ExprArrayItem{ + AmpersandTkn: &token.Token{ + Value: []byte("&"), + }, + Val: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("$world")}, + }, } n.Accept(p)