From 0e73cd8852600f7f329c0603823e1977edc1e618 Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Fri, 4 Sep 2020 11:37:17 +0300 Subject: [PATCH] [refactoring] update ast structure of "For" node --- internal/php5/parser_test.go | 3 +- internal/php5/php5.go | Bin 294399 -> 293827 bytes internal/php5/php5.y | 64 ++++++++---------- internal/php5/php5_test.go | 3 +- internal/php7/parser_test.go | 3 +- internal/php7/php7.go | Bin 247013 -> 246441 bytes internal/php7/php7.y | 64 ++++++++---------- internal/php7/php7_test.go | 3 +- pkg/ast/ast.go | 1 - pkg/ast/node.go | 30 ++++----- pkg/ast/traverser/dfs.go | 33 --------- pkg/ast/visitor/dump.go | 11 ++- pkg/ast/visitor/filter_parser_nodes.go | 38 ----------- pkg/ast/visitor/filter_tokens.go | 11 +++ pkg/ast/visitor/null.go | 4 -- pkg/printer/pretty_printer.go | 45 +++++++------ pkg/printer/pretty_printer_test.go | 3 +- pkg/printer/printer.go | 86 ++++++++++-------------- pkg/printer/printer_parsed_php5_test.go | 6 +- pkg/printer/printer_parsed_php7_test.go | 6 +- pkg/printer/printer_test.go | 3 +- 21 files changed, 161 insertions(+), 256 deletions(-) diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index 725f642..1af3152 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -6141,7 +6141,7 @@ func TestStmtFor_Alt(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltFor{ + &ast.StmtFor{ Node: ast.Node{ Position: &position.Position{ StartLine: 1, @@ -6150,6 +6150,7 @@ func TestStmtFor_Alt(t *testing.T) { EndPos: 33, }, }, + Alt: true, Cond: []ast.Vertex{ &ast.ExprBinarySmaller{ Node: ast.Node{ diff --git a/internal/php5/php5.go b/internal/php5/php5.go index a5870d0bb8a00809c9db70e639580a8c20b8a468..90079efcd239c7b6e05abbbb1cce5f3bc36269c1 100644 GIT binary patch delta 8475 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 S2sI`p&(c1xM$fYTME?T+eWe)y delta 8441 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 B;$#2- diff --git a/internal/php5/php5.y b/internal/php5/php5.y index c5e03a3..4bae606 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -926,28 +926,17 @@ unticked_statement: } | T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement { - switch n := $9.(type) { - case *ast.StmtFor : - n.Init = $3 - n.Cond = $5 - n.Loop = $7 - case *ast.StmtAltFor : - n.Init = $3 - n.Cond = $5 - n.Loop = $7 - } + $9.(*ast.StmtFor).ForTkn = $1 + $9.(*ast.StmtFor).OpenParenthesisTkn = $2 + $9.(*ast.StmtFor).Init = $3 + $9.(*ast.StmtFor).InitSemiColonTkn = $4 + $9.(*ast.StmtFor).Cond = $5 + $9.(*ast.StmtFor).CondSemiColonTkn = $6 + $9.(*ast.StmtFor).Loop = $7 + $9.(*ast.StmtFor).CloseParenthesisTkn = $8 + $9.(*ast.StmtFor).Node.Position = position.NewTokenNodePosition($1, $9) $$ = $9 - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $9) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.For, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.InitExpr, $4.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.CondExpr, $6.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.IncExpr, $8.SkippedTokens) } | T_SWITCH parenthesis_expr switch_case_list { @@ -1668,29 +1657,30 @@ foreach_variable: for_statement: statement { - $$ = &ast.StmtFor{ast.Node{}, nil, nil, nil, $1} - - // save position - $$.GetNode().Position = position.NewNodePosition($1) + $$ = &ast.StmtFor{ + Node: ast.Node{ + Position: position.NewNodePosition($1), + }, + Stmt: $1, + } } | ':' inner_statement_list T_ENDFOR ';' { - stmtList := &ast.StmtStmtList{ + $$ = &ast.StmtFor{ 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, + }, + EndForTkn: $3, + SemiColonTkn: $4, } - $$ = &ast.StmtAltFor{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 de9eb19..1fdd0e7 100644 --- a/internal/php5/php5_test.go +++ b/internal/php5/php5_test.go @@ -4490,7 +4490,7 @@ func TestPhp5(t *testing.T) { Stmts: []ast.Vertex{}, }, }, - &ast.StmtAltFor{ + &ast.StmtFor{ Node: ast.Node{ Position: &position.Position{ StartLine: 78, @@ -4499,6 +4499,7 @@ func TestPhp5(t *testing.T) { EndPos: 1685, }, }, + Alt: true, Cond: []ast.Vertex{ &ast.ExprBinarySmaller{ Node: ast.Node{ diff --git a/internal/php7/parser_test.go b/internal/php7/parser_test.go index 8421ca1..cfcf491 100644 --- a/internal/php7/parser_test.go +++ b/internal/php7/parser_test.go @@ -6738,7 +6738,7 @@ func TestStmtFor_Alt(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltFor{ + &ast.StmtFor{ Node: ast.Node{ Position: &position.Position{ StartLine: 1, @@ -6747,6 +6747,7 @@ func TestStmtFor_Alt(t *testing.T) { EndPos: 33, }, }, + Alt: true, Cond: []ast.Vertex{ &ast.ExprBinarySmaller{ Node: ast.Node{ diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 2862d9e8ec6947a2b73ed99e965250d4605fd7ef..80adf9ad96ba4e6037ec9d7b4be8d9a6a062cd0b 100644 GIT binary patch delta 6297 zcmai2X?T@ImVVBuup|Ts1OkNY1T@fuyX4;7uo)l;AhOe-BA6h8AP|(NSj(M{RQim5zEy&5A znUad15zore`qWy&h{IamcbUwaK)$H^PNm4T$rO|P{~gnR+N1)h=uU~!X(EM>yg#ed zKKaweC-g|DW#$``I%U$Vg0Rrg&|2C**=i1GEsY0Ks0<(u|22WjA#mJ3=O;9g5-Ctj z+~QX(GH4<_B8y(8#!~nLMadJ-QbRd8l?Johtz)Lq#1KyN$aj8<(|?{xEm(T5=NNH4 zLm~R}0&2zNm+}s(twU)tms&EX2b}eN=3|~SGGs=YijmS34%NSVjv`rB^;WU^-GwxT zWoQpd&^?#XC?cFPnuCn?EG1&{ihC-@>(7?a2E{&~RQ`ctb@7W7P@JBw@%4>jmq%ta z=Que$k;3#>E6MNhluKQ?g&y=8EhLG4jlyKhd=8h8W~!CkY{(7wzD`Y*yfzDRRb_KM z?J9<9?DOiJH59Jc9}o=uGW{JDDMJQul-{+L?h*&QQeHv@97vZ-n^ZSFZXNwLgk2ei znj~fWC{}K7q-=J3jjSznAcK38{BaZIINHIy9aNLz&6LBQ497?lHd8E9nv|7LJBP#j zZ-GNv!0>D-30vqV_63ZNE*ZF$`a-JCd+;-87^mp(x6Xqa1l@Cp{=qMp^R1PVz}aIb}2uGnw9moDXJsIB>kB*{4hK>~g;++=W1 z82Hv9I>78ovm_l_L6@059(nQ@Ocr{KMzF`P@v)BBn<3Tj(`-)jn*T&CAJA*WKEIS6 zrv!QUIM(`I8Xr4?hek5(pS30lK5T)+z9H-wtMJI^dMwui@%!cx>o~3AMa0@PSR~o-L z$)Er?X5L-=5cQJQRrI-~^z2D-67d}vOg;l~-2F^|ZKZnh@frG>eJ;6smJaDTf1|}n z6Ni)RJ4Y?#@6W5H^7dI8Lh1Uav*c6c((VgX$mG^LzND+LRzP-sN!@hiW%>pIqYr*X zMTk@zkzJ(l8fBAT|K%FxGX=Eg29k^Y8B+Q!%{L*j;aey$_$Ex@vPmVoZqmOQJ!^8; z5d20N4Q2AFCimX@jyAyhE=j1SPV)5~DwK+j++2#LQKXLgo<22BxGabd>x7se5$fp@ zUrlrFS@+*RQaW*Zh8*n*CxB&l8T=8Y=!3VZnt(Hwxd!v&$a%f7RGbZeBcGzADvtNcGa;NMe^T5?u5D6Y z=`nyK_0J(3SKpY_q;W0jVUp4#NW-S}IYM6x=a_m(G+4+n+=!{mqnw;*MiL&yIr?G??m{wbH@A_Bcbn;l1(uv9r^KZ4-u?aV%Aw-b2!r7n!Jf>=32@eV3= zaq~=)FgFJQ5wVe?$;)f&ahk7I_;H+;QH$rxVNDG$y+KmZ6<`B&OVDt`Dv~kXIn$Uv zO5W_wqa>n`%4J6nxTEA@PL{tu#C_o4oh6j)7;$hWX92r|o~TpjQYPm})o3R$n(0Bk zI6jC-HV~Q#C=biU-uwyJA;5yVeAb5#13d$JP(Pl<(y$+Akxvio$NK;Ts2Ba%uc6;c zz=KneFTD<2+S!jgO7058`vZe`5h-tmg=n8GeY$EeZzn11fU0TJ`}9y)8pW;GBkBoL zI74;eFdl9SwJq^~@5-%A%}poiIuc6Q`f6K+(vjQ`9=0|O=5pIdk*7YL_b9IhHq_vt}izia$`Mc1&<`@`+~6< z;7_={-t_`Eg$X=PfxYq~=aKy7MWl||r6;|F5JMnCtF}_MfI}Q|_Z7SY@Y4sNUq_61 zh2JqiH)Ai#h~0fbEOu!K z`?*Op1L2mJoxS=mW<9FDX%8$5d9?%$&7rkMZiMYG<;EQFHcjYDN5qDD@_OEBL^ML{ zj1Bx}1IM-U>bo0JE9AmPPSlGx@kT<}8>{PHZ*ne4{F|I4MSEeV6K{dBL1D;|tT%4u z-Kd;ai%xpkHlu;pm^~FbU35CG$-Z%IlnR4#rnvVU}d@sFK z^L_g!A24FtxcsCFljeE?o5bnu|H1naQcgDM-+ylwrt4lm@_aUMZP$Epo1Y=sf16u7 zMP&9JpjHhWoWH|QksQ1O$Bn&fkfG;Y3@`qSS}E`S%<1~EY936IRLve)cMMmK>iKBo zDic(LJ$Kbw)TT2*DFu6wm8_68!ZihJP>9Mwx}ie@U=%7`RzlQ-I?-|(C{_O+%_lWh zJ8<7cvX-Gr_h_ziOzF4RDQ!M*3z;4Xq=}AHBLFY?k!l=3Fj&=aRof#aQ7T7<4W&$J z*9sfpgu1#>*YM`fE=jU*XUtQzV8S?Y0;#4Lz}g$qbFXFD#4mDzpaQlyq`sPY_h zIn_oF?WerREU!j)HJjz90mi>N^AUA`frjv^g@qXDJXoQ)24ur1m}oOT;8N>B^R^&O zhd5zpXO|CAco49#?QAX{isiNg4ldsKo{6{!&IkUt%5 zRjDn%_ip*y7?p(!l~aXv*Rkqcu#pd{k&_DtToR{ej*%nyM7-A7%%2BQ+(AHEo2T}o zQ}&p*2&d5%lbV9mY$+EvsxV#ol$u&w#Vxrgl0zl@c^)X0o9Tq$S`{iiCnBHACaB@R z>_E(VZPo*0C&50r!P=aDWi|p?D$;RlZ8CzRrD&51mH20^(x#^9`!2XU1uldK>U1fX z3R{?agW+0hq%|aS@*Qvgf_}jysbznD2GmBx83Su%oVo4(0k29AKrZvfS0m)18g_nO>X)sely*mNyYv9fi6Nf+k`XLocVJoAqQ%7VY$ z4M{(~#$Fk)2=;K@10cr?!9KkNdpX2Rk_=dk^V|kS=CUVEre)z}G~9=>)olr!#NJ@* zdSt0;T3gR;fyC}u9kxuB7=2K?Y_KKj>(8qgG#lx1VY%udF;~H9;P2Hd=GEljR4Tw(G#Y=sJwiA8FHG&+oj*>jiCRo5OQIHQL zzsiZyGg|c#S4VzX%C6AF;x|;4@*z;_N)VQ2=mjO}F4uSa@EZM`%vgs@Gom$0SCp!4 z=w<@u=zfBg9W|1n8b;MP>mw!2uE2(HzgLRpQ5(6mn);hWXd}}Xs(Mm-8SfdJw<1<> zFOIzjz@xW;c4I5jYVtPK%k)!v`*wx5E060Q$!dz@Fp?htsfbhCFpu7)zQAqBK1H`A z{fI^-G6w`(l`Z?#QzXmxs|U2_pn4KcI;a}yM-6~>mT5!Pzw2#A};(Yg2CBf6jImh~^-u~|L-S6J_ z+we%MFBi9}ZPku~4|&>IPdmyUEMG6C9?g0rCg3++KAl2ojQ_EBMgEWDUmjjUZT|li zrUkc_s$@>E$&XVvk}pPG&;U;#`K9rb7$TyXCF7M#j}ixn*H1K z32x+cDR+~TQ>lpkew#CmCdE*mEUe{J@!m->cIzx^!xWT-<1pg6i<{X~_h5uWAvqhQ z_BOMWl9}_vk>0Sm)Rv9U>y-{GDMOBBbDUjqAGK!j6>wYe6j6eGYd%e8@(Yzxh8?tk zMi2!eowv$}ScaV8w8-5jAEf6D2ZM5aF{Rt;M=9TMe!fNT8>0ti%9urTiT!aI<*^*C zphQV5r4&1`oGOR|A$zQX`Wk36>kw`#SgC>rbL|MB=7vLIK_e*j8(@$s!L~P_p`VGv zxsr5(y35%$R77E^kLO-8stRJyUrRT{u-~iGS+eI=2pPYg`m;Y*#cN}K4su_Tm!7Bo z5p_}|GuyP3q!%!dE1Lr*&CY&-G8yue1o>Jy@)9=Zg{6e}fSjnN{<83Wmq?2V-qDIY|wq*_P(ejV{k zX03`BZaPJNoeiYaZlPFvtd_!r4qa_rVE^cBn2?c|ZVHPj}e;%63T1VeJT z3lESP+acw1S;jds*4B;WB%o~v6wH_7BPcaGGHfUIghP>|)wEJGkYl&)qSu*y(Hot` z+wG>~%z=Pxev5$0eKZzcYwRT2W&3C$ah_K^Z_>YWUatOkurI%cct{G$ImYfh zNc#!)gGw1veu!dZ&0$(CR~>?F13uaF5$%fWGj(?V8F$O-!<1%=KLE0%;&bk6e0kB> zDL+i7IOuhYZI2IV0Yf&$q0Ij)Z2R4ZbeQt(?vE(Xu+JwWKc_KLca)x#s$QHZbsOk5 zZS|G?$KZ|~ck)1Ob(XQmshxPg0Mff1rGAP%?Cfbb9i2oZ%{B@CV99Y=fgHx z?2}_2JxqBp)n1##N;>Mk%Co3ip?a zwh?kjkg8H+rLZmE1X@v6wy(D3Jp=@UP*Vk+%f)jQCrJH#nk%(Wnm$ss&Ri~MR>0~{ zG&jv9HHK5U#t!Z2&HR|L4I0X79AHE?9Qe1j2a20^1J7@vhD0e@uu?2g)T-icm)9wU@% z3$pn!u(enEWJ7=(TOhfWU%}ThKwZ~`D>&b;cjQP#SMJ}CePr!Kpy=1G+>Mo|T?PW< z#oC*@@qB8^KuSmP_QxECa{fSs9yhTvV=a7jz{{1fuqH_Q5#{Fwa(|4ZLl2}JWS2H} zdp@+5A9`|uE$P9_)g-tsQ)&l-KQ8OVJIDmQ7hAM-Z$Km9RpD=t7kk5=L#_c1!S+cq zvH;vV`da=_5kTe&i-9yvijIJsuxtD9>j=AidG~q_T4aQU$jLUTKW~Rc?1Ag~&&Zn( zAtjwzPH}Q3hvQ^VA!p0rMeMQP4&(>Op<%4XV9T5MXKY`7n4eXgdwZ>c(gr zs&NsG!893htA<{aea7P~XPFrzxu5MkioGQNeH)t3jOOkn!$+gpVyrgzk3q9+oHl!n zL-U7XZPpZXKhPdPmP3*?9;OcFM*tR>0AWHZT!HLBTY&>et+l|)*XlL^?O6p*MkC11 zlUz3$yL_^2G9SM<t zINc#tO934>-+K`cC%NPywV78*E>*K*qMh>)w_<6wh%@a=k8lae%tNSB-Bh z)nkS`Y1?AnL_!lxrt8`xOL!v?WEU>w!z5Kz2q(SJ&V2&oT2eO3U;wzG%_e75pFMGPm8cl6T>%6y??B+{&&OOhFdp+^FF5p61s`IkQ1Jd&_EFljmv| z)u6e}S*y3A+Fgpu;Fo9ldBABscd&b_pedwz4kFva^}L>B(u-)uzQD*9i0g%eP(2LZ z0{bj`Q4jT52>vnn#fh733pVJes{>QrI>AUYoB0YXCRG_QP;oUZ?*`9rR5J!6qU)Jb z_8Qh6*`&q`S;+r!w9<(jWih=)v8+CVWXVPpjy3yGktCjC<^Dz8#T$fV1rF`vKSp^F?(# zeE_ttT|OZez@k_AVwWz+loCsKNh9`V2t zw$5oy3XT4VH>zwvgpkW(n>6V=WUa;mNWRA-{Ow>;Y%B`NN#d z$zu`D=YW&UttQc~`;jNgI-^i?K^D@F9|V(l^6$PS`rn+^)a@{ms#Mhq~aLQq$Z%%;pZ1rx9Tj zV~vSZVe@)-Aaa?hN3=)m~_D87KSgl~`F{HMs#O*IAc(vKDtZg?}8{}Qn-4w}xdQFy{(%sxb67ZXjw%%)olEvF99}o$ce)j4-ZGM%D z=F35CP7I=%ov+RM5SmqC6CxQEHbpkAr;h%u2S!)*(&o@!ut>gr&Mm3C2C^c1{-wec z%d#!hLe6wEvGRDK>1Ma~HtSGA^fB3y{)+{sfMjwZ;BczK#M@SV&21#HMW(GSD>RQp z69r6r6M{Ft$P^)>8f&4Nq6RBv*yR2upq@oxG$w+CKV4@=qEZdXr-OKO;}9N%_uZhv zYTUYW)8+ff05~@~Fy%()VCPi#qWIuOMQK=ujMeJkCd@ht_sf6XWcq6Xd!-EaYUpkOq#SG2Cdz9o~Rir zG2jS83RanRf_h-8)W>n4@=_CuJSoc8K%la9riXZTa!a}K8Pic@1dfStiyFg$X4`PH zisb2$PFqL1f8@lcM?n$P^G&33VHCpaB6B2+g)aUm{i+8a919_$&nf59^N|5)n_FIp}A5qtNT;o#p;@x|D6Ghi^FM?I&q_D8~7!(RFJZU>9pjHM)Y!qFcGx$l-Yt0Bfj59Y}ZO4mcs$fW=}WV5>q+cBumX|ljzzmve{M5;!cvDtj0kL7ODD21$NtLepZXuG+>-eb*Zt(qOI zPj5GO=(nfHGQqNTcF|5GQMqb2)*gC8*P_bO5E!`IOag&4Jzvx0`#pgBfPKb&Fxe$B S`_!RY%eapoDKclD@&6yL!@(>7 diff --git a/internal/php7/php7.y b/internal/php7/php7.y index e1914fe..0ecf1de 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -895,28 +895,17 @@ statement: } | T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement { - switch n := $9.(type) { - case *ast.StmtFor : - n.Init = $3 - n.Cond = $5 - n.Loop = $7 - case *ast.StmtAltFor : - n.Init = $3 - n.Cond = $5 - n.Loop = $7 - } + $9.(*ast.StmtFor).ForTkn = $1 + $9.(*ast.StmtFor).OpenParenthesisTkn = $2 + $9.(*ast.StmtFor).Init = $3 + $9.(*ast.StmtFor).InitSemiColonTkn = $4 + $9.(*ast.StmtFor).Cond = $5 + $9.(*ast.StmtFor).CondSemiColonTkn = $6 + $9.(*ast.StmtFor).Loop = $7 + $9.(*ast.StmtFor).CloseParenthesisTkn = $8 + $9.(*ast.StmtFor).Node.Position = position.NewTokenNodePosition($1, $9) $$ = $9 - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $9) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.For, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.InitExpr, $4.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.CondExpr, $6.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.IncExpr, $8.SkippedTokens) } | T_SWITCH '(' expr ')' switch_case_list { @@ -1522,29 +1511,30 @@ foreach_variable: for_statement: statement { - $$ = &ast.StmtFor{ast.Node{}, nil, nil, nil, $1} - - // save position - $$.GetNode().Position = position.NewNodePosition($1) + $$ = &ast.StmtFor{ + Node: ast.Node{ + Position: position.NewNodePosition($1), + }, + Stmt: $1, + } } | ':' inner_statement_list T_ENDFOR ';' { - stmtList := &ast.StmtStmtList{ + $$ = &ast.StmtFor{ 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, + }, + EndForTkn: $3, + SemiColonTkn: $4, } - $$ = &ast.StmtAltFor{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/php7/php7_test.go b/internal/php7/php7_test.go index 2204bc8..24499be 100644 --- a/internal/php7/php7_test.go +++ b/internal/php7/php7_test.go @@ -5397,7 +5397,7 @@ func TestPhp7(t *testing.T) { Stmts: []ast.Vertex{}, }, }, - &ast.StmtAltFor{ + &ast.StmtFor{ Node: ast.Node{ Position: &position.Position{ StartLine: 92, @@ -5406,6 +5406,7 @@ func TestPhp7(t *testing.T) { EndPos: 1959, }, }, + Alt: true, Cond: []ast.Vertex{ &ast.ExprBinarySmaller{ Node: ast.Node{ diff --git a/pkg/ast/ast.go b/pkg/ast/ast.go index cceb924..d86bf68 100644 --- a/pkg/ast/ast.go +++ b/pkg/ast/ast.go @@ -27,7 +27,6 @@ type NodeVisitor interface { ArgumentList(n *ArgumentList) Argument(n *Argument) - StmtAltFor(n *StmtAltFor) StmtAltForeach(n *StmtAltForeach) StmtAltSwitch(n *StmtAltSwitch) StmtBreak(n *StmtBreak) diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 017d979..80685cd 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -175,19 +175,6 @@ func (n *ScalarString) Accept(v NodeVisitor) { v.ScalarString(n) } -// StmtAltFor node -type StmtAltFor struct { - Node - Init []Vertex - Cond []Vertex - Loop []Vertex - Stmt Vertex -} - -func (n *StmtAltFor) Accept(v NodeVisitor) { - v.StmtAltFor(n) -} - // StmtAltForeach node type StmtAltForeach struct { Node @@ -453,10 +440,19 @@ func (n *StmtFinally) Accept(v NodeVisitor) { // StmtFor node type StmtFor struct { Node - Init []Vertex - Cond []Vertex - Loop []Vertex - Stmt Vertex + Alt bool + ForTkn *token.Token + OpenParenthesisTkn *token.Token + Init []Vertex + InitSemiColonTkn *token.Token + Cond []Vertex + CondSemiColonTkn *token.Token + Loop []Vertex + CloseParenthesisTkn *token.Token + ColonTkn *token.Token + Stmt Vertex + EndForTkn *token.Token + SemiColonTkn *token.Token } func (n *StmtFor) Accept(v NodeVisitor) { diff --git a/pkg/ast/traverser/dfs.go b/pkg/ast/traverser/dfs.go index 5903f24..629d6ec 100644 --- a/pkg/ast/traverser/dfs.go +++ b/pkg/ast/traverser/dfs.go @@ -119,39 +119,6 @@ func (t *DFS) Traverse(n ast.Vertex) { t.Traverse(nn.Expr) t.visitor.Leave("Expr", true) } - case *ast.StmtAltFor: - if nn == nil { - return - } - if !t.visitor.EnterNode(nn) { - return - } - if nn.Init != nil { - t.visitor.Enter("Init", false) - for _, c := range nn.Init { - t.Traverse(c) - } - t.visitor.Leave("Init", false) - } - if nn.Cond != nil { - t.visitor.Enter("Cond", false) - for _, c := range nn.Cond { - t.Traverse(c) - } - t.visitor.Leave("Cond", false) - } - if nn.Loop != nil { - t.visitor.Enter("Loop", false) - for _, c := range nn.Loop { - t.Traverse(c) - } - t.visitor.Leave("Loop", false) - } - if nn.Stmt != nil { - t.visitor.Enter("Stmt", true) - t.Traverse(nn.Stmt) - t.visitor.Leave("Stmt", true) - } case *ast.StmtAltForeach: if nn == nil { return diff --git a/pkg/ast/visitor/dump.go b/pkg/ast/visitor/dump.go index c684ede..bd9cc4e 100644 --- a/pkg/ast/visitor/dump.go +++ b/pkg/ast/visitor/dump.go @@ -252,12 +252,6 @@ func (v *Dump) Argument(n *ast.Argument) { } } -func (v *Dump) StmtAltFor(n *ast.StmtAltFor) { - v.printIndentIfNotSingle(v.indent - 1) - v.print("&ast.StmtAltFor{\n") - v.printNode(n.GetNode()) -} - func (v *Dump) StmtAltForeach(n *ast.StmtAltForeach) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.StmtAltForeach{\n") @@ -414,6 +408,11 @@ func (v *Dump) StmtFor(n *ast.StmtFor) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.StmtFor{\n") v.printNode(n.GetNode()) + + if n.Alt { + v.printIndent(v.indent) + v.print("Alt: true,\n") + } } func (v *Dump) StmtForeach(n *ast.StmtForeach) { diff --git a/pkg/ast/visitor/filter_parser_nodes.go b/pkg/ast/visitor/filter_parser_nodes.go index 83f9cb2..9160d72 100644 --- a/pkg/ast/visitor/filter_parser_nodes.go +++ b/pkg/ast/visitor/filter_parser_nodes.go @@ -209,44 +209,6 @@ func (v *FilterParserNodes) ExprVariable(n *ast.ExprVariable) { } } -func (v *FilterParserNodes) StmtFor(n *ast.StmtFor) { - for k, v := range n.Init { - for { - if nn, ok := v.(*ast.ParserBrackets); ok { - v = nn.Child - } else { - break - } - } - - n.Init[k] = v - } - - for k, v := range n.Cond { - for { - if nn, ok := v.(*ast.ParserBrackets); ok { - v = nn.Child - } else { - break - } - } - - n.Cond[k] = v - } - - for k, v := range n.Loop { - for { - if nn, ok := v.(*ast.ParserBrackets); ok { - v = nn.Child - } else { - break - } - } - - n.Loop[k] = v - } -} - func (v *FilterParserNodes) ExprAssign(n *ast.ExprAssign) { for { if nn, ok := n.Expr.(*ast.ParserBrackets); ok { diff --git a/pkg/ast/visitor/filter_tokens.go b/pkg/ast/visitor/filter_tokens.go index 3d60dd5..9ec8a3d 100644 --- a/pkg/ast/visitor/filter_tokens.go +++ b/pkg/ast/visitor/filter_tokens.go @@ -130,3 +130,14 @@ func (v *FilterTokens) StmtDo(n *ast.StmtDo) { n.CloseParenthesisTkn = nil n.SemiColonTkn = nil } + +func (v *FilterTokens) StmtFor(n *ast.StmtFor) { + n.ForTkn = nil + n.OpenParenthesisTkn = nil + n.InitSemiColonTkn = nil + n.CondSemiColonTkn = nil + n.CloseParenthesisTkn = nil + n.ColonTkn = nil + n.EndForTkn = nil + n.SemiColonTkn = nil +} diff --git a/pkg/ast/visitor/null.go b/pkg/ast/visitor/null.go index 4054486..7fd4992 100644 --- a/pkg/ast/visitor/null.go +++ b/pkg/ast/visitor/null.go @@ -54,10 +54,6 @@ func (v *Null) Argument(_ *ast.Argument) { // do nothing } -func (v *Null) StmtAltFor(_ *ast.StmtAltFor) { - // do nothing -} - func (v *Null) StmtAltForeach(_ *ast.StmtAltForeach) { // do nothing } diff --git a/pkg/printer/pretty_printer.go b/pkg/printer/pretty_printer.go index c172f41..1053b76 100644 --- a/pkg/printer/pretty_printer.go +++ b/pkg/printer/pretty_printer.go @@ -297,8 +297,6 @@ func (p *PrettyPrinter) printNode(n ast.Vertex) { // stmt - case *ast.StmtAltFor: - p.printStmtAltFor(n) case *ast.StmtAltForeach: p.printStmtAltForeach(n) case *ast.StmtAltSwitch: @@ -1363,25 +1361,6 @@ func (p *PrettyPrinter) printStmtAltElse(n ast.Vertex) { } } -func (p *PrettyPrinter) printStmtAltFor(n ast.Vertex) { - nn := n.(*ast.StmtAltFor) - - io.WriteString(p.w, "for (") - p.joinPrint(", ", nn.Init) - io.WriteString(p.w, "; ") - p.joinPrint(", ", nn.Cond) - io.WriteString(p.w, "; ") - p.joinPrint(", ", nn.Loop) - 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, "endfor;") -} - func (p *PrettyPrinter) printStmtAltForeach(n ast.Vertex) { nn := n.(*ast.StmtAltForeach) @@ -1736,6 +1715,11 @@ func (p *PrettyPrinter) printStmtFinally(n ast.Vertex) { func (p *PrettyPrinter) printStmtFor(n ast.Vertex) { nn := n.(*ast.StmtFor) + if nn.Alt { + p.printStmtAltFor(nn) + return + } + io.WriteString(p.w, "for (") p.joinPrint(", ", nn.Init) io.WriteString(p.w, "; ") @@ -1760,6 +1744,25 @@ func (p *PrettyPrinter) printStmtFor(n ast.Vertex) { } } +func (p *PrettyPrinter) printStmtAltFor(n ast.Vertex) { + nn := n.(*ast.StmtFor) + + io.WriteString(p.w, "for (") + p.joinPrint(", ", nn.Init) + io.WriteString(p.w, "; ") + p.joinPrint(", ", nn.Cond) + io.WriteString(p.w, "; ") + p.joinPrint(", ", nn.Loop) + 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, "endfor;") +} + func (p *PrettyPrinter) printStmtForeach(n ast.Vertex) { nn := n.(*ast.StmtForeach) diff --git a/pkg/printer/pretty_printer_test.go b/pkg/printer/pretty_printer_test.go index a193202..0eec375 100644 --- a/pkg/printer/pretty_printer_test.go +++ b/pkg/printer/pretty_printer_test.go @@ -2172,7 +2172,8 @@ func TestPrintAltFor(t *testing.T) { p := printer.NewPrettyPrinter(o, " ") p.Print(&ast.StmtNamespace{ Stmts: []ast.Vertex{ - &ast.StmtAltFor{ + &ast.StmtFor{ + Alt: true, Init: []ast.Vertex{ &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, }, diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index e678ae6..b7ded2f 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -359,8 +359,6 @@ func (p *Printer) printNode(n ast.Vertex) { // stmt - case *ast.StmtAltFor: - p.printStmtAltFor(n) case *ast.StmtAltForeach: p.printStmtAltForeach(n) case *ast.StmtAltSwitch: @@ -1973,39 +1971,6 @@ func (p *Printer) printExprYield(n ast.Vertex) { // smtm -func (p *Printer) printStmtAltFor(n ast.Vertex) { - nn := n.(*ast.StmtAltFor) - p.printFreeFloating(nn, token.Start) - - io.WriteString(p.w, "for") - p.printFreeFloating(nn, token.For) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Init) - p.printFreeFloating(nn, token.InitExpr) - io.WriteString(p.w, ";") - p.joinPrint(",", nn.Cond) - p.printFreeFloating(nn, token.CondExpr) - io.WriteString(p.w, ";") - p.joinPrint(",", nn.Loop) - p.printFreeFloating(nn, token.IncExpr) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, token.Cond) - io.WriteString(p.w, ":") - - s := nn.Stmt.(*ast.StmtStmtList) - p.printNodes(s.Stmts) - p.printFreeFloating(nn, token.Stmts) - - io.WriteString(p.w, "endfor") - p.printFreeFloating(nn, token.AltEnd) - p.printFreeFloating(nn, token.SemiColon) - if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, token.End) -} - func (p *Printer) printStmtAltForeach(n ast.Vertex) { nn := n.(*ast.StmtAltForeach) p.printFreeFloating(nn, token.Start) @@ -2477,26 +2442,43 @@ func (p *Printer) printStmtFinally(n ast.Vertex) { p.printFreeFloating(nn, token.End) } -func (p *Printer) printStmtFor(n ast.Vertex) { - nn := n.(*ast.StmtFor) - p.printFreeFloating(nn, token.Start) +func (p *Printer) printStmtFor(n *ast.StmtFor) { + if n.Alt { + p.printStmtAltFor(n) + return + } - io.WriteString(p.w, "for") - p.printFreeFloating(nn, token.For) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Init) - p.printFreeFloating(nn, token.InitExpr) - io.WriteString(p.w, ";") - p.joinPrint(",", nn.Cond) - p.printFreeFloating(nn, token.CondExpr) - io.WriteString(p.w, ";") - p.joinPrint(",", nn.Loop) - p.printFreeFloating(nn, token.IncExpr) - io.WriteString(p.w, ")") + p.printToken(n.ForTkn, "for") + p.printToken(n.OpenParenthesisTkn, "(") + p.joinPrint(",", n.Init) + p.printToken(n.InitSemiColonTkn, ";") + p.joinPrint(",", n.Cond) + p.printToken(n.CondSemiColonTkn, ";") + p.joinPrint(",", n.Loop) + p.printToken(n.CloseParenthesisTkn, ")") - p.Print(nn.Stmt) + p.Print(n.Stmt) +} - p.printFreeFloating(nn, token.End) +func (p *Printer) printStmtAltFor(n *ast.StmtFor) { + p.printToken(n.ForTkn, "for") + p.printToken(n.OpenParenthesisTkn, "(") + p.joinPrint(",", n.Init) + p.printToken(n.InitSemiColonTkn, ";") + p.joinPrint(",", n.Cond) + p.printToken(n.CondSemiColonTkn, ";") + p.joinPrint(",", n.Loop) + p.printToken(n.CloseParenthesisTkn, ")") + p.printToken(n.ColonTkn, ":") + + if stmtList, ok := n.Stmt.(*ast.StmtStmtList); ok { + p.printNodes(stmtList.Stmts) + } else { + p.printNode(n.Stmt) + } + + p.printToken(n.EndForTkn, "endfor") + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtForeach(n ast.Vertex) { diff --git a/pkg/printer/printer_parsed_php5_test.go b/pkg/printer/printer_parsed_php5_test.go index ce35495..c607b65 100644 --- a/pkg/printer/printer_parsed_php5_test.go +++ b/pkg/printer/printer_parsed_php5_test.go @@ -762,7 +762,8 @@ func TestParseAndPrintPhp5AltIf(t *testing.T) { } func TestParseAndPrintPhp5AltFor(t *testing.T) { - src := `