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 | Bin 265275 -> 264719 bytes internal/php5/php5.y | 36 ++++------ internal/php7/parser_test.go | 120 ++++++++++++++------------------ internal/php7/php7.go | Bin 219466 -> 219194 bytes 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, 149 insertions(+), 174 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 7fbb547dfe6a9c3326b662fc5364e4b8f1cdc961..392b1132d53396f555d692f1c4d9e96d9fca5d7f 100644 GIT binary patch delta 885 zcmY*XTS!z<6lL#yb!JE{%hX}i8G9%bWHaN8*P$f)8E^Da5WNd=I zM1yek)dK~8dMHE}>Bqi;qLN5M6f=t~G#`YdO=V}sNAz(o=d82$+Iz3HpWIy6a${Xr z#K|E&ZaA+QPEsFRhEwu;&~S;fP=Ak{_|_;+Oncd8(IjUQcD92rulHx6wB%&02UA6I2oC_Q*GC^Z}iqp5^k@RafPwz!n7 zwx;9Ika*>A^c0Mi zrccuGYm3~+rdg#&MbJ7oD`y!Llsv?egDGjs2wUfrSHUo%wW{RkdDg7vIhiE(Eeq&d z5I^DhyhPal4{Aud(U*`C>(x&oQcf%_O_FyyAsM7v&VIyh%k^6>l9E1k>HZ^jq6%E^ zS1*H$l21vc^`#}*kK?2ntm~FPL6 l>rfeKT5^5%oRAe{!KRQv%J*cv{Ht76!t-9KF{4;e({o;p;Zgmo&`#Dowm zD4#$GtxFe6A$pN0te}%$*as?#ACMU2M@6Ql)w^p2f`|7o^UnNu=9y`{o&4->a(mFu z{=!<*UT@k-KUSt)(mIV3;qygk?;$(PY}$&-cj6}>(l4_c@2fc#MHe{>0A0&jT1xiK4Nr%wVFHXz{#EpuxvKM`El7wruauOXqT2H8)x1jwH8Bx*Y7^vnw zIMz!$@egfb>lN50Bn2gPvIQA~668D&YI@iKR}LR+s+E1H$Y2*LQaFHL{bJdG>_>lt zHp4rli?t7#hSjDA{m2lQ*fy!?K$=-vf7xlwkXa z?#Rza>kB!cZj5Ndwc{Nh*r~=xYWlI^hXW2naJCaF(n<8i<&HQG@X-7M3&e3kD%?NoPwv5veEZ|!lG|(=L@0U2V%}XK@c1tT3X7#`UzdAf8=NQLV zwK_dS4q@r59?}PC311=y@r(}821Pf7scb17$KBRQo8cQ8xILRaYjh1 Y)u44{gBG3EcW|5>(Zc(LQLEwo1F3^JApigX 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 85bc3917dc5228361faa2af1ba26b9f2b17a051c..2e0135be48ae0af5829c12c6c46f36a10850cf1b 100644 GIT binary patch delta 763 zcmZ8fTSyaN6y}_xPIH^LQs=Zy?Bb+wb55P&t;|cN&ZsOXG@-&7!%WF#ro!+c1JB8;fFK#4-gsDDWaJ^T;naL#u-|BDBvCm~ZP(?ae*mSs50 zLi(}FvdCK_+S}QTMlL@}3vBadC4HB}68Ftowx3%P_NVFO;vX?M4#Tn>NkuIbaYe6m#K3-+J@)yewX1539n_Lkb z)h5<9`3Ra?C=Q{AWJZ6bB;w~H7sCIIqHt}Al5wSp4Dfg8yl<7s9Sj6H6X6Q!M!1L) z;9Q`@{{WN*$R|9m7Asb#*n-{)ZOt`IR;BkY2(nAJAogIbl1>FPB!K3_Qp+wc$jesv zK5-1JwPM8AySxJ*jFOEi6K5l#MyA;5QTJ=4m#IKm>*SbFA=U$10cqApjXG(k`rRnc znT!AW-mN}2%MfkR&a_Ir3iyNxhs)Tibe%*vG_5o3zr=AWd^|GRInFkWo)m-XJ0V2m zLTedW5lWUQrP~(5>@!`5&r%DL+BBmZzuxPA7pjk(y+r>uf2`K~uQaRGHi@S#rKy;2 L*GEr3BL#l|4xH|{ delta 782 zcmaKqO-NKx6vsK|IH>4M>Zmp5==7mxqP`iNu}L&PK&K%a?L%EC%@78enMozJFhNL& zN+I;WC)>iae~DP}y;PdmXQ1vBWg%@Bm15eaJG@pV0rH`)Oq}X- znbZEidAsTYAVJM^H5$IZy01uy`>J z_BJrANfk(>lWRddzs@QJF&8l+9q>k1U2>2h#7`PUgt- z)qJZAZY(i$L=sikVIg9VcOzQAau9-T`X5~%;WR9CQV7&00X=sL5^lCjz~or{$t6hY G5YKNP?fV!2 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)