From 6976388a8269b274acfbf995397deeb317bbab5a Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Thu, 3 Sep 2020 22:18:06 +0300 Subject: [PATCH] [refactoring] update ast structure of "If", "ElseIf", "Else" nodes --- internal/php5/parser_test.go | 27 ++- internal/php5/php5.go | Bin 296051 -> 295688 bytes internal/php5/php5.y | 214 +++++++++++-------- internal/php5/php5_test.go | 27 ++- internal/php7/parser_test.go | 27 ++- internal/php7/php7.go | Bin 251037 -> 248339 bytes internal/php7/php7.y | 273 +++++++++++++----------- internal/php7/php7_test.go | 27 ++- pkg/ast/ast.go | 3 - pkg/ast/node.go | 67 +++--- pkg/ast/traverser/dfs.go | 58 ----- pkg/ast/visitor/dump.go | 33 ++- pkg/ast/visitor/filter_parser_nodes.go | 54 ----- pkg/ast/visitor/filter_tokens.go | 26 +++ pkg/ast/visitor/null.go | 12 -- pkg/printer/pretty_printer.go | 27 ++- pkg/printer/pretty_printer_test.go | 24 ++- pkg/printer/printer.go | 236 ++++++-------------- pkg/printer/printer_parsed_php5_test.go | 6 +- pkg/printer/printer_parsed_php7_test.go | 6 +- pkg/printer/printer_test.go | 26 ++- 21 files changed, 537 insertions(+), 636 deletions(-) diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index 52dc6df..0a8d776 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -3660,7 +3660,7 @@ func TestStmtAltIf_AltIf(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 2, @@ -3669,6 +3669,7 @@ func TestStmtAltIf_AltIf(t *testing.T) { EndPos: 23, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3731,7 +3732,7 @@ func TestStmtAltIf_AltElseIf(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 2, @@ -3740,6 +3741,7 @@ func TestStmtAltIf_AltElseIf(t *testing.T) { EndPos: 38, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3773,7 +3775,7 @@ func TestStmtAltIf_AltElseIf(t *testing.T) { Stmts: []ast.Vertex{}, }, ElseIf: []ast.Vertex{ - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 3, @@ -3782,6 +3784,7 @@ func TestStmtAltIf_AltElseIf(t *testing.T) { EndPos: -1, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3846,7 +3849,7 @@ func TestStmtAltIf_AltElse(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 2, @@ -3855,6 +3858,7 @@ func TestStmtAltIf_AltElse(t *testing.T) { EndPos: 31, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3887,7 +3891,7 @@ func TestStmtAltIf_AltElse(t *testing.T) { }, Stmts: []ast.Vertex{}, }, - Else: &ast.StmtAltElse{ + Else: &ast.StmtElse{ Node: ast.Node{ Position: &position.Position{ StartLine: 3, @@ -3896,6 +3900,7 @@ func TestStmtAltIf_AltElse(t *testing.T) { EndPos: -1, }, }, + Alt: true, Stmt: &ast.StmtStmtList{ Node: ast.Node{ Position: &position.Position{ @@ -3940,7 +3945,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 2, @@ -3949,6 +3954,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { EndPos: 61, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3982,7 +3988,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { Stmts: []ast.Vertex{}, }, ElseIf: []ast.Vertex{ - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 3, @@ -3991,6 +3997,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { EndPos: -1, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -4024,7 +4031,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { Stmts: []ast.Vertex{}, }, }, - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 4, @@ -4033,6 +4040,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { EndPos: -1, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -4067,7 +4075,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { }, }, }, - Else: &ast.StmtAltElse{ + Else: &ast.StmtElse{ Node: ast.Node{ Position: &position.Position{ StartLine: 5, @@ -4076,6 +4084,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { EndPos: -1, }, }, + Alt: true, Stmt: &ast.StmtStmtList{ Node: ast.Node{ Position: &position.Position{ diff --git a/internal/php5/php5.go b/internal/php5/php5.go index caf5d7472aa1f5cecd3bc73938674a68af440074..953db897e00983ea3c13adb39882cde84a6f7924 100644 GIT binary patch delta 10238 zcmdT~d3ct^wSUgc`(-60BqTuAFDxNan&kVkvj>o{6Oct@OA3jgkc0$~EfBzp3Th(C z;ZniCqZhdf1T2hfirhY;mzEu?wJdJbS}6f->n)=9H}k$Kx4D7Ag}kYN1P*#8YF8~b2+54ZkXUnY~ee+nh{ zD6g1NnwHwFqlD`tg4cuuPcNx1b!Tz%1{x^xa=Cs0C28GwM$lwVE2Ur#PNA@F1+#rS znFZ{B=2gviw)_93w*eKiE6VMIX011_sS+Up!A70j`UZl55(NQ8VkDeyuxL+|@>aGWAwV+G|nkGqkhE{<# zTJVZOO5(T$6v?lrioIOqk;{2hqm1Rtk5E5e_7rvGz4NJ%MY3-(5VsZ5laax1rlHSW zBwSpxnA-mJ1)>+zVBXTzAyy#nAb9jKXFQ%%Vjs1AwQifGK7NcI5aelAkxP}Yr3tqy4a*%O-trU; zf_7Jg`os^cqfZ3oFr`^-_pPIuE|`P!oho?SVoK!a<7F##awA1coC0-$g4e90P!+zJ za$E9qu|fws)!S&N5cyvI z(2aw7(oL5@n++m^ z@7qI#BCF+Mr}xlc%C}cfETnk8_f>Rc@|IVrUgTu(+($%Dg?+|bBF~v;$XxruM9EZ< z$5V5}I&Oae&C?U1@Ou4~yvXu!$U!jDuts`$)j_P8%gKkq?urO3}{rp#8NGf~wTilk|et-@-HS zKKB_KFLJyJjV(mkoNS3q9&rxrLOJ2*DVfzdSXqw3_g(_;y?+U|KYbT{nF`;#N$V_z zFQi1JwJdR&jukxH3&JF8<)T=hBCG0?pdM} zclotX-<$CTPAJBLm-n%fwpG3*h`U@wFH9J{>WPcgv4vIgiOY0F^IPya9a2>v(K6Vc zy8a0Tk??rzUUh|53O=$7hJEXEIR33KWFi;4L^*%`TWvueg~_=R2LQ9|u3o%KL-is} z*XW>dwpenzn zDOFoK=> z3&v3_)o^mC7zaJ!q_aB;WvB8xVsX$ht9 zic;B=o5JJ|+t^s3g)#ApWJKWFX=KG21kt>mgAmPx8vb2`xJP)hcyzev%rn}+d_4;( z$+!5T1V3W)!!&&ywxy1)m+f6feC}Q*<6U=PAC8R_t+`Js;9q*Ai01>@2s}@>6+?LI z9!OR>U&L{%Xf!Xo(KH^kC>r*Y?Rcok4iqEcp?rP1IL2NC<&D;L52L3I7fpi0uk9;e;aVv>aK9UJ9fx!W7QD$zJ;DbW6gmnB9Q#J&)r3sZm$)_*s0D-3>R6VTMtpre_D6)-$2W3B zp>{Wu(amm)aIBRxeQEtF9+GG`RKSBZSySs-%Mp*{lW$T^heF@>>sDY89!&T2!+ z-B*i_>gBryz!)IMqq?&%pDe;AC&)@*j9lls&2$$htq}#>Gzf?69w_?pkprS5mkh

`SQ5vDRniuPnMT2exZ6Y=XP%91%@n}2wp=zz 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 diff --git a/internal/php5/php5.y b/internal/php5/php5.y index 05a8884..38a0d87 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -855,46 +855,49 @@ unticked_statement: } | T_IF parenthesis_expr statement elseif_list else_single { - $$ = &ast.StmtIf{ast.Node{}, $2, $3, $4, $5} - - // save position + pos := position.NewTokenNodePosition($1, $3) if $5 != nil { - $$.GetNode().Position = position.NewTokenNodePosition($1, $5) + pos = position.NewTokenNodePosition($1, $5) } else if len($4) > 0 { - $$.GetNode().Position = position.NewTokenNodeListPosition($1, $4) - } else { - $$.GetNode().Position = position.NewTokenNodePosition($1, $3) + pos = position.NewTokenNodeListPosition($1, $4) } - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.StmtIf{ + Node: ast.Node{ + Position: pos, + }, + IfTkn: $1, + OpenParenthesisTkn: $2.(*ast.ParserBrackets).OpenBracketTkn, + Cond: $2.(*ast.ParserBrackets).Child, + CloseParenthesisTkn: $2.(*ast.ParserBrackets).CloseBracketTkn, + Stmt: $3, + ElseIf: $4, + Else: $5, + } } | T_IF parenthesis_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' { - stmts := &ast.StmtStmtList{ + $$ = &ast.StmtIf{ Node: ast.Node{ - Position: position.NewNodeListPosition($4), + Position: position.NewTokensPosition($1, $8), }, - Stmts: $4, + Alt: true, + IfTkn: $1, + OpenParenthesisTkn: $2.(*ast.ParserBrackets).OpenBracketTkn, + Cond: $2.(*ast.ParserBrackets).Child, + CloseParenthesisTkn: $2.(*ast.ParserBrackets).CloseBracketTkn, + ColonTkn: $3, + Stmt: &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($4), + }, + Stmts: $4, + }, + ElseIf: $5, + Else: $6, + EndIfTkn: $7, + SemiColonTkn: $8, } - stmtsBrackets := &ast.ParserBrackets{ast.Node{}, stmts} - $$ = &ast.StmtAltIf{ast.Node{}, $2, stmtsBrackets, $5, $6} - - // save position - stmtsBrackets.GetNode().Position = position.NewTokenNodeListPosition($3, $4) - $$.GetNode().Position = position.NewTokensPosition($1, $8) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloatingTokens(stmtsBrackets, token.Start, $3.SkippedTokens) - if $6 != nil { - yylex.(*Parser).setFreeFloating($6.(*ast.StmtAltElse).Stmt, token.End, append($7.SkippedTokens, $8.SkippedTokens...)) - } else if len($5) > 0 { - yylex.(*Parser).setFreeFloating($5[len($5)-1].(*ast.StmtAltElseIf).Stmt, token.End, append($7.SkippedTokens, $8.SkippedTokens...)) - } else { - yylex.(*Parser).setFreeFloating(stmtsBrackets, token.End, append($7.SkippedTokens, $8.SkippedTokens...)) - } - yylex.(*Parser).setToken($$, token.SemiColon, $8.SkippedTokens) } | T_WHILE parenthesis_expr while_statement { @@ -1946,14 +1949,16 @@ elseif_list: } | elseif_list T_ELSEIF parenthesis_expr statement { - _elseIf := &ast.StmtElseIf{ast.Node{}, $3, $4} - $$ = append($1, _elseIf) - - // save position - _elseIf.GetNode().Position = position.NewTokenNodePosition($2, $4) - - // save comments - yylex.(*Parser).setFreeFloating(_elseIf, token.Start, $2.SkippedTokens) + $$ = append($1, &ast.StmtElseIf{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($2, $4), + }, + ElseIfTkn: $2, + OpenParenthesisTkn: $3.(*ast.ParserBrackets).OpenBracketTkn, + Cond: $3.(*ast.ParserBrackets).Child, + CloseParenthesisTkn: $3.(*ast.ParserBrackets).CloseBracketTkn, + Stmt: $4, + }) } ; @@ -1965,23 +1970,23 @@ new_elseif_list: } | new_elseif_list T_ELSEIF parenthesis_expr ':' inner_statement_list { - stmts := &ast.StmtStmtList{ + $$ = append($1, &ast.StmtElseIf{ Node: ast.Node{ - Position: position.NewNodeListPosition($5), + Position: position.NewTokenNodeListPosition($2, $5), }, - Stmts: $5, - } - stmtsBrackets := &ast.ParserBrackets{ast.Node{}, stmts} - _elseIf := &ast.StmtAltElseIf{ast.Node{}, $3, stmtsBrackets} - $$ = append($1, _elseIf) - - // save position - stmtsBrackets.GetNode().Position = position.NewTokenNodeListPosition($4, $5) - _elseIf.GetNode().Position = position.NewTokenNodeListPosition($2, $5) - - // save comments - yylex.(*Parser).setFreeFloating(_elseIf, token.Start, $2.SkippedTokens) - yylex.(*Parser).setFreeFloatingTokens(stmtsBrackets, token.Start, $4.SkippedTokens) + Alt: true, + ElseIfTkn: $2, + OpenParenthesisTkn: $3.(*ast.ParserBrackets).OpenBracketTkn, + Cond: $3.(*ast.ParserBrackets).Child, + CloseParenthesisTkn: $3.(*ast.ParserBrackets).CloseBracketTkn, + ColonTkn: $4, + Stmt: &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($5), + }, + Stmts: $5, + }, + }) } ; @@ -1993,13 +1998,13 @@ else_single: } | T_ELSE statement { - $$ = &ast.StmtElse{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $2) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.StmtElse{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($1, $2), + }, + ElseTkn: $1, + Stmt: $2, + } } ; @@ -2011,22 +2016,20 @@ new_else_single: } | T_ELSE ':' inner_statement_list { - stmts := &ast.StmtStmtList{ + $$ = &ast.StmtElse{ Node: ast.Node{ - Position: position.NewNodeListPosition($3), + Position: position.NewTokenNodeListPosition($1, $3), + }, + Alt: true, + ElseTkn: $1, + ColonTkn: $2, + Stmt: &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($3), + }, + Stmts: $3, }, - Stmts: $3, } - stmtsBrackets := &ast.ParserBrackets{ast.Node{}, stmts} - $$ = &ast.StmtAltElse{ast.Node{}, stmtsBrackets} - - // save position - stmtsBrackets.GetNode().Position = position.NewTokenNodeListPosition($2, $3) - $$.GetNode().Position = position.NewTokenNodeListPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloatingTokens(stmtsBrackets, token.Start, $2.SkippedTokens) } ; @@ -4318,10 +4321,13 @@ exit_expr: } | '(' ')' { - $$ = &ast.ParserBrackets{ast.Node{}, nil} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $2) + $$ = &ast.ParserBrackets{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $2), + }, + OpenBracketTkn: $1, + CloseBracketTkn: $2, + } // save comments yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.SkippedTokens) @@ -5166,10 +5172,14 @@ expr: parenthesis_expr: '(' expr ')' { - $$ = &ast.ParserBrackets{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) + $$ = &ast.ParserBrackets{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenBracketTkn: $1, + Child: $2, + CloseBracketTkn: $3, + } // save comments yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.SkippedTokens) @@ -5177,10 +5187,14 @@ parenthesis_expr: } | '(' yield_expr ')' { - $$ = &ast.ParserBrackets{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) + $$ = &ast.ParserBrackets{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenBracketTkn: $1, + Child: $2, + CloseBracketTkn: $3, + } // save comments yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.SkippedTokens) @@ -6008,11 +6022,17 @@ internal_functions_in_yacc: } | T_EMPTY '(' variable ')' { - exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + exprBrackets := &ast.ParserBrackets{ + Node: ast.Node{ + Position: position.NewTokensPosition($2, $4), + }, + OpenBracketTkn: $2, + Child: $3, + CloseBracketTkn: $4, + } $$ = &ast.ExprEmpty{ast.Node{}, exprBrackets} // save position - exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments @@ -6022,11 +6042,17 @@ internal_functions_in_yacc: } | T_EMPTY '(' expr ')' { - exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + exprBrackets := &ast.ParserBrackets{ + Node: ast.Node{ + Position: position.NewTokensPosition($2, $4), + }, + OpenBracketTkn: $2, + Child: $3, + CloseBracketTkn: $4, + } $$ = &ast.ExprEmpty{ast.Node{}, exprBrackets} // save position - exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments @@ -6056,11 +6082,17 @@ internal_functions_in_yacc: } | T_EVAL '(' expr ')' { - exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + exprBrackets := &ast.ParserBrackets{ + Node: ast.Node{ + Position: position.NewTokensPosition($2, $4), + }, + OpenBracketTkn: $2, + Child: $3, + CloseBracketTkn: $4, + } $$ = &ast.ExprEval{ast.Node{}, exprBrackets} // save position - exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments diff --git a/internal/php5/php5_test.go b/internal/php5/php5_test.go index ad42cb2..535f8c7 100644 --- a/internal/php5/php5_test.go +++ b/internal/php5/php5_test.go @@ -2603,7 +2603,7 @@ func TestPhp5(t *testing.T) { }, }, }, - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 41, @@ -2612,6 +2612,7 @@ func TestPhp5(t *testing.T) { EndPos: 867, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -2645,7 +2646,7 @@ func TestPhp5(t *testing.T) { Stmts: []ast.Vertex{}, }, }, - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 43, @@ -2654,6 +2655,7 @@ func TestPhp5(t *testing.T) { EndPos: 897, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -2687,7 +2689,7 @@ func TestPhp5(t *testing.T) { Stmts: []ast.Vertex{}, }, ElseIf: []ast.Vertex{ - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 44, @@ -2696,6 +2698,7 @@ func TestPhp5(t *testing.T) { EndPos: -1, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -2731,7 +2734,7 @@ func TestPhp5(t *testing.T) { }, }, }, - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 46, @@ -2740,6 +2743,7 @@ func TestPhp5(t *testing.T) { EndPos: 920, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -2772,7 +2776,7 @@ func TestPhp5(t *testing.T) { }, Stmts: []ast.Vertex{}, }, - Else: &ast.StmtAltElse{ + Else: &ast.StmtElse{ Node: ast.Node{ Position: &position.Position{ StartLine: 47, @@ -2781,6 +2785,7 @@ func TestPhp5(t *testing.T) { EndPos: -1, }, }, + Alt: true, Stmt: &ast.StmtStmtList{ Node: ast.Node{ Position: &position.Position{ @@ -2794,7 +2799,7 @@ func TestPhp5(t *testing.T) { }, }, }, - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 49, @@ -2803,6 +2808,7 @@ func TestPhp5(t *testing.T) { EndPos: 969, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -2836,7 +2842,7 @@ func TestPhp5(t *testing.T) { Stmts: []ast.Vertex{}, }, ElseIf: []ast.Vertex{ - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 50, @@ -2845,6 +2851,7 @@ func TestPhp5(t *testing.T) { EndPos: -1, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -2878,7 +2885,7 @@ func TestPhp5(t *testing.T) { Stmts: []ast.Vertex{}, }, }, - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 51, @@ -2887,6 +2894,7 @@ func TestPhp5(t *testing.T) { EndPos: -1, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -2921,7 +2929,7 @@ func TestPhp5(t *testing.T) { }, }, }, - Else: &ast.StmtAltElse{ + Else: &ast.StmtElse{ Node: ast.Node{ Position: &position.Position{ StartLine: 52, @@ -2930,6 +2938,7 @@ func TestPhp5(t *testing.T) { EndPos: -1, }, }, + Alt: true, Stmt: &ast.StmtStmtList{ Node: ast.Node{ Position: &position.Position{ diff --git a/internal/php7/parser_test.go b/internal/php7/parser_test.go index b0e66dd..67ce06a 100644 --- a/internal/php7/parser_test.go +++ b/internal/php7/parser_test.go @@ -3811,7 +3811,7 @@ func TestStmtAltIf_AltIf(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 2, @@ -3820,6 +3820,7 @@ func TestStmtAltIf_AltIf(t *testing.T) { EndPos: 23, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3882,7 +3883,7 @@ func TestStmtAltIf_AltElseIf(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 2, @@ -3891,6 +3892,7 @@ func TestStmtAltIf_AltElseIf(t *testing.T) { EndPos: 38, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3924,7 +3926,7 @@ func TestStmtAltIf_AltElseIf(t *testing.T) { Stmts: []ast.Vertex{}, }, ElseIf: []ast.Vertex{ - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 3, @@ -3933,6 +3935,7 @@ func TestStmtAltIf_AltElseIf(t *testing.T) { EndPos: -1, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3997,7 +4000,7 @@ func TestStmtAltIf_AltElse(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 2, @@ -4006,6 +4009,7 @@ func TestStmtAltIf_AltElse(t *testing.T) { EndPos: 31, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -4038,7 +4042,7 @@ func TestStmtAltIf_AltElse(t *testing.T) { }, Stmts: []ast.Vertex{}, }, - Else: &ast.StmtAltElse{ + Else: &ast.StmtElse{ Node: ast.Node{ Position: &position.Position{ StartLine: 3, @@ -4047,6 +4051,7 @@ func TestStmtAltIf_AltElse(t *testing.T) { EndPos: -1, }, }, + Alt: true, Stmt: &ast.StmtStmtList{ Node: ast.Node{ Position: &position.Position{ @@ -4091,7 +4096,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 2, @@ -4100,6 +4105,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { EndPos: 61, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -4133,7 +4139,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { Stmts: []ast.Vertex{}, }, ElseIf: []ast.Vertex{ - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 3, @@ -4142,6 +4148,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { EndPos: -1, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -4175,7 +4182,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { Stmts: []ast.Vertex{}, }, }, - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 4, @@ -4184,6 +4191,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { EndPos: -1, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -4218,7 +4226,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { }, }, }, - Else: &ast.StmtAltElse{ + Else: &ast.StmtElse{ Node: ast.Node{ Position: &position.Position{ StartLine: 5, @@ -4227,6 +4235,7 @@ func TestStmtAltIf_AltElseElseIf(t *testing.T) { EndPos: -1, }, }, + Alt: true, Stmt: &ast.StmtStmtList{ Node: ast.Node{ Position: &position.Position{ diff --git a/internal/php7/php7.go b/internal/php7/php7.go index bfc89708bbc79701ef76007c3ca647035367b6f4..e1a071b4f334091cc5d69e6fdde6b58a82c756eb 100644 GIT binary patch delta 11338 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 Y^nA^aXTEteI){9Sn!YQ|eoJ`&7m3g;#{d8T delta 12697 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 lrhKEU%!NsB=nazu>Z+cCvXd?i*1wJi1N)olP 0 { - yylex.(*Parser).setFreeFloating(altif.ElseIf[len(altif.ElseIf)-1], token.End, append($2.SkippedTokens, $3.SkippedTokens...)) - } else { - yylex.(*Parser).setFreeFloating(altif.Stmt, token.End, append($2.SkippedTokens, $3.SkippedTokens...)) - } - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) } | alt_if_stmt_without_else T_ELSE ':' inner_statement_list T_ENDIF ';' { - stmts := &ast.StmtStmtList{ + $1.(*ast.StmtIf).Else = &ast.StmtElse{ Node: ast.Node{ - Position: position.NewNodeListPosition($4), + Position: position.NewTokenNodeListPosition($2, $4), + }, + Alt: true, + ElseTkn: $2, + ColonTkn: $3, + Stmt: &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($4), + }, + Stmts: $4, }, - Stmts: $4, } - stmtsBrackets := &ast.ParserBrackets{ast.Node{}, stmts} - _else := &ast.StmtAltElse{ast.Node{}, stmtsBrackets} - $1.(*ast.StmtAltIf).Else = _else + $1.(*ast.StmtIf).EndIfTkn = $5 + $1.(*ast.StmtIf).SemiColonTkn = $6 + $1.(*ast.StmtIf).Node.Position = position.NewNodeTokenPosition($1, $6) $$ = $1 - - // save position - stmtsBrackets.GetNode().Position = position.NewTokensPosition($3, $5) - _else.GetNode().Position = position.NewTokenNodeListPosition($2, $4) - $$.GetNode().Position = position.NewNodeTokenPosition($1, $6) - - // save comments - yylex.(*Parser).setFreeFloating(_else, token.Start, $2.SkippedTokens) - yylex.(*Parser).setFreeFloatingTokens(stmtsBrackets, token.Start, $3.SkippedTokens) - yylex.(*Parser).setFreeFloating(stmtsBrackets, token.End, append($5.SkippedTokens, $6.SkippedTokens...)) - yylex.(*Parser).setToken($$, token.SemiColon, $6.SkippedTokens) } ; @@ -3368,10 +3367,14 @@ expr_without_variable: } | '(' expr ')' { - $$ = &ast.ParserBrackets{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) + $$ = &ast.ParserBrackets{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenBracketTkn: $1, + Child: $2, + CloseBracketTkn: $3, + } // save comments yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.SkippedTokens) @@ -3825,10 +3828,14 @@ exit_expr: } | '(' optional_expr ')' { - $$ = &ast.ParserBrackets{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) + $$ = &ast.ParserBrackets{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenBracketTkn: $1, + Child: $2, + CloseBracketTkn: $3, + } // save comments yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.SkippedTokens) @@ -4132,10 +4139,14 @@ dereferencable: } | '(' expr ')' { - $$ = &ast.ParserBrackets{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) + $$ = &ast.ParserBrackets{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenBracketTkn: $1, + Child: $2, + CloseBracketTkn: $3, + } // save comments yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.SkippedTokens) @@ -4154,10 +4165,14 @@ callable_expr: } | '(' expr ')' { - $$ = &ast.ParserBrackets{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) + $$ = &ast.ParserBrackets{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenBracketTkn: $1, + Child: $2, + CloseBracketTkn: $3, + } // save comments yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.SkippedTokens) @@ -4768,11 +4783,17 @@ internal_functions_in_yacc: } | T_EMPTY '(' expr ')' { - exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + exprBrackets := &ast.ParserBrackets{ + Node: ast.Node{ + Position: position.NewTokensPosition($2, $4), + }, + OpenBracketTkn: $2, + Child: $3, + CloseBracketTkn: $4, + } $$ = &ast.ExprEmpty{ast.Node{}, exprBrackets} // save position - exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments @@ -4802,11 +4823,17 @@ internal_functions_in_yacc: } | T_EVAL '(' expr ')' { - exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + exprBrackets := &ast.ParserBrackets{ + Node: ast.Node{ + Position: position.NewTokensPosition($2, $4), + }, + OpenBracketTkn: $2, + Child: $3, + CloseBracketTkn: $4, + } $$ = &ast.ExprEval{ast.Node{}, exprBrackets} // save position - exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments diff --git a/internal/php7/php7_test.go b/internal/php7/php7_test.go index 8f474fa..a12803b 100644 --- a/internal/php7/php7_test.go +++ b/internal/php7/php7_test.go @@ -3375,7 +3375,7 @@ func TestPhp7(t *testing.T) { }, }, }, - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 53, @@ -3384,6 +3384,7 @@ func TestPhp7(t *testing.T) { EndPos: 1111, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3417,7 +3418,7 @@ func TestPhp7(t *testing.T) { Stmts: []ast.Vertex{}, }, }, - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 55, @@ -3426,6 +3427,7 @@ func TestPhp7(t *testing.T) { EndPos: 1141, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3459,7 +3461,7 @@ func TestPhp7(t *testing.T) { Stmts: []ast.Vertex{}, }, ElseIf: []ast.Vertex{ - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 56, @@ -3468,6 +3470,7 @@ func TestPhp7(t *testing.T) { EndPos: -1, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3503,7 +3506,7 @@ func TestPhp7(t *testing.T) { }, }, }, - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 58, @@ -3512,6 +3515,7 @@ func TestPhp7(t *testing.T) { EndPos: 1164, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3544,7 +3548,7 @@ func TestPhp7(t *testing.T) { }, Stmts: []ast.Vertex{}, }, - Else: &ast.StmtAltElse{ + Else: &ast.StmtElse{ Node: ast.Node{ Position: &position.Position{ StartLine: 59, @@ -3553,6 +3557,7 @@ func TestPhp7(t *testing.T) { EndPos: -1, }, }, + Alt: true, Stmt: &ast.StmtStmtList{ Node: ast.Node{ Position: &position.Position{ @@ -3566,7 +3571,7 @@ func TestPhp7(t *testing.T) { }, }, }, - &ast.StmtAltIf{ + &ast.StmtIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 61, @@ -3575,6 +3580,7 @@ func TestPhp7(t *testing.T) { EndPos: 1213, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3608,7 +3614,7 @@ func TestPhp7(t *testing.T) { Stmts: []ast.Vertex{}, }, ElseIf: []ast.Vertex{ - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 62, @@ -3617,6 +3623,7 @@ func TestPhp7(t *testing.T) { EndPos: -1, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3650,7 +3657,7 @@ func TestPhp7(t *testing.T) { Stmts: []ast.Vertex{}, }, }, - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ Node: ast.Node{ Position: &position.Position{ StartLine: 63, @@ -3659,6 +3666,7 @@ func TestPhp7(t *testing.T) { EndPos: -1, }, }, + Alt: true, Cond: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -3693,7 +3701,7 @@ func TestPhp7(t *testing.T) { }, }, }, - Else: &ast.StmtAltElse{ + Else: &ast.StmtElse{ Node: ast.Node{ Position: &position.Position{ StartLine: 64, @@ -3702,6 +3710,7 @@ func TestPhp7(t *testing.T) { EndPos: -1, }, }, + Alt: true, Stmt: &ast.StmtStmtList{ Node: ast.Node{ Position: &position.Position{ diff --git a/pkg/ast/ast.go b/pkg/ast/ast.go index 2da9b8e..4b60110 100644 --- a/pkg/ast/ast.go +++ b/pkg/ast/ast.go @@ -27,11 +27,8 @@ type NodeVisitor interface { ArgumentList(n *ArgumentList) Argument(n *Argument) - StmtAltElse(n *StmtAltElse) - StmtAltElseIf(n *StmtAltElseIf) StmtAltFor(n *StmtAltFor) StmtAltForeach(n *StmtAltForeach) - StmtAltIf(n *StmtAltIf) StmtAltSwitch(n *StmtAltSwitch) StmtAltWhile(n *StmtAltWhile) StmtBreak(n *StmtBreak) diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 2013eee..993b65b 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -175,27 +175,6 @@ func (n *ScalarString) Accept(v NodeVisitor) { v.ScalarString(n) } -// StmtAltElse node -type StmtAltElse struct { - Node - Stmt Vertex -} - -func (n *StmtAltElse) Accept(v NodeVisitor) { - v.StmtAltElse(n) -} - -// StmtAltElseIf node -type StmtAltElseIf struct { - Node - Cond Vertex - Stmt Vertex -} - -func (n *StmtAltElseIf) Accept(v NodeVisitor) { - v.StmtAltElseIf(n) -} - // StmtAltFor node type StmtAltFor struct { Node @@ -222,19 +201,6 @@ func (n *StmtAltForeach) Accept(v NodeVisitor) { v.StmtAltForeach(n) } -// StmtAltIf node -type StmtAltIf struct { - Node - Cond Vertex - Stmt Vertex - ElseIf []Vertex - Else Vertex -} - -func (n *StmtAltIf) Accept(v NodeVisitor) { - v.StmtAltIf(n) -} - // StmtAltSwitch node type StmtAltSwitch struct { Node @@ -444,7 +410,10 @@ func (n *StmtEcho) Accept(v NodeVisitor) { // StmtElse node type StmtElse struct { Node - Stmt Vertex + Alt bool + ElseTkn *token.Token + ColonTkn *token.Token + Stmt Vertex } func (n *StmtElse) Accept(v NodeVisitor) { @@ -454,8 +423,13 @@ func (n *StmtElse) Accept(v NodeVisitor) { // StmtElseIf node type StmtElseIf struct { Node - Cond Vertex - Stmt Vertex + Alt bool + ElseIfTkn *token.Token + OpenParenthesisTkn *token.Token + Cond Vertex + CloseParenthesisTkn *token.Token + ColonTkn *token.Token + Stmt Vertex } func (n *StmtElseIf) Accept(v NodeVisitor) { @@ -558,10 +532,17 @@ func (n *StmtHaltCompiler) Accept(v NodeVisitor) { // StmtIf node type StmtIf struct { Node - Cond Vertex - Stmt Vertex - ElseIf []Vertex - Else Vertex + Alt bool + IfTkn *token.Token + OpenParenthesisTkn *token.Token + Cond Vertex + CloseParenthesisTkn *token.Token + ColonTkn *token.Token + Stmt Vertex + ElseIf []Vertex + Else Vertex + EndIfTkn *token.Token + SemiColonTkn *token.Token } func (n *StmtIf) Accept(v NodeVisitor) { @@ -1918,7 +1899,9 @@ func (n *ParserNsSeparator) Accept(v NodeVisitor) { type ParserBrackets struct { Node - Child Vertex + OpenBracketTkn *token.Token + Child Vertex + CloseBracketTkn *token.Token } func (n *ParserBrackets) Accept(v NodeVisitor) { diff --git a/pkg/ast/traverser/dfs.go b/pkg/ast/traverser/dfs.go index 3d9d5a5..89d6977 100644 --- a/pkg/ast/traverser/dfs.go +++ b/pkg/ast/traverser/dfs.go @@ -119,35 +119,6 @@ func (t *DFS) Traverse(n ast.Vertex) { t.Traverse(nn.Expr) t.visitor.Leave("Expr", true) } - case *ast.StmtAltElse: - if nn == nil { - return - } - if !t.visitor.EnterNode(nn) { - return - } - if nn.Stmt != nil { - t.visitor.Enter("Stmt", true) - t.Traverse(nn.Stmt) - t.visitor.Leave("Stmt", true) - } - case *ast.StmtAltElseIf: - if nn == nil { - return - } - if !t.visitor.EnterNode(nn) { - return - } - if nn.Cond != nil { - t.visitor.Enter("Cond", true) - t.Traverse(nn.Cond) - t.visitor.Leave("Cond", true) - } - if nn.Stmt != nil { - t.visitor.Enter("Stmt", true) - t.Traverse(nn.Stmt) - t.visitor.Leave("Stmt", true) - } case *ast.StmtAltFor: if nn == nil { return @@ -208,35 +179,6 @@ func (t *DFS) Traverse(n ast.Vertex) { t.Traverse(nn.Stmt) t.visitor.Leave("Stmt", true) } - case *ast.StmtAltIf: - if nn == nil { - return - } - if !t.visitor.EnterNode(nn) { - return - } - if nn.Cond != nil { - t.visitor.Enter("Cond", true) - t.Traverse(nn.Cond) - t.visitor.Leave("Cond", true) - } - if nn.Stmt != nil { - t.visitor.Enter("Stmt", true) - t.Traverse(nn.Stmt) - t.visitor.Leave("Stmt", true) - } - if nn.ElseIf != nil { - t.visitor.Enter("ElseIf", false) - for _, c := range nn.ElseIf { - t.Traverse(c) - } - t.visitor.Leave("ElseIf", false) - } - if nn.Else != nil { - t.visitor.Enter("Else", true) - t.Traverse(nn.Else) - t.visitor.Leave("Else", true) - } case *ast.StmtAltSwitch: if nn == nil { return diff --git a/pkg/ast/visitor/dump.go b/pkg/ast/visitor/dump.go index 61deec6..874e88d 100644 --- a/pkg/ast/visitor/dump.go +++ b/pkg/ast/visitor/dump.go @@ -252,18 +252,6 @@ func (v *Dump) Argument(n *ast.Argument) { } } -func (v *Dump) StmtAltElse(n *ast.StmtAltElse) { - v.printIndentIfNotSingle(v.indent - 1) - v.print("&ast.StmtAltElse{\n") - v.printNode(n.GetNode()) -} - -func (v *Dump) StmtAltElseIf(n *ast.StmtAltElseIf) { - v.printIndentIfNotSingle(v.indent - 1) - v.print("&ast.StmtAltElseIf{\n") - v.printNode(n.GetNode()) -} - func (v *Dump) StmtAltFor(n *ast.StmtAltFor) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.StmtAltFor{\n") @@ -276,12 +264,6 @@ func (v *Dump) StmtAltForeach(n *ast.StmtAltForeach) { v.printNode(n.GetNode()) } -func (v *Dump) StmtAltIf(n *ast.StmtAltIf) { - v.printIndentIfNotSingle(v.indent - 1) - v.print("&ast.StmtAltIf{\n") - v.printNode(n.GetNode()) -} - func (v *Dump) StmtAltSwitch(n *ast.StmtAltSwitch) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.StmtAltSwitch{\n") @@ -404,12 +386,22 @@ func (v *Dump) StmtElse(n *ast.StmtElse) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.StmtElse{\n") v.printNode(n.GetNode()) + + if n.Alt { + v.printIndent(v.indent) + v.print("Alt: true,\n") + } } func (v *Dump) StmtElseIf(n *ast.StmtElseIf) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.StmtElseIf{\n") v.printNode(n.GetNode()) + + if n.Alt { + v.printIndent(v.indent) + v.print("Alt: true,\n") + } } func (v *Dump) StmtExpression(n *ast.StmtExpression) { @@ -469,6 +461,11 @@ func (v *Dump) StmtIf(n *ast.StmtIf) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.StmtIf{\n") v.printNode(n.GetNode()) + + if n.Alt { + v.printIndent(v.indent) + v.print("Alt: true,\n") + } } func (v *Dump) StmtInlineHtml(n *ast.StmtInlineHtml) { diff --git a/pkg/ast/visitor/filter_parser_nodes.go b/pkg/ast/visitor/filter_parser_nodes.go index 4df410a..859778f 100644 --- a/pkg/ast/visitor/filter_parser_nodes.go +++ b/pkg/ast/visitor/filter_parser_nodes.go @@ -13,60 +13,6 @@ func (v *FilterParserNodes) EnterNode(n ast.Vertex) bool { return true } -func (v *FilterParserNodes) StmtAltIf(n *ast.StmtAltIf) { - for { - if nn, ok := n.Cond.(*ast.ParserBrackets); ok { - n.Cond = nn.Child - } else { - break - } - } - - if nn, ok := n.Stmt.(*ast.ParserBrackets); ok { - n.Stmt = nn.Child - } -} - -func (v *FilterParserNodes) StmtAltElseIf(n *ast.StmtAltElseIf) { - for { - if nn, ok := n.Cond.(*ast.ParserBrackets); ok { - n.Cond = nn.Child - } else { - break - } - } - - if nn, ok := n.Stmt.(*ast.ParserBrackets); ok { - n.Stmt = nn.Child - } -} - -func (v *FilterParserNodes) StmtAltElse(n *ast.StmtAltElse) { - if nn, ok := n.Stmt.(*ast.ParserBrackets); ok { - n.Stmt = nn.Child - } -} - -func (v *FilterParserNodes) StmtIf(n *ast.StmtIf) { - for { - if nn, ok := n.Cond.(*ast.ParserBrackets); ok { - n.Cond = nn.Child - } else { - break - } - } -} - -func (v *FilterParserNodes) StmtElseIf(n *ast.StmtElseIf) { - for { - if nn, ok := n.Cond.(*ast.ParserBrackets); ok { - n.Cond = nn.Child - } else { - break - } - } -} - func (v *FilterParserNodes) StmtWhile(n *ast.StmtWhile) { for { if nn, ok := n.Cond.(*ast.ParserBrackets); ok { diff --git a/pkg/ast/visitor/filter_tokens.go b/pkg/ast/visitor/filter_tokens.go index b368d8a..a1df886 100644 --- a/pkg/ast/visitor/filter_tokens.go +++ b/pkg/ast/visitor/filter_tokens.go @@ -87,3 +87,29 @@ func (v *FilterTokens) StmtStmtList(n *ast.StmtStmtList) { n.OpenCurlyBracket = nil n.CloseCurlyBracket = nil } + +func (v *FilterTokens) StmtIf(n *ast.StmtIf) { + n.IfTkn = nil + n.OpenParenthesisTkn = nil + n.CloseParenthesisTkn = nil + n.ColonTkn = nil + n.EndIfTkn = nil + n.SemiColonTkn = nil +} + +func (v *FilterTokens) StmtElseIf(n *ast.StmtElseIf) { + n.ElseIfTkn = nil + n.OpenParenthesisTkn = nil + n.CloseParenthesisTkn = nil + n.ColonTkn = nil +} + +func (v *FilterTokens) StmtElse(n *ast.StmtElse) { + n.ElseTkn = nil + n.ColonTkn = nil +} + +func (v *FilterTokens) ParserBrackets(n *ast.ParserBrackets) { + n.OpenBracketTkn = nil + n.CloseBracketTkn = nil +} diff --git a/pkg/ast/visitor/null.go b/pkg/ast/visitor/null.go index 291d8f9..83c590d 100644 --- a/pkg/ast/visitor/null.go +++ b/pkg/ast/visitor/null.go @@ -54,14 +54,6 @@ func (v *Null) Argument(_ *ast.Argument) { // do nothing } -func (v *Null) StmtAltElse(_ *ast.StmtAltElse) { - // do nothing -} - -func (v *Null) StmtAltElseIf(_ *ast.StmtAltElseIf) { - // do nothing -} - func (v *Null) StmtAltFor(_ *ast.StmtAltFor) { // do nothing } @@ -70,10 +62,6 @@ func (v *Null) StmtAltForeach(_ *ast.StmtAltForeach) { // do nothing } -func (v *Null) StmtAltIf(_ *ast.StmtAltIf) { - // do nothing -} - func (v *Null) StmtAltSwitch(_ *ast.StmtAltSwitch) { // do nothing } diff --git a/pkg/printer/pretty_printer.go b/pkg/printer/pretty_printer.go index cd5d20f..b089a24 100644 --- a/pkg/printer/pretty_printer.go +++ b/pkg/printer/pretty_printer.go @@ -297,16 +297,10 @@ func (p *PrettyPrinter) printNode(n ast.Vertex) { // stmt - case *ast.StmtAltElseIf: - p.printStmtAltElseIf(n) - case *ast.StmtAltElse: - p.printStmtAltElse(n) case *ast.StmtAltFor: p.printStmtAltFor(n) case *ast.StmtAltForeach: p.printStmtAltForeach(n) - case *ast.StmtAltIf: - p.printStmtAltIf(n) case *ast.StmtAltSwitch: p.printStmtAltSwitch(n) case *ast.StmtAltWhile: @@ -1348,7 +1342,7 @@ func (p *PrettyPrinter) printExprYield(n ast.Vertex) { // smtm func (p *PrettyPrinter) printStmtAltElseIf(n ast.Vertex) { - nn := n.(*ast.StmtAltElseIf) + nn := n.(*ast.StmtElseIf) io.WriteString(p.w, "elseif (") p.Print(nn.Cond) @@ -1361,7 +1355,7 @@ func (p *PrettyPrinter) printStmtAltElseIf(n ast.Vertex) { } func (p *PrettyPrinter) printStmtAltElse(n ast.Vertex) { - nn := n.(*ast.StmtAltElse) + nn := n.(*ast.StmtElse) io.WriteString(p.w, "else :") @@ -1415,7 +1409,7 @@ func (p *PrettyPrinter) printStmtAltForeach(n ast.Vertex) { } func (p *PrettyPrinter) printStmtAltIf(n ast.Vertex) { - nn := n.(*ast.StmtAltIf) + nn := n.(*ast.StmtIf) io.WriteString(p.w, "if (") p.Print(nn.Cond) @@ -1687,6 +1681,11 @@ func (p *PrettyPrinter) printStmtEcho(n ast.Vertex) { func (p *PrettyPrinter) printStmtElseif(n ast.Vertex) { nn := n.(*ast.StmtElseIf) + if nn.Alt { + p.printStmtAltElseIf(nn) + return + } + io.WriteString(p.w, "elseif (") p.Print(nn.Cond) io.WriteString(p.w, ")") @@ -1710,6 +1709,11 @@ func (p *PrettyPrinter) printStmtElseif(n ast.Vertex) { func (p *PrettyPrinter) printStmtElse(n ast.Vertex) { nn := n.(*ast.StmtElse) + if nn.Alt { + p.printStmtAltElse(nn) + return + } + io.WriteString(p.w, "else") switch s := nn.Stmt.(type) { @@ -1854,6 +1858,11 @@ func (p *PrettyPrinter) printStmtHaltCompiler(n ast.Vertex) { func (p *PrettyPrinter) printStmtIf(n ast.Vertex) { nn := n.(*ast.StmtIf) + if nn.Alt { + p.printStmtAltIf(nn) + return + } + io.WriteString(p.w, "if (") p.Print(nn.Cond) io.WriteString(p.w, ")") diff --git a/pkg/printer/pretty_printer_test.go b/pkg/printer/pretty_printer_test.go index 343703b..f4a3188 100644 --- a/pkg/printer/pretty_printer_test.go +++ b/pkg/printer/pretty_printer_test.go @@ -2090,7 +2090,8 @@ func TestPrintAltElseIf(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&ast.StmtAltElseIf{ + p.Print(&ast.StmtElseIf{ + Alt: true, Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, Stmt: &ast.StmtStmtList{ Stmts: []ast.Vertex{ @@ -2112,7 +2113,8 @@ func TestPrintAltElseIfEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&ast.StmtAltElseIf{ + p.Print(&ast.StmtElseIf{ + Alt: true, Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, Stmt: &ast.StmtStmtList{}, }) @@ -2129,7 +2131,8 @@ func TestPrintAltElse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&ast.StmtAltElse{ + p.Print(&ast.StmtElse{ + Alt: true, Stmt: &ast.StmtStmtList{ Stmts: []ast.Vertex{ &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}}, @@ -2150,7 +2153,8 @@ func TestPrintAltElseEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&ast.StmtAltElse{ + p.Print(&ast.StmtElse{ + Alt: true, Stmt: &ast.StmtStmtList{}, }) @@ -2236,7 +2240,8 @@ func TestPrintAltIf(t *testing.T) { p := printer.NewPrettyPrinter(o, " ") p.Print(&ast.StmtNamespace{ Stmts: []ast.Vertex{ - &ast.StmtAltIf{ + &ast.StmtIf{ + Alt: true, Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, Stmt: &ast.StmtStmtList{ Stmts: []ast.Vertex{ @@ -2244,7 +2249,8 @@ func TestPrintAltIf(t *testing.T) { }, }, ElseIf: []ast.Vertex{ - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ + Alt: true, Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, Stmt: &ast.StmtStmtList{ Stmts: []ast.Vertex{ @@ -2252,12 +2258,14 @@ func TestPrintAltIf(t *testing.T) { }, }, }, - &ast.StmtAltElseIf{ + &ast.StmtElseIf{ + Alt: true, Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("c")}}, Stmt: &ast.StmtStmtList{}, }, }, - Else: &ast.StmtAltElse{ + Else: &ast.StmtElse{ + Alt: true, Stmt: &ast.StmtStmtList{ Stmts: []ast.Vertex{ &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}}, diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index 4d1c2aa..afc80a8 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -359,16 +359,10 @@ func (p *Printer) printNode(n ast.Vertex) { // stmt - case *ast.StmtAltElseIf: - p.printStmtAltElseIf(n) - case *ast.StmtAltElse: - p.printStmtAltElse(n) case *ast.StmtAltFor: p.printStmtAltFor(n) case *ast.StmtAltForeach: p.printStmtAltForeach(n) - case *ast.StmtAltIf: - p.printStmtAltIf(n) case *ast.StmtAltSwitch: p.printStmtAltSwitch(n) case *ast.StmtAltWhile: @@ -1981,68 +1975,6 @@ func (p *Printer) printExprYield(n ast.Vertex) { // smtm -func (p *Printer) printStmtAltElseIf(n ast.Vertex) { - nn := n.(*ast.StmtAltElseIf) - p.printFreeFloating(nn, token.Start) - - io.WriteString(p.w, "elseif") - - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, "(") - } - - p.Print(nn.Cond) - - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, ")") - } - - stmtList, _ := nn.Stmt.(*ast.StmtStmtList) - brackets, ok := nn.Stmt.(*ast.ParserBrackets) - if ok { - p.printFreeFloating(brackets, token.Start) - stmtList = brackets.Child.(*ast.StmtStmtList) - } else { - io.WriteString(p.w, ":") - } - - p.printFreeFloating(stmtList, token.Stmts) - p.printNodes(stmtList.Stmts) - p.printFreeFloating(stmtList, token.End) - - if ok { - p.printFreeFloating(brackets, token.End) - } - - p.printFreeFloating(nn, token.End) -} - -func (p *Printer) printStmtAltElse(n ast.Vertex) { - nn := n.(*ast.StmtAltElse) - p.printFreeFloating(nn, token.Start) - - io.WriteString(p.w, "else") - - stmtList, _ := nn.Stmt.(*ast.StmtStmtList) - brackets, ok := nn.Stmt.(*ast.ParserBrackets) - if ok { - p.printFreeFloating(brackets, token.Start) - stmtList = brackets.Child.(*ast.StmtStmtList) - } else { - io.WriteString(p.w, ":") - } - - p.printFreeFloating(stmtList, token.Stmts) - p.printNodes(stmtList.Stmts) - p.printFreeFloating(stmtList, token.End) - - if ok { - p.printFreeFloating(brackets, token.End) - } - - p.printFreeFloating(nn, token.End) -} - func (p *Printer) printStmtAltFor(n ast.Vertex) { nn := n.(*ast.StmtAltFor) p.printFreeFloating(nn, token.Start) @@ -2124,59 +2056,6 @@ func (p *Printer) printStmtAltForeach(n ast.Vertex) { p.printFreeFloating(nn, token.End) } -func (p *Printer) printStmtAltIf(n ast.Vertex) { - nn := n.(*ast.StmtAltIf) - p.printFreeFloating(nn, token.Start) - - io.WriteString(p.w, "if") - - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, "(") - } - - p.Print(nn.Cond) - - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, ")") - } - - stmtList, _ := nn.Stmt.(*ast.StmtStmtList) - brackets, ok := nn.Stmt.(*ast.ParserBrackets) - if ok { - p.printFreeFloating(brackets, token.Start) - stmtList = brackets.Child.(*ast.StmtStmtList) - } else { - io.WriteString(p.w, ":") - } - - p.printFreeFloating(stmtList, token.Stmts) - p.printNodes(stmtList.Stmts) - p.printFreeFloating(stmtList, token.End) - - if ok { - p.printFreeFloating(brackets, token.End) - } - - for _, elseif := range nn.ElseIf { - p.Print(elseif) - } - - if nn.Else != nil { - p.Print(nn.Else) - } - - if !ok { - io.WriteString(p.w, "endif") - } - - p.printFreeFloating(nn, token.SemiColon) - if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, token.End) -} - func (p *Printer) printStmtAltSwitch(n ast.Vertex) { nn := n.(*ast.StmtAltSwitch) p.printFreeFloating(nn, token.Start) @@ -2579,42 +2458,54 @@ func (p *Printer) printStmtEcho(n ast.Vertex) { p.printFreeFloating(nn, token.End) } -func (p *Printer) printStmtElseif(n ast.Vertex) { - nn := n.(*ast.StmtElseIf) - p.printFreeFloating(nn, token.Start) - - io.WriteString(p.w, "elseif") - - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, "(") +func (p *Printer) printStmtElseif(n *ast.StmtElseIf) { + if n.Alt { + p.printStmtAltElseIf(n) + return } - p.Print(nn.Cond) + p.printToken(n.ElseIfTkn, "elseif") + p.printToken(n.OpenParenthesisTkn, "(") + p.Print(n.Cond) + p.printToken(n.CloseParenthesisTkn, ")") - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, ")") - } - - p.Print(nn.Stmt) - - p.printFreeFloating(nn, token.End) + p.Print(n.Stmt) } -func (p *Printer) printStmtElse(n ast.Vertex) { - nn := n.(*ast.StmtElse) - p.printFreeFloating(nn, token.Start) +func (p *Printer) printStmtAltElseIf(n *ast.StmtElseIf) { + p.printToken(n.ElseIfTkn, "elseif") + p.printToken(n.OpenParenthesisTkn, "(") + p.Print(n.Cond) + p.printToken(n.CloseParenthesisTkn, ")") + p.printToken(n.ColonTkn, ":") - io.WriteString(p.w, "else") + if stmtList, ok := n.Stmt.(*ast.StmtStmtList); ok { + p.printNodes(stmtList.Stmts) + } else { + p.Print(n.Stmt) + } +} - if _, ok := nn.Stmt.(*ast.StmtStmtList); !ok { - if nn.Stmt.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") - } +func (p *Printer) printStmtElse(n *ast.StmtElse) { + if n.Alt { + p.printStmtAltElse(n) + return } - p.Print(nn.Stmt) + p.printToken(n.ElseTkn, "else") + p.bufStart = " " + p.Print(n.Stmt) +} - p.printFreeFloating(nn, token.End) +func (p *Printer) printStmtAltElse(n *ast.StmtElse) { + p.printToken(n.ElseTkn, "else") + p.printToken(n.ColonTkn, ":") + + if stmtList, ok := n.Stmt.(*ast.StmtStmtList); ok { + p.printNodes(stmtList.Stmts) + } else { + p.Print(n.Stmt) + } } func (p *Printer) printStmtExpression(n ast.Vertex) { @@ -2789,33 +2680,40 @@ func (p *Printer) printStmtHaltCompiler(n *ast.StmtHaltCompiler) { p.printToken(n.SemiColonTkn, ";") } -func (p *Printer) printStmtIf(n ast.Vertex) { - nn := n.(*ast.StmtIf) - p.printFreeFloating(nn, token.Start) - - io.WriteString(p.w, "if") - - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, "(") +func (p *Printer) printStmtIf(n *ast.StmtIf) { + if n.Alt { + p.printStmtAltIf(n) + return } - p.Print(nn.Cond) + p.printToken(n.IfTkn, "if") + p.printToken(n.OpenParenthesisTkn, "(") + p.Print(n.Cond) + p.printToken(n.CloseParenthesisTkn, ")") - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, ")") + p.Print(n.Stmt) + p.printNodes(n.ElseIf) + p.Print(n.Else) +} + +func (p *Printer) printStmtAltIf(n *ast.StmtIf) { + p.printToken(n.IfTkn, "if") + p.printToken(n.OpenParenthesisTkn, "(") + p.Print(n.Cond) + p.printToken(n.CloseParenthesisTkn, ")") + p.printToken(n.ColonTkn, ":") + + if stmtList, ok := n.Stmt.(*ast.StmtStmtList); ok { + p.printNodes(stmtList.Stmts) + } else { + p.Print(n.Stmt) } - p.Print(nn.Stmt) + p.printNodes(n.ElseIf) + p.Print(n.Else) - if nn.ElseIf != nil { - p.printNodes(nn.ElseIf) - } - - if nn.Else != nil { - p.Print(nn.Else) - } - - p.printFreeFloating(nn, token.End) + p.printToken(n.EndIfTkn, "endif") + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtInlineHTML(n ast.Vertex) { @@ -2900,7 +2798,7 @@ func (p *Printer) printStmtNamespace(n *ast.StmtNamespace) { } func (p *Printer) printStmtNop(n ast.Vertex) { - p.printFreeFloating(n, token.Start) + p.printFreeFloatingOrDefault(n, token.Start, p.bufStart) p.printFreeFloating(n, token.SemiColon) if n.GetNode().Tokens.IsEmpty() { io.WriteString(p.w, ";") diff --git a/pkg/printer/printer_parsed_php5_test.go b/pkg/printer/printer_parsed_php5_test.go index cd835d9..82dd9a2 100644 --- a/pkg/printer/printer_parsed_php5_test.go +++ b/pkg/printer/printer_parsed_php5_test.go @@ -743,7 +743,8 @@ func TestParseAndPrintPhp5Yield(t *testing.T) { // test stmt func TestParseAndPrintPhp5AltIf(t *testing.T) { - src := `