From 69bc0af2bed3d06487fca47189d0efb24641f08d Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Mon, 14 Sep 2020 18:36:55 +0300 Subject: [PATCH] [refactoring] update ast structure of "Foreach" node --- internal/php5/parser_test.go | 3 +- internal/php5/php5.go | Bin 291164 -> 289930 bytes internal/php5/php5.y | 123 +++++++++---------------- internal/php5/php5_test.go | 3 +- internal/php7/parser_test.go | 3 +- internal/php7/php7.go | Bin 242614 -> 242866 bytes internal/php7/php7.y | 88 +++++++----------- internal/php7/php7_test.go | 3 +- pkg/ast/ast.go | 1 - pkg/ast/node.go | 30 +++--- pkg/ast/traverser/dfs.go | 27 ------ pkg/ast/visitor/dump.go | 6 -- pkg/ast/visitor/filter_parser_nodes.go | 20 ---- pkg/ast/visitor/filter_tokens.go | 11 +++ pkg/ast/visitor/null.go | 4 - pkg/printer/pretty_printer.go | 55 +++++------ pkg/printer/pretty_printer_test.go | 3 +- pkg/printer/printer.go | 118 ++++++++---------------- pkg/printer/printer_test.go | 3 +- 19 files changed, 179 insertions(+), 322 deletions(-) diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index 11e39da..0eb1d67 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -6431,7 +6431,7 @@ func TestStmtForeach_Alt(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltForeach{ + &ast.StmtForeach{ Node: ast.Node{ Position: &position.Position{ StartLine: 1, @@ -6440,6 +6440,7 @@ func TestStmtForeach_Alt(t *testing.T) { EndPos: 35, }, }, + Alt: true, Expr: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 324e99211e77ff85fc478fa9c5a4663b0e960af2..498f6b5468fba0723139ac5341758a126490bb1a 100644 GIT binary patch delta 9266 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

&}Xf zT=*guyxrDHR?mDO%ZaC*g^#^{ucE)nlb~1sr61vPbA0N*aGKYomwMn|;sfH6Gtlvt z^I~%-t&s8&%J(by2h=n^O8y-WCUdllez<_8q14g%5TW*7!almf8W+Ao61*W)q$0xlLdqpOt$Q(E_ITb zLI!~3#`1}aBa;Zr>V@+l#lPECqia_v^RhCdnv za(#Le`XfhgG@Vt&g#UWUPlYSTtWrZhmf#;|+2%g-gdS>`ulL<6&oq9WTycxAc;Qrh zyy#I>#Vx&L5%+l+h+kQY?(L3TIf(Zc!ha@6_T|bWnydqKvJ@UFhzkeEfx0_3QEiJR zWW%8 zT(0DiLlHQk5Y-e*OD*2CK%V2_BV`Q#Z5ZAg955ePyk(@U=ZiPWeESaJZw}!KAV#4@ z;qQk_m(Q)%j+FiFHVe7!;#Q-eH%gTm?wRRW`6wL=<|e5MeZbciA0CA=S?{Kpidzw8 zn2%k>gxH7;Tm2Kl((orxj%dF7q{)~1P|=!i&A`klr@&?&!gYTogkM3 z>=0WAz<-SrGzm(;pDTrL zb<<=j@yR>j81KJ{r%i)r8WsYu&E{A;-c+$GK5t2U+jKY~C)7=amqLDQhL#(YX*v$_ z$uof#2L7%Pe^sJA=j3BvtB~uT!GNUUQ|VSaO67|%uNf4i+afhvUax^gp`Dr|c;=t9 zhs;3K#ozr&7HAKJhNZ>xu_@ZZCZin*N$P@DszRz}0`V3|j2;7a`s&1-LtL{LcARjp z9EZARn%$NPnR!$bHO(O_&dX>GMhA&sTi6JG3V8G>Gz;kxzXZCNij2^Xd7L4P4;?YZxmWGaip4>_N{v)^=rj1R6 z2Q&pdGzta}6h4q`X`e$E&B~b)BYO)DhwC^ROydnO^ zdSIp1q~qFQ^w;F|J<@|l!{xxGK$HEvVl#FCeNy@%DG{wGxD(={<$7aD?HBuV@TeGp zEHoNAz7}Z>EYR1 zk?EBS02=-7k!i%=Z__}DltVew`EZDM!*Fqp&VZXRCVde#scfg5YSD}wW}lpntPKNr63;scw)JeSJf=%O*g<=Ku?|ZyhX_-J49?oGC76XD zkiB?%N6?^4+14ps=zzq4(&tim@hhQVV%CZ!3QO)Mt~jXQV!r3P*6Kr?aTw`pm&a7D zKZ?sUB+%F3juD76l*W!dva2397zi~bBzH1(JT6u6o%{tf$)|?{?-2j|JudIo+$h!>-#BVWRPUdb59;!xb6oeT z7Ekz5{)Unk8dGB)k-@7Q08hFVH&rhA3{Jr08Ln&3i_S=07~o?U|Ds>G+w=NZ9u0a7|O(Obll5bLX&y zrtU8wg~P0L7f?GiWYSbB%ss)NUic0A<^=FV$1bRq`Ma)ZHoeeMp22J+rpkp5NVv%$^6_(*t1+jyo2w(6m%%w6zOI|qhd0Gy9CD$v)kSjm zjOUgxxk0aX^m};?wg|ZZ`pm=`dMUidMggH~877=;=P*LKCFd64m-Bg(L@WEW+^zT-ZNwdN zHIE({j=0d+>cf#%CR%Q%a*nm)B%iq18en;Y0rNac&sud-sTaptrjIrc*G{nR)K=A> z^dPlulGRQRcg?$qBE8VyMwWWC*qVkCfS>-&@6HCta&Cv?oS-+Ro4^lF&vL;OErRRI zr&#mNC|zf);|{A>`|#p)Yo6d=rXiOQ^`NeE1y@hUlPjp7Ho*`+{l`p9H)mPy{|3Y$ Bx=R26 delta 9274 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 w6HcNkE!OQ;)t7(D@%PjAI1OHdDDF6Tf diff --git a/internal/php5/php5.y b/internal/php5/php5.y index f599ddd..5fb516e 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -1094,79 +1094,39 @@ unticked_statement: } | T_FOREACH '(' variable T_AS foreach_variable foreach_optional_arg ')' foreach_statement { + $8.(*ast.StmtForeach).ForeachTkn = $1 + $8.(*ast.StmtForeach).OpenParenthesisTkn = $2 + $8.(*ast.StmtForeach).Expr = $3 + $8.(*ast.StmtForeach).AsTkn = $4 if $6 == nil { - switch n := $8.(type) { - case *ast.StmtForeach : - n.Expr = $3 - n.Var = $5 - case *ast.StmtAltForeach : - n.Expr = $3 - n.Var = $5 - } + $8.(*ast.StmtForeach).Var = $5 } else { - switch n := $8.(type) { - case *ast.StmtForeach : - n.Expr = $3 - n.Key = $5 - n.Var = $6 - case *ast.StmtAltForeach : - n.Expr = $3 - n.Key = $5 - n.Var = $6 - } + $8.(*ast.StmtForeach).Key = $5 + $8.(*ast.StmtForeach).DoubleArrowTkn = $6.(*ast.StmtForeach).DoubleArrowTkn + $8.(*ast.StmtForeach).Var = $6.(*ast.StmtForeach).Var } + $8.(*ast.StmtForeach).CloseParenthesisTkn = $7 + $8.(*ast.StmtForeach).Node.Position = position.NewTokenNodePosition($1, $8) $$ = $8 - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $8) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Foreach, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $4.SkippedTokens) - if $6 != nil { - yylex.(*Parser).setFreeFloatingTokens($$, token.Key, $6.GetNode().Tokens[token.Key]); delete($6.GetNode().Tokens, token.Key) - } - yylex.(*Parser).setFreeFloating($$, token.Var, $7.SkippedTokens) } | T_FOREACH '(' expr_without_variable T_AS foreach_variable foreach_optional_arg ')' foreach_statement { + $8.(*ast.StmtForeach).ForeachTkn = $1 + $8.(*ast.StmtForeach).OpenParenthesisTkn = $2 + $8.(*ast.StmtForeach).Expr = $3 + $8.(*ast.StmtForeach).AsTkn = $4 if $6 == nil { - switch n := $8.(type) { - case *ast.StmtForeach : - n.Expr = $3 - n.Var = $5 - case *ast.StmtAltForeach : - n.Expr = $3 - n.Var = $5 - } + $8.(*ast.StmtForeach).Var = $5 } else { - switch n := $8.(type) { - case *ast.StmtForeach : - n.Expr = $3 - n.Key = $5 - n.Var = $6 - case *ast.StmtAltForeach : - n.Expr = $3 - n.Key = $5 - n.Var = $6 - } + $8.(*ast.StmtForeach).Key = $5 + $8.(*ast.StmtForeach).DoubleArrowTkn = $6.(*ast.StmtForeach).DoubleArrowTkn + $8.(*ast.StmtForeach).Var = $6.(*ast.StmtForeach).Var } + $8.(*ast.StmtForeach).CloseParenthesisTkn = $7 + $8.(*ast.StmtForeach).Node.Position = position.NewTokenNodePosition($1, $8) - // save position $$ = $8 - - $$.GetNode().Position = position.NewTokenNodePosition($1, $8) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Foreach, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $4.SkippedTokens) - if $6 != nil { - yylex.(*Parser).setFreeFloatingTokens($$, token.Key, $6.GetNode().Tokens[token.Key]); delete($6.GetNode().Tokens, token.Key) - } - yylex.(*Parser).setFreeFloating($$, token.Var, $7.SkippedTokens) } | T_DECLARE '(' declare_list ')' declare_statement { @@ -1586,10 +1546,10 @@ foreach_optional_arg: } | T_DOUBLE_ARROW foreach_variable { - $$ = $2 - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Key, $1.SkippedTokens) + $$ = &ast.StmtForeach{ + DoubleArrowTkn: $1, + Var: $2, + } } ; @@ -1655,29 +1615,30 @@ for_statement: foreach_statement: statement { - $$ = &ast.StmtForeach{ast.Node{}, nil, nil, nil, $1} - - // save position - $$.GetNode().Position = position.NewNodePosition($1) + $$ = &ast.StmtForeach{ + Node: ast.Node{ + Position: position.NewNodePosition($1), + }, + Stmt: $1, + } } | ':' inner_statement_list T_ENDFOREACH ';' { - stmtList := &ast.StmtStmtList{ + $$ = &ast.StmtForeach{ Node: ast.Node{ - Position: position.NewNodeListPosition($2), + Position: position.NewTokensPosition($1, $4), }, - Stmts: $2, + Alt: true, + ColonTkn: $1, + Stmt: &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Stmts: $2, + }, + EndForeachTkn: $3, + SemiColonTkn: $4, } - $$ = &ast.StmtAltForeach{ast.Node{}, nil, nil, nil, stmtList} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $4) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Cond, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Stmts, $3.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.AltEnd, $4.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $4.SkippedTokens) } ; diff --git a/internal/php5/php5_test.go b/internal/php5/php5_test.go index 8537e6c..406f860 100644 --- a/internal/php5/php5_test.go +++ b/internal/php5/php5_test.go @@ -4705,7 +4705,7 @@ func TestPhp5(t *testing.T) { Stmts: []ast.Vertex{}, }, }, - &ast.StmtAltForeach{ + &ast.StmtForeach{ Node: ast.Node{ Position: &position.Position{ StartLine: 81, @@ -4714,6 +4714,7 @@ func TestPhp5(t *testing.T) { EndPos: 1762, }, }, + Alt: true, Expr: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ diff --git a/internal/php7/parser_test.go b/internal/php7/parser_test.go index 5efe233..94835e1 100644 --- a/internal/php7/parser_test.go +++ b/internal/php7/parser_test.go @@ -7028,7 +7028,7 @@ func TestStmtForeach_Alt(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltForeach{ + &ast.StmtForeach{ Node: ast.Node{ Position: &position.Position{ StartLine: 1, @@ -7037,6 +7037,7 @@ func TestStmtForeach_Alt(t *testing.T) { EndPos: 35, }, }, + Alt: true, Expr: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 56d0fc96060dce48607931670beb6660c7c39032..4b801a5b3ae24a87ce3b4613bacb781be912af34 100644 GIT binary patch delta 11444 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 nsCf%|(jFQOK99D{@do{(y_H%% ") - } - - p.Print(nn.Var) - - io.WriteString(p.w, ") :\n") - - s := nn.Stmt.(*ast.StmtStmtList) - p.printNodes(s.Stmts) - - io.WriteString(p.w, "\n") - p.printIndent() - io.WriteString(p.w, "endforeach;") -} - func (p *PrettyPrinter) printStmtAltIf(n ast.Vertex) { nn := n.(*ast.StmtIf) @@ -1749,6 +1723,11 @@ func (p *PrettyPrinter) printStmtAltFor(n ast.Vertex) { func (p *PrettyPrinter) printStmtForeach(n ast.Vertex) { nn := n.(*ast.StmtForeach) + if nn.Alt { + p.printStmtAltForeach(n) + return + } + io.WriteString(p.w, "foreach (") p.Print(nn.Expr) io.WriteString(p.w, " as ") @@ -1777,6 +1756,30 @@ func (p *PrettyPrinter) printStmtForeach(n ast.Vertex) { } } +func (p *PrettyPrinter) printStmtAltForeach(n ast.Vertex) { + nn := n.(*ast.StmtForeach) + + io.WriteString(p.w, "foreach (") + p.Print(nn.Expr) + io.WriteString(p.w, " as ") + + if nn.Key != nil { + p.Print(nn.Key) + io.WriteString(p.w, " => ") + } + + p.Print(nn.Var) + + io.WriteString(p.w, ") :\n") + + s := nn.Stmt.(*ast.StmtStmtList) + p.printNodes(s.Stmts) + + io.WriteString(p.w, "\n") + p.printIndent() + io.WriteString(p.w, "endforeach;") +} + func (p *PrettyPrinter) printStmtFunction(n ast.Vertex) { nn := n.(*ast.StmtFunction) diff --git a/pkg/printer/pretty_printer_test.go b/pkg/printer/pretty_printer_test.go index 54fcdd0..82ac6ef 100644 --- a/pkg/printer/pretty_printer_test.go +++ b/pkg/printer/pretty_printer_test.go @@ -2210,7 +2210,8 @@ func TestPrintAltForeach(t *testing.T) { p := printer.NewPrettyPrinter(o, " ") p.Print(&ast.StmtNamespace{ Stmts: []ast.Vertex{ - &ast.StmtAltForeach{ + &ast.StmtForeach{ + Alt: true, Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, Key: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("key")}}, Var: &ast.ExprReference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("val")}}}, diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index 0068785..b808de1 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -386,8 +386,6 @@ func (p *Printer) printNode(n ast.Vertex) { // stmt - case *ast.StmtAltForeach: - p.printStmtAltForeach(n) case *ast.StmtBreak: p.printStmtBreak(n) case *ast.StmtCase: @@ -1996,54 +1994,6 @@ func (p *Printer) printExprYield(n ast.Vertex) { // smtm -func (p *Printer) printStmtAltForeach(n ast.Vertex) { - nn := n.(*ast.StmtAltForeach) - p.printFreeFloating(nn, token.Start) - - p.write([]byte("foreach")) - p.printFreeFloating(nn, token.Foreach) - p.write([]byte("(")) - p.Print(nn.Expr) - p.printFreeFloating(nn, token.Expr) - if nn.GetNode().Tokens.IsEmpty() { - p.write([]byte(" ")) - } - p.write([]byte("as")) - - if nn.Key != nil { - if nn.Key.GetNode().Tokens.IsEmpty() { - p.write([]byte(" ")) - } - p.Print(nn.Key) - p.printFreeFloating(nn, token.Key) - p.write([]byte("=>")) - } else { - if nn.Var.GetNode().Tokens.IsEmpty() { - p.write([]byte(" ")) - } - } - - p.Print(nn.Var) - p.printFreeFloating(nn, token.Var) - - p.write([]byte(")")) - p.printFreeFloating(nn, token.Cond) - - p.write([]byte(":")) - s := nn.Stmt.(*ast.StmtStmtList) - p.printNodes(s.Stmts) - p.printFreeFloating(nn, token.Stmts) - - p.write([]byte("endforeach")) - p.printFreeFloating(nn, token.AltEnd) - p.printFreeFloating(nn, token.SemiColon) - if nn.GetNode().Tokens.IsEmpty() { - p.write([]byte(";")) - } - - p.printFreeFloating(nn, token.End) -} - func (p *Printer) printStmtBreak(n *ast.StmtBreak) { p.printToken(n.BreakTkn, "break") @@ -2407,42 +2357,50 @@ func (p *Printer) printStmtAltFor(n *ast.StmtFor) { p.printToken(n.SemiColonTkn, ";") } -func (p *Printer) printStmtForeach(n ast.Vertex) { - nn := n.(*ast.StmtForeach) - p.printFreeFloating(nn, token.Start) - - p.write([]byte("foreach")) - p.printFreeFloating(nn, token.Foreach) - p.write([]byte("(")) - - p.Print(nn.Expr) - p.printFreeFloating(nn, token.Expr) - if nn.GetNode().Tokens.IsEmpty() { - p.write([]byte(" ")) +func (p *Printer) printStmtForeach(n *ast.StmtForeach) { + if n.Alt { + p.printStmtAltForeach(n) + return } - p.write([]byte("as")) + p.printToken(n.ForeachTkn, "foreach") + p.printToken(n.OpenParenthesisTkn, "(") + p.Print(n.Expr) + p.bufStart = " " + p.printToken(n.AsTkn, "as") + p.bufStart = " " + if n.Key != nil { + p.Print(n.Key) + p.printToken(n.DoubleArrowTkn, "=>") + } + p.Print(n.Var) + p.printToken(n.CloseParenthesisTkn, ")") + p.Print(n.Stmt) +} - if nn.Key != nil { - if nn.Key.GetNode().Tokens.IsEmpty() { - p.write([]byte(" ")) - } - p.Print(nn.Key) - p.printFreeFloating(nn, token.Key) - p.write([]byte("=>")) +func (p *Printer) printStmtAltForeach(n *ast.StmtForeach) { + p.printToken(n.ForeachTkn, "foreach") + p.printToken(n.OpenParenthesisTkn, "(") + p.Print(n.Expr) + p.bufStart = " " + p.printToken(n.AsTkn, "as") + p.bufStart = " " + if n.Key != nil { + p.Print(n.Key) + p.printToken(n.DoubleArrowTkn, "=>") + } + p.Print(n.Var) + p.printToken(n.CloseParenthesisTkn, ")") + p.printToken(n.ColonTkn, ":") + + if stmtList, ok := n.Stmt.(*ast.StmtStmtList); ok { + p.printNodes(stmtList.Stmts) } else { - if nn.Var.GetNode().Tokens.IsEmpty() { - p.write([]byte(" ")) - } + p.Print(n.Stmt) } - p.Print(nn.Var) - p.printFreeFloating(nn, token.Var) - p.write([]byte(")")) - - p.Print(nn.Stmt) - - p.printFreeFloating(nn, token.End) + p.printToken(n.EndForeachTkn, "endforeach") + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtFunction(n ast.Vertex) { diff --git a/pkg/printer/printer_test.go b/pkg/printer/printer_test.go index de97168..8956574 100644 --- a/pkg/printer/printer_test.go +++ b/pkg/printer/printer_test.go @@ -2667,7 +2667,8 @@ func TestPrinterPrintAltForeach(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&ast.StmtAltForeach{ + p.Print(&ast.StmtForeach{ + Alt: true, Expr: &ast.ExprVariable{ VarName: &ast.Identifier{Value: []byte("$var")}, },