From 394092269ad298c1160d46a9253aa2f53fed4cfb Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Sun, 9 Aug 2020 22:40:55 +0200 Subject: [PATCH] [refactoring] store expr parenthesis --- internal/php5/parser_test.go | 14 +- internal/php5/php5.go | Bin 333714 -> 327033 bytes internal/php5/php5.y | 139 +-- internal/php5/php5_test.go | 4 +- internal/php7/parser_test.go | 4 +- internal/php7/php7.go | Bin 275578 -> 276863 bytes internal/php7/php7.y | 107 ++- internal/php7/php7_test.go | 12 +- pkg/ast/visitor/filter_parser_nodes.go | 1207 +++++++++++++++++++++++- pkg/printer/printer.go | 122 ++- pkg/token/position.go | 10 - pkg/token/position_string.go | 76 +- 12 files changed, 1439 insertions(+), 256 deletions(-) diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index 6d72de0..a33aa36 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -5819,7 +5819,7 @@ func TestStmtEcho_Parenthesis(t *testing.T) { } func TestStmtExpression(t *testing.T) { - src := `MZYh>r|F) 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 delta 12326 zcmeHNdt8;p*8a@}5WE12h@i01v@p?qV{djUpa^&^JmE2Kr70$;Y%?ztAD=k6I^mGx+?v~#(^X?61_~m!b_xt`j|G=Jk=bc$IYprKJ zYt8%9&#fNZ6t#J6tZ=xUbJoYI^|35(A{EbL!7V1|7hW-IR^Ot@lgCaQ>7=PeJU;fC z;{3wgvD5MkXH3kWUNAkcXi|RR=p`^HL^xb zqeGLD9rV?9)`l5D+EA|)iPGMn!Mi_}Io|Z{6rnDjO&VP{tgV#a&JcKOuWl?)4&+7S3Uh($}BLW|TIU4W{)c zWH+jA#iJ>HG;c;x8N9dJJD2rik&W;9Qq&egHAiI>T{DkGSZ5p`)!6a=KPtgU)WI*z zMb7I&leoyR#m}=OZJQzLs(H*MxF(!+OYf5p+{@MYk34HkX7t*7SdZI%d$nggVyrmxwww zv*iBnj~DH=p;;hpXV9 z4ksl(!4g#ZYL?8Ii%x&T{mY=Im8w|7F6YdB-s*wwT1Fo~&ax>tO|&y|sf;HeDfe2- zs)g%VFAkB+>?hZ=o}4@F4b!XajqF}7oai(7@MRTyfMNZ}>;2o*(;a72@(k8^_s75* zwa>60IYm^+Xe!>$nyAtjn2po!X);GM43%4_s%BJ%kw7pymQkn0tVUne2T}0C+!L#Xy_n^^p2UrBv z^%Kpk!@B-`)?2H!av?(fnm+tm3O#^Pb=&1-deXl1ESfmJ{rT9cS*m6t&!d?iTD=2g zbopV{f%fK$(DIMi{UXKgX^??3c4>7lXF)XL9gvEGjVy+WJuH)|NsOfMlX4iXyq6J0 ztb&e{53#e1r?{wg0iQ{aeu@=bTCTHn{4jpI^}!Sn)vz3#9*yk`o9kc8vYCe>N67;E zsTPC0R5nPqp^T#}oNhV-yYl*I(-Ag{r+W1NX#HfU4hCqrXwOj{8N3vE66cirCifq2 z@iDeq3XjvR@SuY}!-$itzjgEveZ_v$=cO&&+F8gCn090s52Ls1SaWr_j*VnIHAPi? z55uAzXIQrI+U;}?@s29_J66Pm*WuJp_j2KdnH2uSHgK0m|8K8Se`Z^81`aKslWb>M zKc13Galf)eT5y&v<{q~~<1-fQ^?`quJlvkQrG#^=EI2hK&{pr9W3NF1yFSO;s2S(k zx`BiIm4?6!U}0m9i#FOM7U6eIA8Dg=UYTx`K$|3Augzbd=&M1zAC4Wakf6E*^JNSt zQQHR^Kg~m_^P{pOE!-;lQ^ra8lBL1;P~L>$aEz~Ihw*qLMqM}`r*=2xN4W6eAdH*s zZNU>6nm&c6{RIr{bXdT*MzrDyjJte(JtOu z-4w%H!QWv9el=c4#e-#M)jf{SR(&qjd5&-Z-HbxtFfFHDMLM{P35U~ca*SH%gwV7RxlLEG-yH*Pr4+k-TH?7$m$@ z&q~GF12B*r4W=b?n4Nx3|JRDqa&#~XxyUi<6sckP ziwvqykO&DR)8>KVTKaex7IZr-7E&<^7`}cv$P=>1IaK`~V(^jSdVtf~ zGU!(j=~3#25&SR{Zns1A9>ps-BA>OF8?e5|Lip8V@Eg%lbBMr;P1Nce`IU^^H$o7^ zzR2<1quP(==$iwHwn8*-vj zZ{rLo?dKqY5x1E@L3ntYawqU4TF7~CnmvmRig1o4_?IEZ7f zvPiPs$D^q3NtRCg(pVmKnFDor9XeY2?c(4Z9H-aeCnVa|H0g*__s``^f}ji?SE+({ z6O}%nS29cI4YX`14PR)qe|o#2WyfjNqTkC&n_gp4s_kO_u(nZnou6Z4&LH*P68;&( zuB!6^zi^mEJk>$_2goaF&AU8}-h9wl`I?0R&Iuwolpc5pn@9y;x0bADf_*4&sTp5Z z2W(jLvKUA;_p%7p;$hCTU71ar?$S=YCCw@4XSF%&0|oVMp&ln*$0*_(JO2C z3gL6x)#yrIr-SbAj-iRV<#7(aUwhV~NICS}+JHwD(9P?3KPqb>{h0<%^A<)q>v^_x z+3hgU^*n?N7t&e?Yv^q^uef7#cyEr>)+Av8Qjz$)Q3^!KQM~} zG!Tc17Zx+_Fi2}a3eUfKRzJ5u2G9F3TKYV2)!}w&|GJNIcfmE_THVODou8u8LI6bR zRPbEeJFtmYIKP_evRFqN^9GNg*)Q=8+~cT!vzPk%WquZn$o_k0_0>=7_t@R9^539D z5O8w$LNc^ z;f-nlk_WHs=P&C_0LT6q^}ZSgS$z<;Tl20tGJX6=VvbYC_i-R#!a*iT66-Z1gd%91fMMZsHQ2t8ut}nT8|UJ=rGm(6n_hww43;{?KD4yhDqF! z3+d<4-||nesl|4=!Q#;X^AQ7ZS2%#6VhyykhuF!ql z4?adXSYwuiAvB zJ0{t)cM{>so+xVcPHaygreppvb?#@e0x|e90lo_yg3=U5YOQ(|gp`~r7X-!*OtRiK z^0pOn8KaY3A+JAb zu}{qaZQJ^5rI@144fJgX76qJy8cMdXP89kh;XNeXO7mlYbgW=EMh@muN3q}qtLWL|aJ1r?fX*JMl*XYg9=x*J*B_)L+ zR3m+^U*{rhJ!_!Iqsk%#K`_=8I*j1J3{44Dx>~^0Q-cL^a$u9TJGClT4D=W15(tgX zs@t_9hU>DNnPMnCGgRnWjd5lB^+Kw4f3*w>*3nVft`kSKaT_Bxk1rnq-RN4K4tS>I zV7j}F61C{|qfT9#3{sBk;aECD2zW7>kv+y}{W~q}iMRSPZp5TbJ$79z(HD66v}Zbt z3(2~zcv{wN1=M>tZ>NhP&8T?1=*{x!t?{BKMK46<^2h;DlUEM&%PIFh06~7fxLNDn z;DEu2Qxn8Wy@S9x<XAVC7@=L*k@ zgLLj;y7V-(+Rj?2QC~<0qc2Jzft7|Nm^IFS`1ovKmmAmxsE${7^=F-V*z22H86CU_ z`?L6ys=G(-W)w2lc#DC`qPe0u%9(2RJn@B}8f!I%sp7ffbw<}L5LtNHASPZ8RXtB( z3EH|yWYdr-JW;JWEvk^9ED_l}1x2V*QG(%%O2tzECt6&J0&`xOn8a!RO3}*{?^O6w zF&%k>#W)n`^Gsw5_Vcp^jL5bUg^yQ=O(tIGv<^qui$)KI2Q{U@fC;O_MC6igO3Y*# zDq@Xz1YoT;R*F5SH96?%O3|LG(qy(e__&DT6xmVORQNi*Ws?O&t1%lyH6yV>Wcf+H zU&|Qu1_IsFB8v|9kuiGQJB&tc0xo%7)^QW&Y)f} zN%8J}K}hQHtk_5A{tofSzW`B+p2PkqY8%=*rYej9N&GJbX%H%m)#}$2UTcNu;ZV8H z2~^Qio!V65^zg^gZDQxmRQeL8sd`OJq0E=z#8ypNfxU+Z(T*s~!LOyZJ2kX}Z(4k+ z1AzoROyl>6Nwi`Y*7Z46?Jm&)5y6z#6R6L45krnAWDbpeL%&)dsY9(tOK)K9$+j0o z;)owvZ*%c4jF)yr3Z*{-C~qmp(d6C63hNzFzne(OV|k*!s=jg7jQr`{GK;1Z%~F5t-k(mKt5&I7lUIeWp_lP_=enXMolZ0@vbn7mfT-cJ+^UyeG0{iXDh`&pw#s>V7f{lf17T8tWy9cH0h# zL5xa2fC5d?xShh10~w`%h#nK$<1l0}qf;Nj>`ZX*cdR}r^!?%QW*+znj0hvMN)6v7?J)}e+(fX=s^I_pq!AHb2RAs?WkwdQH6mwkk zqc*1k2EGSPE7VV-J3og@G}wN(6F^I+u5MR|q3Z1uqCWx>M41O4t;uGR_Ed@tLjOpr z-YR-f^`oM@!Y`DEZvPUe>U4Vat8En^r73i^RiI-06+X+bzbLAx`fEKz!}wf;N&saB zF0rgyJOMt!)aujX4A9I=rwedJ^6R(eK#e1hIfFn#pZ^xv!|3m^CCCkgFfhE}M@;R) zL4xjeQa}9&E{P1sPfr%9?yYqYZhOT?fJ zT=vr`^yMm6$iqydW1^;XAb>Xq;}M93;dNks9h*o5A&a9~gmzgI2`Z23m!^$|=&Ds= z5=;__si6lA+;>Ye%&xN@Q|~e)SGB-Us=OJAkshaBi;$oD%S?t9f*T)YI*0G9N%wJW zy$ysM9Q@uG$b$|rP|dPf-Q}#`vS#0zizOiq``TSo;MB zSA{hC7FFe5B{nnK)j{f_WP`k5si5F*UxsdTNolf*Fa@^iGB+OeJ60g8Af%2Ysf&G@ z)vMAZ`HjwAG@;kz^=U?fk|6@3mZn04=h2$0;fuv? zya`U7-B6PWYT)hAsL>d>`ZAOKfYKyr8n_cJrv)9|uEGLdT$@-PaFy)O5YLd`!m1mw zeiyBApf3J;x}0iN5$vZ>KY!yfaT5(pLqyn^Et}Fu707|$5v`CaD)`a?M$7x)A>?X9 zch8o2G%ypVVa_eu>i88M7H>7rH}#d~_DlPML9Cc8i3ARXtp=|@n=S8R^z=1Y@PU0I zM&r~%3;{5prlkvE*>wK^Y%Ue0O%#^9sIvoPXTu!=H;OH&-yn%fgSlgL(oWs*x@hw? zvWMzFSmqsET9u;pi+f9 zcdtyN!g)OK*;L~vVbC9#C0>|Im~ZO-@OcDPlMIjkmp^Q4 zSa@&|?`VBgm2CZsk8M1@>5PN|7XzWOfe!&kcPlI!kFTDrt1B%$?ca)gdvYPq&b$s}BfIvnciCGrrX;gclFj0j*Tqm49loKQ=SP_dIG5OT#WGEsdoMYT^5X6X~TwR7OZCx&!Cv zv=UydJd`@lmO9}z2ld|U^Mo2o_uUDT4WQUi^4$fL@);S|Al~|OZ6p4odoc3k0vQuX zov`q8bFd|Rya@=i>1+yJ$M4l$hCmn4vUw29)#ydc%b5PWOPKommV8c+E---r;zsLh zt!&C!XoUbj)c(8>OZdP#ituT`#zl}AQ5*HoI2FEF_C#{%aBKadE{f1yIZ2K}O|`B1 zyi8W<#L=mh9ZMMcJw3Tpzno$q*k7w2T(0rcAf1!a=d)f^w@;2NAI`g~>r-U{qm9dC zPSaFZAa5_E+K*TVWm_&EV@-XY3%cu8$WdIRI6Uf_Rq_@8ebr6)^mIgpY_Bpa6EnmAF{p9PnN)-FQC>}ti{=AMy*z^mFpPN%#?b# zkLOhJ6fE51v}@4+4AFg~Zh|xgkROTdxhmb~PE`?k5|;=sZPrcHHCJwxy;SBFIZU8B ztkC)aDQ$}GzJm}mTGG-jxV14ZaaW$~s0yEz1GLmDw&D|xT>T~Qk*)Ht4Fd=RvZ*Fi zv{NTvkk=t#-CplE?$>MfhB|edEJPoMRFz;yaJKDpfl*l7eR?ES#{na zr=cF{kHy71wQHrESGh-iolbiTa32768LNtS$$4C)BII3A+`s!xdASHlbvm@-D14v( z)_4-^E(gC9GQKC7NY!?#OZ~Xv>!Nz?lU*V2gtZn#OiO0a%t66 zT<&E|1=-)ePYzQ9-jzYzy3f(^K^48P>yU81b{FO=2?t<=KCdb`An(ATJFF|;`io5K zh7x6hW@^gEa=otgm`bXt{&)|`bi8A-i3B=T3q@6RWX)8@1F{+Ju~xAtIi+~UEb4uV z4IzAkc_a0yHMk4bY`diKLysB%1d~ZnFCCNRW)C*P&k%L{aS4{MIU3Kpm8SLti@_yo zxV5mjb?oHx);;h~tyU|?^Oq#jzW^yhpULbJ2u+kYzm#Q6di8Bp+1K(#Jhd*W%uUIl zIx`2DuKrHww>n7Xv1s7t(>fwJbOKeuY55sVzhEzC 0 { - yylex.(*Parser).setFreeFloatingTokens($$, token.If, $2.GetNode().Tokens[token.OpenParenthesisToken][:len($2.GetNode().Tokens[token.OpenParenthesisToken])-1]); delete($2.GetNode().Tokens, token.OpenParenthesisToken) - } - if len($2.GetNode().Tokens[token.CloseParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens($$, token.Expr, $2.GetNode().Tokens[token.CloseParenthesisToken][:len($2.GetNode().Tokens[token.CloseParenthesisToken])-1]); delete($2.GetNode().Tokens, token.CloseParenthesisToken) - } yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } | T_IF parenthesis_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' { - exprBrackets := &ast.ParserBrackets{ast.Node{}, $2} stmts := &ast.StmtStmtList{ast.Node{}, $4} stmtsBrackets := &ast.ParserBrackets{ast.Node{}, stmts} - $$ = &ast.StmtAltIf{ast.Node{}, exprBrackets, stmtsBrackets, $5, $6} + $$ = &ast.StmtAltIf{ast.Node{}, $2, stmtsBrackets, $5, $6} // save position - exprBrackets.GetNode().Position = position.NewNodePosition($2) stmts.GetNode().Position = position.NewNodeListPosition($4) stmtsBrackets.GetNode().Position = position.NewTokenNodeListPosition($3, $4) $$.GetNode().Position = position.NewTokensPosition($1, $8) // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) - if len($2.GetNode().Tokens[token.OpenParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.GetNode().Tokens[token.OpenParenthesisToken]); delete($2.GetNode().Tokens, token.OpenParenthesisToken) - } - if len($2.GetNode().Tokens[token.CloseParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $2.GetNode().Tokens[token.CloseParenthesisToken]); delete($2.GetNode().Tokens, token.CloseParenthesisToken) - } yylex.(*Parser).setFreeFloatingTokens(stmtsBrackets, token.Start, $3.Tokens) if $6 != nil { yylex.(*Parser).setFreeFloating($6.(*ast.StmtAltElse).Stmt, token.End, append($7.Tokens, $8.Tokens...)) @@ -977,12 +963,6 @@ unticked_statement: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) - if len($2.GetNode().Tokens[token.OpenParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens($$, token.While, $2.GetNode().Tokens[token.OpenParenthesisToken][:len($2.GetNode().Tokens[token.OpenParenthesisToken])-1]); delete($2.GetNode().Tokens, token.OpenParenthesisToken) - } - if len($2.GetNode().Tokens[token.CloseParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens($$, token.Expr, $2.GetNode().Tokens[token.CloseParenthesisToken][:len($2.GetNode().Tokens[token.CloseParenthesisToken])-1]); delete($2.GetNode().Tokens, token.CloseParenthesisToken) - } yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -996,13 +976,7 @@ unticked_statement: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) yylex.(*Parser).setFreeFloating($$, token.Stmts, $3.Tokens) - if len($4.GetNode().Tokens[token.OpenParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens($$, token.While, $4.GetNode().Tokens[token.OpenParenthesisToken][:len($4.GetNode().Tokens[token.OpenParenthesisToken])-1]); delete($4.GetNode().Tokens, token.OpenParenthesisToken) - } - if len($4.GetNode().Tokens[token.CloseParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens($$, token.Expr, $4.GetNode().Tokens[token.CloseParenthesisToken][:len($4.GetNode().Tokens[token.CloseParenthesisToken])-1]); delete($4.GetNode().Tokens, token.CloseParenthesisToken) - } - yylex.(*Parser).setFreeFloating($$, token.Cond, $5.Tokens) + yylex.(*Parser).setFreeFloating($4, token.End, $5.Tokens) yylex.(*Parser).setToken($$, token.SemiColon, $5.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) @@ -1052,12 +1026,6 @@ unticked_statement: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) - if len($2.GetNode().Tokens[token.OpenParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens($$, token.Switch, $2.GetNode().Tokens[token.OpenParenthesisToken][:len($2.GetNode().Tokens[token.OpenParenthesisToken])-1]); delete($2.GetNode().Tokens, token.OpenParenthesisToken) - } - if len($2.GetNode().Tokens[token.CloseParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens($$, token.Expr, $2.GetNode().Tokens[token.CloseParenthesisToken][:len($2.GetNode().Tokens[token.CloseParenthesisToken])-1]); delete($2.GetNode().Tokens, token.CloseParenthesisToken) - } yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -2163,12 +2131,6 @@ elseif_list: // save comments yylex.(*Parser).setFreeFloating(_elseIf, token.Start, $2.Tokens) - if len($3.GetNode().Tokens[token.OpenParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens(_elseIf, token.ElseIf, $3.GetNode().Tokens[token.OpenParenthesisToken][:len($3.GetNode().Tokens[token.OpenParenthesisToken])-1]); delete($3.GetNode().Tokens, token.OpenParenthesisToken) - } - if len($3.GetNode().Tokens[token.CloseParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens(_elseIf, token.Expr, $3.GetNode().Tokens[token.CloseParenthesisToken][:len($3.GetNode().Tokens[token.CloseParenthesisToken])-1]); delete($3.GetNode().Tokens, token.CloseParenthesisToken) - } yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -2184,26 +2146,18 @@ new_elseif_list: } | new_elseif_list T_ELSEIF parenthesis_expr ':' inner_statement_list { - exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} stmts := &ast.StmtStmtList{ast.Node{}, $5} stmtsBrackets := &ast.ParserBrackets{ast.Node{}, stmts} - _elseIf := &ast.StmtAltElseIf{ast.Node{}, exprBrackets, stmtsBrackets} + _elseIf := &ast.StmtAltElseIf{ast.Node{}, $3, stmtsBrackets} $$ = append($1, _elseIf) // save position - exprBrackets.GetNode().Position = position.NewNodePosition($3) stmts.GetNode().Position = position.NewNodeListPosition($5) - exprBrackets.GetNode().Position = position.NewTokenNodeListPosition($4, $5) + stmtsBrackets.GetNode().Position = position.NewTokenNodeListPosition($4, $5) _elseIf.GetNode().Position = position.NewTokenNodeListPosition($2, $5) // save comments yylex.(*Parser).setFreeFloating(_elseIf, token.Start, $2.Tokens) - if len($3.GetNode().Tokens[token.OpenParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $3.GetNode().Tokens[token.OpenParenthesisToken]); delete($3.GetNode().Tokens, token.OpenParenthesisToken) - } - if len($3.GetNode().Tokens[token.CloseParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $3.GetNode().Tokens[token.CloseParenthesisToken]); delete($3.GetNode().Tokens, token.CloseParenthesisToken) - } yylex.(*Parser).setFreeFloatingTokens(stmtsBrackets, token.Start, $4.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) @@ -4089,9 +4043,6 @@ expr_without_variable: $$ = $1 yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) - - yylex.(*Parser).setFreeFloatingTokens($1, token.Start, append($1.GetNode().Tokens[token.OpenParenthesisToken], $1.GetNode().Tokens[token.Start]...)); delete($1.GetNode().Tokens, token.OpenParenthesisToken) - yylex.(*Parser).setFreeFloatingTokens($1, token.End, append($1.GetNode().Tokens[token.End], $1.GetNode().Tokens[token.CloseParenthesisToken]...)); delete($1.GetNode().Tokens, token.CloseParenthesisToken) } | new_expr { @@ -4258,15 +4209,14 @@ expr_without_variable: } | T_EXIT exit_expr { - e := $2.(*ast.ExprExit) - $$ = $2 + $$ = &ast.ExprExit{ast.Node{}, false, $2} if (bytes.EqualFold($1.Value, []byte("die"))) { - e.Die = true + $$.(*ast.ExprExit).Die = true } // save position - if $2.GetNode().Position == nil { + if $2 == nil { $$.GetNode().Position = position.NewTokenPosition($1) } else { $$.GetNode().Position = position.NewTokenNodePosition($1, $2) @@ -4930,39 +4880,28 @@ dynamic_class_name_variable_property: exit_expr: /* empty */ { - $$ = &ast.ExprExit{ast.Node{}, false, nil}; + $$ = nil yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } | '(' ')' { - $$ = &ast.ExprExit{ast.Node{}, false, nil}; + $$ = &ast.ParserBrackets{ast.Node{}, nil} // save position $$.GetNode().Position = position.NewTokensPosition($1, $2) // save comments - yylex.(*Parser).setFreeFloatingTokens($$, token.Exit, $1.Tokens) - yylex.(*Parser).setFreeFloatingTokens($$, token.Expr, $2.Tokens) + yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.Tokens) + yylex.(*Parser).setFreeFloatingTokens($$, token.End, $2.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } | parenthesis_expr { - $$ = &ast.ExprExit{ast.Node{}, false, $1}; - - // save position - if bytes.Compare(yylex.(*Parser).currentToken.Value, []byte(")")) == 0 { - $$.GetNode().Position = position.NewTokenPosition(yylex.(*Parser).currentToken) - } else { - $$.GetNode().Position = position.NewNodePosition($1) - } + $$ = $1 yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) - - // save comments - yylex.(*Parser).setFreeFloatingTokens($$, token.Exit, $1.GetNode().Tokens[token.OpenParenthesisToken]); delete($1.GetNode().Tokens, token.OpenParenthesisToken) - yylex.(*Parser).setFreeFloatingTokens($$, token.Expr, $1.GetNode().Tokens[token.CloseParenthesisToken]); delete($1.GetNode().Tokens, token.CloseParenthesisToken) } ; @@ -5945,33 +5884,27 @@ expr: parenthesis_expr: '(' expr ')' { - $$ = $2 + $$ = &ast.ParserBrackets{ast.Node{}, $2} + + // save position + $$.GetNode().Position = position.NewTokensPosition($1, $3) // save comments - if len($2.GetNode().Tokens[token.OpenParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloating($2, token.Start, append($2.GetNode().Tokens[token.OpenParenthesisToken], $2.GetNode().Tokens[token.Start]...)) - } - if len($2.GetNode().Tokens[token.CloseParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloating($2, token.End, append($2.GetNode().Tokens[token.End], $2.GetNode().Tokens[token.CloseParenthesisToken]...)) - } - yylex.(*Parser).setFreeFloatingTokens($2, token.OpenParenthesisToken, $1.Tokens) - yylex.(*Parser).setFreeFloatingTokens($2, token.CloseParenthesisToken, $3.Tokens) + yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.Tokens) + yylex.(*Parser).setFreeFloatingTokens($$, token.End, $3.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } | '(' yield_expr ')' { - $$ = $2 + $$ = &ast.ParserBrackets{ast.Node{}, $2} + + // save position + $$.GetNode().Position = position.NewTokensPosition($1, $3) // save comments - if len($2.GetNode().Tokens[token.OpenParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloating($2, token.Start, append($2.GetNode().Tokens[token.OpenParenthesisToken], $2.GetNode().Tokens[token.Start]...)) - } - if len($2.GetNode().Tokens[token.CloseParenthesisToken]) > 0 { - yylex.(*Parser).setFreeFloating($2, token.End, append($2.GetNode().Tokens[token.End], $2.GetNode().Tokens[token.CloseParenthesisToken]...)) - } - yylex.(*Parser).setFreeFloatingTokens($2, token.OpenParenthesisToken, $1.Tokens) - yylex.(*Parser).setFreeFloatingTokens($2, token.CloseParenthesisToken, $3.Tokens) + yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.Tokens) + yylex.(*Parser).setFreeFloatingTokens($$, token.End, $3.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -6943,29 +6876,33 @@ internal_functions_in_yacc: } | T_EMPTY '(' variable ')' { - $$ = &ast.ExprEmpty{ast.Node{}, $3} + exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + $$ = &ast.ExprEmpty{ast.Node{}, exprBrackets} // save position + exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Empty, $2.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $4.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $4.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } | T_EMPTY '(' expr ')' { - $$ = &ast.ExprEmpty{ast.Node{}, $3} + exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + $$ = &ast.ExprEmpty{ast.Node{}, exprBrackets} // save position + exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Empty, $2.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $4.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $4.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -6995,15 +6932,17 @@ internal_functions_in_yacc: } | T_EVAL '(' expr ')' { - $$ = &ast.ExprEval{ast.Node{}, $3} + exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + $$ = &ast.ExprEval{ast.Node{}, exprBrackets} // save position + exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Eval, $2.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $4.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $4.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } diff --git a/internal/php5/php5_test.go b/internal/php5/php5_test.go index 07cbd58..b1a1ada 100644 --- a/internal/php5/php5_test.go +++ b/internal/php5/php5_test.go @@ -10048,7 +10048,7 @@ func TestPhp5(t *testing.T) { StartLine: 175, EndLine: 175, StartPos: 3593, - EndPos: 3601, + EndPos: 3602, }, }, Expr: &ast.ExprVariable{ @@ -12426,7 +12426,7 @@ func TestPhp5(t *testing.T) { StartLine: 223, EndLine: 223, StartPos: 4168, - EndPos: 4176, + EndPos: 4177, }, }, Expr: &ast.ExprVariable{ diff --git a/internal/php7/parser_test.go b/internal/php7/parser_test.go index 99ac89f..9ef81b7 100644 --- a/internal/php7/parser_test.go +++ b/internal/php7/parser_test.go @@ -15577,7 +15577,7 @@ func TestExprClone_Brackets(t *testing.T) { StartLine: 1, EndLine: 1, StartPos: 3, - EndPos: 11, + EndPos: 12, }, }, Expr: &ast.ExprVariable{ @@ -19422,7 +19422,7 @@ func TestExprPrint(t *testing.T) { StartLine: 1, EndLine: 1, StartPos: 3, - EndPos: 11, + EndPos: 12, }, }, Expr: &ast.ExprVariable{ diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 0c50734c8604d3340d13baae13c4a73f91c8fa61..89954b66035054f2ade09e65668ad66583eb60ef 100644 GIT binary patch delta 6610 zcmbVRdsvoLwtv>zFCw6UH}KAN<`_BHjeDBm z3zRP9OR0^lc%3@xD~svxih`E4|Dcfc>$!t2n#rvt)a?4{(IqtL|E7?qmQfxQLJKHa zUs^_)%s#Koy~M2~e-K6MK`W>mQ--X4k=p8wD>2}J-yNwnl*JqjyQ6}27*SX*Z6uE_ zdy(cdr-$67u`km?lC2+5qLkfDF*@ND>dNGo!quvczWY_$q}cDXn$VrL&GExDrPoLUB52_mWCcHzpG6m%D9-Q&Eb(-jlW%LC@ zx(#LE?BIIXH~B0ZOb)J~k&aPJ7C$UE zzE61^^h$XaUzGcb^sj^UDT>PHqIK1O+R z>v1^W@nq^E-yEZUU=0*T$)c0gT(ZuCoTO^ zBW|l#eMig4)nqFv+{cc*ydUOCSirqawC$Edy{U=({;Gpsy>m5JRWulO4kAqh!ndD+yF3^L2rn4*sN0s$!M-L~yk#Kc&Th7;?GM}$?@>5al zAvh3L?iCE0>KV~|gfa6|JZ1(rS`&!#GYCDe4Fh zC_BquS+rI4*IPr}9l#aV7t?u%0}w@^0&KeT3JzwN7;GjLYjD~29-IgAh|q^+W)|*r zW8;eK?1=&J%Emu%JVu|$<$+{!hNEA|;j0e&eAlm**8`7&G*c zcV43gdez;$z_|J0hu{JUyZJs@JrZ}O8|5TQ(KbFSU)~F*%2%q^hEy{-@QsSr_mAR{ zWT4Pop)vm=89t4=?U~v4frww`7GT0s&AJ~GHaHW->gD47P(=+g2FE~kWm%l$ZoWK* zfmc2aGweYANH-easr7iCZh)wUv-W_p0aE%9=ccNz{Ly%iBmw*VM?b=Ye?0 zXfMOcIPVFJ!v@)`@|qdHudjc8f_oa%T|X_w-6>19%;%pYt|g_@xRL(oN&c5X+<+7> z;;=sXG>>CxoQynE^dxsx>AuX`g-yuqA&qU-CI+XhhT%O=ahgUzi~<>v(ZW}4(AUtxZr>)%z+wgblg!u*F4Kc9-!>RRTQHLm(6hJjcIM1X!N=Ri zzi(k_zYXm9Wa}Cz6rq#~4~mFvk9O8r4qUJP7W#lTz=zTTwLqxWEO!1opvc=`Ha${= ztltS3$#9X;QheYYP=pc;#x&an#!&brOjU_4RKB$fXE9T!(1~T1K`Ywp<=F496YZ6H zfq>2WIbBc}XAeO3UcHA?2(Q`D45FlIR9Bo+Z= zfVqx(colyU3E^bPKF-m4)F~6x!E2bDbQaU&Pn%Ql!t0sD+G!K8sAD4{+1*9w37-X(#O)?eCP{V$)VbyoAGNq|%chcV0XDF`y|VIM z6{QDU=8s6K7AlX<`Q9KA^4g`Vkm>3Ve1?REqTR`lQ?a`K6^uD#u{>GF{{)~gj_(nC zHqtP$E?Whr!1>WsPE3TF4@MPZLgd-ld*(dGmMHwFjQdb%J+ zor2Q+?)ro{g>o?LjW9T+q51-HXSj>A;;{&e!vvATa~heM8e=zc@3wwo?_Ssp%Owk_ zb;->tPCuKZPLmv778$N;f$f|LcQD1~i>;IxRE*S~BipFuwY4WCi_(e7Y8jMl`Sj>R z9&C?X?8@;>`(NL_yn{MtZ+Dfuu@hvm*Sq7=6csc{td8B-n~f?^8ykIsx z`}1UWb7!dR&rp4h4PwEApq^c5`#8mWpMjzu3NE9YM z?98KikU{b*fZ#>_RYN_$pQ<7!==EAdCF`g98*)A?wJsiL1cp(z{z(lG-w>74cGj#B zIRi`^KPEM$OTo11seRCY_nA3<`c0|5$B&Ws@>NIu!VqKrO7 zhpE2CXIyrohN}{b5LTscjZjMnHnXx!zDvy@U68t=u~D1G8yDAO3Q0xCN`TJhq+T&GjsLCm zi<8wuwjs6E*%@gt4GgBcJ?;DW<_uf%4w5aU;N+HnfRjbjl{PZlO4u~fGO>}NOX+!WdNG>s&A z?QyHJI(v+o2Zw||Opt^pYE)$F#@!e~xoZdVJu>c3*kp3_Z~OV2CqX#iCNx_drY(TH zfv}#nK#isnQ*xqA7%I0tg=r*EOZO}W2EI*7T)r^k7)UnJ+Id>_GA*KYg>l6S+0~Zs z-WJa9NOmq(NT0|SYmsX5TRFGrlk2%L$(ZLr57n@FPVqboB^`WDJ?X}?;AEVhxl|P+ zAT$n+C7HMkab&YcYhCob8bH$Kd4&w_kF5V=1=b_|`k`eC{mCOMv7Q+=>*GketTyYB z!KZ6r3HvZ%iJ=F3avit~`1PT6YMN~!ExRW+s#~PVdpt;2zN9*leE4n+vz=d7OAVs6 zk^GmGU&p!cFx<4W8%7$+QgIN6DTDd&3r zHID9Hi4Olaz;BpDZ&$f0qvrMDZ`(l-@Vi586?q#7RGmgqzkPVf+u+p}Aol*@qILo{ zbJn@{uh1!F2JF7rrE>M~-R3iXH`X8Di#%L(RP7__wio1*T)i)H;&+`;9$=*Vlfg6#~*CmUp2~bNAcG zmK%CgOzp#Bf0GwFnWk`u^qKXDyvmH z8T^%6gbC~G)(!ieS9vv$UOOJVq#*(kM&4Z3IONTuTe$K|5|k= z*;TE2=!+NBK|;|R(&g1A@A%T??#rr&eBJ@IB@h(_84T$jLWp z)xL!6Rt{ROfB+ZrYI}$nv%9G-a-6A1x%RQKuED5tvY90Nqn$iF>6?tP+*Ib#Qu+z% zl}+PWQLUHdNa4rosKmxOrYY+&mKW$_aZZY=mtoZ;i~pcfjfW=c0rAdJQbBLfJUsT* z$Ueh?Ad$zH+Jq!XNFAlLKA^U^se@{+MGGfMmnAvBuc=2h0Cq8+C+%CCJlMtw>MJds zK8*Tb-`2({S9mo{E8c-Sd4-aRJt<%fcPEKR<_OLx~s+V3JiM!c@@dX@rhpn67itoNiiB_y8XC{kv1ah?az{tuT1x;l;i zzn6ASg-@W@@aW=H2i-x~Mo6+?6s`Mv9n>hu8s^n|gx@hKwA?&;uL$7V=5_lLF-ZCb H9shp=VXo6y delta 6454 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 diff --git a/internal/php7/php7.y b/internal/php7/php7.y index e125503..d43148c 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -993,38 +993,42 @@ statement: } | T_WHILE '(' expr ')' while_statement { + exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + switch n := $5.(type) { case *ast.StmtWhile : - n.Cond = $3 + n.Cond = exprBrackets case *ast.StmtAltWhile : - n.Cond = $3 + n.Cond = exprBrackets } $$ = $5 // save position + exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokenNodePosition($1, $5) // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) - yylex.(*Parser).setFreeFloating($$, token.While, $2.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $4.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $4.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } | T_DO statement T_WHILE '(' expr ')' ';' { - $$ = &ast.StmtDo{ast.Node{}, $2, $5} + exprBrackets := &ast.ParserBrackets{ast.Node{}, $5} + $$ = &ast.StmtDo{ast.Node{}, $2, exprBrackets} // save position + exprBrackets.GetNode().Position = position.NewTokensPosition($4, $6) $$.GetNode().Position = position.NewTokensPosition($1, $7) // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) yylex.(*Parser).setFreeFloating($$, token.Stmts, $3.Tokens) - yylex.(*Parser).setFreeFloating($$, token.While, $4.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $6.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Cond, $7.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $4.Tokens) + yylex.(*Parser).setFreeFloating(exprBrackets, token.End, append($6.Tokens, $7.Tokens...)) yylex.(*Parser).setToken($$, token.SemiColon, $7.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) @@ -1058,11 +1062,13 @@ statement: } | T_SWITCH '(' expr ')' switch_case_list { + exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + switch n := $5.(type) { case *ast.StmtSwitch: - n.Cond = $3 + n.Cond = exprBrackets case *ast.StmtAltSwitch: - n.Cond = $3 + n.Cond = exprBrackets default: panic("unexpected node type") } @@ -1070,12 +1076,13 @@ statement: $$ = $5 // save position + exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokenNodePosition($1, $5) // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Switch, $2.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $4.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $4.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -1977,33 +1984,37 @@ while_statement: if_stmt_without_else: T_IF '(' expr ')' statement { - $$ = &ast.StmtIf{ast.Node{}, $3, $5, nil, nil} + exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + $$ = &ast.StmtIf{ast.Node{}, exprBrackets, $5, nil, nil} // save position + exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokenNodePosition($1, $5) // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) - yylex.(*Parser).setFreeFloating($$, token.If, $2.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $4.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $4.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } | if_stmt_without_else T_ELSEIF '(' expr ')' statement { - _elseIf := &ast.StmtElseIf{ast.Node{}, $4, $6} + exprBrackets := &ast.ParserBrackets{ast.Node{}, $4} + _elseIf := &ast.StmtElseIf{ast.Node{}, exprBrackets, $6} $1.(*ast.StmtIf).ElseIf = append($1.(*ast.StmtIf).ElseIf, _elseIf) $$ = $1 // save position + exprBrackets.GetNode().Position = position.NewTokensPosition($3, $5) _elseIf.GetNode().Position = position.NewTokenNodePosition($2, $6) $$.GetNode().Position = position.NewNodesPosition($1, $6) // save comments yylex.(*Parser).setFreeFloating(_elseIf, token.Start, $2.Tokens) - yylex.(*Parser).setFreeFloating(_elseIf, token.ElseIf, $3.Tokens) - yylex.(*Parser).setFreeFloating(_elseIf, token.Expr, $5.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $3.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $5.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -3862,11 +3873,14 @@ expr_without_variable: } | '(' expr ')' { - $$ = $2; + $$ = &ast.ParserBrackets{ast.Node{}, $2} + + // save position + $$.GetNode().Position = position.NewTokensPosition($1, $3) // save comments - yylex.(*Parser).setFreeFloatingTokens($$, token.Start, append($1.Tokens, $$.GetNode().Tokens[token.Start]...)) - yylex.(*Parser).setFreeFloatingTokens($$, token.End, append($$.GetNode().Tokens[token.End], $3.Tokens...)) + yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.Tokens) + yylex.(*Parser).setFreeFloatingTokens($$, token.End, $3.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -4016,17 +4030,10 @@ expr_without_variable: } | T_EXIT exit_expr { - var e *ast.ExprExit; - if $2 != nil { - e = $2.(*ast.ExprExit) - } else { - e = &ast.ExprExit{ast.Node{}, false, nil} - } - - $$ = e + $$ = &ast.ExprExit{ast.Node{}, false, $2} if (bytes.EqualFold($1.Value, []byte("die"))) { - e.Die = true + $$.(*ast.ExprExit).Die = true } // save position @@ -4405,14 +4412,14 @@ exit_expr: } | '(' optional_expr ')' { - $$ = &ast.ExprExit{ast.Node{}, false, $2}; + $$ = &ast.ParserBrackets{ast.Node{}, $2} // save position $$.GetNode().Position = position.NewTokensPosition($1, $3) // save comments - yylex.(*Parser).setFreeFloatingTokens($$, token.Exit, $1.Tokens) - yylex.(*Parser).setFreeFloatingTokens($$, token.Expr, $3.Tokens) + yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.Tokens) + yylex.(*Parser).setFreeFloatingTokens($$, token.End, $3.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -4780,11 +4787,14 @@ dereferencable: } | '(' expr ')' { - $$ = $2; + $$ = &ast.ParserBrackets{ast.Node{}, $2} + + // save position + $$.GetNode().Position = position.NewTokensPosition($1, $3) // save comments - yylex.(*Parser).setFreeFloatingTokens($$, token.Start, append($1.Tokens, $$.GetNode().Tokens[token.Start]...)) - yylex.(*Parser).setFreeFloatingTokens($$, token.End, append($$.GetNode().Tokens[token.End], $3.Tokens...)) + yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.Tokens) + yylex.(*Parser).setFreeFloatingTokens($$, token.End, $3.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -4805,11 +4815,14 @@ callable_expr: } | '(' expr ')' { - $$ = $2; + $$ = &ast.ParserBrackets{ast.Node{}, $2} + + // save position + $$.GetNode().Position = position.NewTokensPosition($1, $3) // save comments - yylex.(*Parser).setFreeFloatingTokens($$, token.Start, append($1.Tokens, $$.GetNode().Tokens[token.Start]...)) - yylex.(*Parser).setFreeFloatingTokens($$, token.End, append($$.GetNode().Tokens[token.End], $3.Tokens...)) + yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $1.Tokens) + yylex.(*Parser).setFreeFloatingTokens($$, token.End, $3.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -5528,15 +5541,17 @@ internal_functions_in_yacc: } | T_EMPTY '(' expr ')' { - $$ = &ast.ExprEmpty{ast.Node{}, $3} + exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + $$ = &ast.ExprEmpty{ast.Node{}, exprBrackets} // save position + exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Empty, $2.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $4.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $4.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -5566,15 +5581,17 @@ internal_functions_in_yacc: } | T_EVAL '(' expr ')' { - $$ = &ast.ExprEval{ast.Node{}, $3} + exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} + $$ = &ast.ExprEval{ast.Node{}, exprBrackets} // save position + exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Eval, $2.Tokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $4.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.Tokens) + yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $4.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } diff --git a/internal/php7/php7_test.go b/internal/php7/php7_test.go index 49f450b..68364f5 100644 --- a/internal/php7/php7_test.go +++ b/internal/php7/php7_test.go @@ -11046,7 +11046,7 @@ func TestPhp7(t *testing.T) { StartLine: 187, EndLine: 187, StartPos: 3780, - EndPos: 3788, + EndPos: 3789, }, }, Expr: &ast.ExprVariable{ @@ -13123,7 +13123,7 @@ func TestPhp7(t *testing.T) { StartLine: 232, EndLine: 232, StartPos: 4298, - EndPos: 4306, + EndPos: 4307, }, }, Expr: &ast.ExprVariable{ @@ -18632,7 +18632,7 @@ func TestPhp7(t *testing.T) { Position: &position.Position{ StartLine: 332, EndLine: 332, - StartPos: 5518, + StartPos: 5517, EndPos: 5532, }, }, @@ -18641,7 +18641,7 @@ func TestPhp7(t *testing.T) { Position: &position.Position{ StartLine: 332, EndLine: 332, - StartPos: 5518, + StartPos: 5517, EndPos: 5531, }, }, @@ -18696,7 +18696,7 @@ func TestPhp7(t *testing.T) { Position: &position.Position{ StartLine: 333, EndLine: 333, - StartPos: 5534, + StartPos: 5533, EndPos: 5545, }, }, @@ -18705,7 +18705,7 @@ func TestPhp7(t *testing.T) { Position: &position.Position{ StartLine: 333, EndLine: 333, - StartPos: 5534, + StartPos: 5533, EndPos: 5544, }, }, diff --git a/pkg/ast/visitor/filter_parser_nodes.go b/pkg/ast/visitor/filter_parser_nodes.go index a7f5529..f1a5655 100644 --- a/pkg/ast/visitor/filter_parser_nodes.go +++ b/pkg/ast/visitor/filter_parser_nodes.go @@ -42,8 +42,12 @@ func (v *FilterParserNodes) StmtUseDeclaration(n *ast.StmtUseDeclaration) { } func (v *FilterParserNodes) StmtAltIf(n *ast.StmtAltIf) { - if nn, ok := n.Cond.(*ast.ParserBrackets); ok { - n.Cond = nn.Child + for { + if nn, ok := n.Cond.(*ast.ParserBrackets); ok { + n.Cond = nn.Child + } else { + break + } } if nn, ok := n.Stmt.(*ast.ParserBrackets); ok { @@ -52,8 +56,12 @@ func (v *FilterParserNodes) StmtAltIf(n *ast.StmtAltIf) { } func (v *FilterParserNodes) StmtAltElseIf(n *ast.StmtAltElseIf) { - if nn, ok := n.Cond.(*ast.ParserBrackets); ok { - n.Cond = nn.Child + for { + if nn, ok := n.Cond.(*ast.ParserBrackets); ok { + n.Cond = nn.Child + } else { + break + } } if nn, ok := n.Stmt.(*ast.ParserBrackets); ok { @@ -66,3 +74,1194 @@ func (v *FilterParserNodes) StmtAltElse(n *ast.StmtAltElse) { 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 { + n.Cond = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) StmtAltWhile(n *ast.StmtAltWhile) { + for { + if nn, ok := n.Cond.(*ast.ParserBrackets); ok { + n.Cond = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) StmtDo(n *ast.StmtDo) { + for { + if nn, ok := n.Cond.(*ast.ParserBrackets); ok { + n.Cond = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) StmtSwitch(n *ast.StmtSwitch) { + for { + if nn, ok := n.Cond.(*ast.ParserBrackets); ok { + n.Cond = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) StmtAltSwitch(n *ast.StmtAltSwitch) { + for { + if nn, ok := n.Cond.(*ast.ParserBrackets); ok { + n.Cond = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprExit(n *ast.ExprExit) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) StmtContinue(n *ast.StmtContinue) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) StmtBreak(n *ast.StmtBreak) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprClone(n *ast.ExprClone) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprPrint(n *ast.ExprPrint) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) StmtExpression(n *ast.StmtExpression) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) StmtEcho(n *ast.StmtEcho) { + for k, v := range n.Exprs { + for { + if nn, ok := v.(*ast.ParserBrackets); ok { + v = nn.Child + } else { + break + } + } + + n.Exprs[k] = v + } +} + +func (v *FilterParserNodes) ExprIsset(n *ast.ExprIsset) { + for k, v := range n.Vars { + for { + if nn, ok := v.(*ast.ParserBrackets); ok { + v = nn.Child + } else { + break + } + } + + n.Vars[k] = v + } +} + +func (v *FilterParserNodes) StmtReturn(n *ast.StmtReturn) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) StmtForeach(n *ast.StmtForeach) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) StmtAltForeach(n *ast.StmtAltForeach) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprYield(n *ast.ExprYield) { + for { + if nn, ok := n.Key.(*ast.ParserBrackets); ok { + n.Key = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Value.(*ast.ParserBrackets); ok { + n.Value = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) Argument(n *ast.Argument) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) StmtThrow(n *ast.StmtThrow) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) StmtCase(n *ast.StmtCase) { + for { + if nn, ok := n.Cond.(*ast.ParserBrackets); ok { + n.Cond = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprVariable(n *ast.ExprVariable) { + for { + if nn, ok := n.VarName.(*ast.ParserBrackets); ok { + n.VarName = nn.Child + } else { + break + } + } +} + +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 { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignBitwiseAnd(n *ast.ExprAssignBitwiseAnd) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignBitwiseOr(n *ast.ExprAssignBitwiseOr) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignBitwiseXor(n *ast.ExprAssignBitwiseXor) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignCoalesce(n *ast.ExprAssignCoalesce) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignConcat(n *ast.ExprAssignConcat) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignDiv(n *ast.ExprAssignDiv) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignMinus(n *ast.ExprAssignMinus) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignMod(n *ast.ExprAssignMod) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignMul(n *ast.ExprAssignMul) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignPlus(n *ast.ExprAssignPlus) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignPow(n *ast.ExprAssignPow) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignShiftLeft(n *ast.ExprAssignShiftLeft) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprAssignShiftRight(n *ast.ExprAssignShiftRight) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} +func (v *FilterParserNodes) ExprBinaryBitwiseAnd(n *ast.ExprBinaryBitwiseAnd) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryBitwiseOr(n *ast.ExprBinaryBitwiseOr) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryBitwiseXor(n *ast.ExprBinaryBitwiseXor) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryBooleanAnd(n *ast.ExprBinaryBooleanAnd) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryBooleanOr(n *ast.ExprBinaryBooleanOr) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryCoalesce(n *ast.ExprBinaryCoalesce) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryConcat(n *ast.ExprBinaryConcat) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryDiv(n *ast.ExprBinaryDiv) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryEqual(n *ast.ExprBinaryEqual) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryGreater(n *ast.ExprBinaryGreater) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryGreaterOrEqual(n *ast.ExprBinaryGreaterOrEqual) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryIdentical(n *ast.ExprBinaryIdentical) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryLogicalAnd(n *ast.ExprBinaryLogicalAnd) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryLogicalOr(n *ast.ExprBinaryLogicalOr) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryLogicalXor(n *ast.ExprBinaryLogicalXor) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryMinus(n *ast.ExprBinaryMinus) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryMod(n *ast.ExprBinaryMod) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryMul(n *ast.ExprBinaryMul) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryNotEqual(n *ast.ExprBinaryNotEqual) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryNotIdentical(n *ast.ExprBinaryNotIdentical) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryPlus(n *ast.ExprBinaryPlus) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryPow(n *ast.ExprBinaryPow) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryShiftLeft(n *ast.ExprBinaryShiftLeft) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinaryShiftRight(n *ast.ExprBinaryShiftRight) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinarySmaller(n *ast.ExprBinarySmaller) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinarySmallerOrEqual(n *ast.ExprBinarySmallerOrEqual) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBinarySpaceship(n *ast.ExprBinarySpaceship) { + for { + if nn, ok := n.Left.(*ast.ParserBrackets); ok { + n.Left = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Right.(*ast.ParserBrackets); ok { + n.Right = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprUnaryMinus(n *ast.ExprUnaryMinus) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprUnaryPlus(n *ast.ExprUnaryPlus) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBooleanNot(n *ast.ExprBooleanNot) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprBitwiseNot(n *ast.ExprBitwiseNot) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprInstanceOf(n *ast.ExprInstanceOf) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprTernary(n *ast.ExprTernary) { + for { + if nn, ok := n.Condition.(*ast.ParserBrackets); ok { + n.Condition = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.IfTrue.(*ast.ParserBrackets); ok { + n.IfTrue = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.IfFalse.(*ast.ParserBrackets); ok { + n.IfFalse = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprCastArray(n *ast.ExprCastArray) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprCastBool(n *ast.ExprCastBool) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprCastDouble(n *ast.ExprCastDouble) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprCastInt(n *ast.ExprCastInt) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprCastObject(n *ast.ExprCastObject) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprCastString(n *ast.ExprCastString) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprCastUnset(n *ast.ExprCastUnset) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprErrorSuppress(n *ast.ExprErrorSuppress) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprArrayDimFetch(n *ast.ExprArrayDimFetch) { + for { + if nn, ok := n.Dim.(*ast.ParserBrackets); ok { + n.Dim = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprArrayItem(n *ast.ExprArrayItem) { + for { + if nn, ok := n.Key.(*ast.ParserBrackets); ok { + n.Key = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Val.(*ast.ParserBrackets); ok { + n.Val = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprEmpty(n *ast.ExprEmpty) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprInclude(n *ast.ExprInclude) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprIncludeOnce(n *ast.ExprIncludeOnce) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprEval(n *ast.ExprEval) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprRequire(n *ast.ExprRequire) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprRequireOnce(n *ast.ExprRequireOnce) { + for { + if nn, ok := n.Expr.(*ast.ParserBrackets); ok { + n.Expr = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprPropertyFetch(n *ast.ExprPropertyFetch) { + for { + if nn, ok := n.Var.(*ast.ParserBrackets); ok { + n.Var = nn.Child + } else { + break + } + } + + for { + if nn, ok := n.Property.(*ast.ParserBrackets); ok { + n.Property = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprFunctionCall(n *ast.ExprFunctionCall) { + for { + if nn, ok := n.Function.(*ast.ParserBrackets); ok { + n.Function = nn.Child + } else { + break + } + } +} + +func (v *FilterParserNodes) ExprStaticCall(n *ast.ExprStaticCall) { + for { + if nn, ok := n.Call.(*ast.ParserBrackets); ok { + n.Call = nn.Child + } else { + break + } + } +} diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index 64a32c9..3951b6f 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -1530,11 +1530,16 @@ func (p *Printer) printExprEmpty(n ast.Vertex) { nn := n.(*ast.ExprEmpty) p.printFreeFloating(nn, token.Start) io.WriteString(p.w, "empty") - p.printFreeFloating(nn, token.Empty) - io.WriteString(p.w, "(") + + if _, ok := nn.Expr.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, "(") + } + p.Print(nn.Expr) - p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, ")") + + if _, ok := nn.Expr.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, ")") + } p.printFreeFloating(nn, token.End) } @@ -1551,12 +1556,18 @@ func (p *Printer) printExprErrorSuppress(n ast.Vertex) { func (p *Printer) printExprEval(n ast.Vertex) { nn := n.(*ast.ExprEval) p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "eval") - p.printFreeFloating(nn, token.Eval) - io.WriteString(p.w, "(") + + if _, ok := nn.Expr.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, "(") + } + p.Print(nn.Expr) - p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, ")") + + if _, ok := nn.Expr.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, ")") + } p.printFreeFloating(nn, token.End) } @@ -1570,7 +1581,6 @@ func (p *Printer) printExprExit(n ast.Vertex) { } else { io.WriteString(p.w, "exit") } - p.printFreeFloating(nn, token.Exit) if nn.Expr != nil && nn.Expr.GetNode().Tokens.IsEmpty() && nn.GetNode().Tokens.IsEmpty() { io.WriteString(p.w, " ") @@ -2163,11 +2173,17 @@ func (p *Printer) printStmtAltSwitch(n ast.Vertex) { p.printFreeFloating(nn, token.Start) io.WriteString(p.w, "switch") - p.printFreeFloating(nn, token.Switch) - io.WriteString(p.w, "(") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, "(") + } + p.Print(nn.Cond) - p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, ")") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, ")") + } + p.printFreeFloating(nn, token.Cond) io.WriteString(p.w, ":") @@ -2192,11 +2208,17 @@ func (p *Printer) printStmtAltWhile(n ast.Vertex) { p.printFreeFloating(nn, token.Start) io.WriteString(p.w, "while") - p.printFreeFloating(nn, token.While) - io.WriteString(p.w, "(") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, "(") + } + p.Print(nn.Cond) - p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, ")") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, ")") + } + p.printFreeFloating(nn, token.Cond) io.WriteString(p.w, ":") @@ -2543,11 +2565,17 @@ func (p *Printer) printStmtDo(n ast.Vertex) { p.printFreeFloating(nn, token.Stmts) io.WriteString(p.w, "while") - p.printFreeFloating(nn, token.While) - io.WriteString(p.w, "(") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, "(") + } + p.Print(nn.Cond) - p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, ")") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, ")") + } + p.printFreeFloating(nn, token.Cond) p.printFreeFloating(nn, token.SemiColon) @@ -2587,11 +2615,16 @@ func (p *Printer) printStmtElseif(n ast.Vertex) { p.printFreeFloating(nn, token.Start) io.WriteString(p.w, "elseif") - p.printFreeFloating(nn, token.ElseIf) - io.WriteString(p.w, "(") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, "(") + } + p.Print(nn.Cond) - p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, ")") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, ")") + } p.Print(nn.Stmt) @@ -2794,11 +2827,16 @@ func (p *Printer) printStmtIf(n ast.Vertex) { p.printFreeFloating(nn, token.Start) io.WriteString(p.w, "if") - p.printFreeFloating(n, token.If) - io.WriteString(p.w, "(") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, "(") + } + p.Print(nn.Cond) - p.printFreeFloating(n, token.Expr) - io.WriteString(p.w, ")") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, ")") + } p.Print(nn.Stmt) @@ -3020,11 +3058,16 @@ func (p *Printer) printStmtSwitch(n ast.Vertex) { p.printFreeFloating(nn, token.Start) io.WriteString(p.w, "switch") - p.printFreeFloating(nn, token.Switch) - io.WriteString(p.w, "(") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, "(") + } + p.Print(nn.Cond) - p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, ")") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, ")") + } p.printFreeFloating(nn.CaseList, token.Start) io.WriteString(p.w, "{") @@ -3292,11 +3335,16 @@ func (p *Printer) printStmtWhile(n ast.Vertex) { p.printFreeFloating(nn, token.Start) io.WriteString(p.w, "while") - p.printFreeFloating(nn, token.While) - io.WriteString(p.w, "(") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, "(") + } + p.Print(nn.Cond) - p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, ")") + + if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { + io.WriteString(p.w, ")") + } p.Print(nn.Stmt) diff --git a/pkg/token/position.go b/pkg/token/position.go index 329f8aa..2ea40d4 100644 --- a/pkg/token/position.go +++ b/pkg/token/position.go @@ -27,28 +27,19 @@ const ( Namespace Static - Class Use - While For - Switch Foreach Declare Label Finally List Default - If - ElseIf - Else Function Alias Equal - Exit Array Isset - Empty - Eval Echo Try Catch @@ -68,7 +59,6 @@ const ( AdaptationList LexicalVarList - OpenParenthesisToken CloseParenthesisToken ) diff --git a/pkg/token/position_string.go b/pkg/token/position_string.go index 389ec94..ac7c7b5 100644 --- a/pkg/token/position_string.go +++ b/pkg/token/position_string.go @@ -30,52 +30,42 @@ func _() { _ = x[Cond-19] _ = x[Namespace-20] _ = x[Static-21] - _ = x[Class-22] - _ = x[Use-23] - _ = x[While-24] - _ = x[For-25] - _ = x[Switch-26] - _ = x[Foreach-27] - _ = x[Declare-28] - _ = x[Label-29] - _ = x[Finally-30] - _ = x[List-31] - _ = x[Default-32] - _ = x[If-33] - _ = x[ElseIf-34] - _ = x[Else-35] - _ = x[Function-36] - _ = x[Alias-37] - _ = x[Equal-38] - _ = x[Exit-39] - _ = x[Array-40] - _ = x[Isset-41] - _ = x[Empty-42] - _ = x[Eval-43] - _ = x[Echo-44] - _ = x[Try-45] - _ = x[Catch-46] - _ = x[Unset-47] - _ = x[Stmts-48] - _ = x[VarList-49] - _ = x[ConstList-50] - _ = x[NameList-51] - _ = x[ParamList-52] - _ = x[ModifierList-53] - _ = x[ArrayPairList-54] - _ = x[CaseListStart-55] - _ = x[CaseListEnd-56] - _ = x[PropertyList-57] - _ = x[ParameterList-58] - _ = x[AdaptationList-59] - _ = x[LexicalVarList-60] - _ = x[OpenParenthesisToken-61] - _ = x[CloseParenthesisToken-62] + _ = x[Use-22] + _ = x[For-23] + _ = x[Foreach-24] + _ = x[Declare-25] + _ = x[Label-26] + _ = x[Finally-27] + _ = x[List-28] + _ = x[Default-29] + _ = x[Function-30] + _ = x[Alias-31] + _ = x[Equal-32] + _ = x[Array-33] + _ = x[Isset-34] + _ = x[Echo-35] + _ = x[Try-36] + _ = x[Catch-37] + _ = x[Unset-38] + _ = x[Stmts-39] + _ = x[VarList-40] + _ = x[ConstList-41] + _ = x[NameList-42] + _ = x[ParamList-43] + _ = x[ModifierList-44] + _ = x[ArrayPairList-45] + _ = x[CaseListStart-46] + _ = x[CaseListEnd-47] + _ = x[PropertyList-48] + _ = x[ParameterList-49] + _ = x[AdaptationList-50] + _ = x[LexicalVarList-51] + _ = x[CloseParenthesisToken-52] } -const _Position_name = "StartEndSemiColonAltEndAmpersandNameKeyVarReturnTypeCaseSeparatorLexicalVarsParamsRefCastExprInitExprCondExprIncExprTrueCondNamespaceStaticClassUseWhileForSwitchForeachDeclareLabelFinallyListDefaultIfElseIfElseFunctionAliasEqualExitArrayIssetEmptyEvalEchoTryCatchUnsetStmtsVarListConstListNameListParamListModifierListArrayPairListCaseListStartCaseListEndPropertyListParameterListAdaptationListLexicalVarListOpenParenthesisTokenCloseParenthesisToken" +const _Position_name = "StartEndSemiColonAltEndAmpersandNameKeyVarReturnTypeCaseSeparatorLexicalVarsParamsRefCastExprInitExprCondExprIncExprTrueCondNamespaceStaticUseForForeachDeclareLabelFinallyListDefaultFunctionAliasEqualArrayIssetEchoTryCatchUnsetStmtsVarListConstListNameListParamListModifierListArrayPairListCaseListStartCaseListEndPropertyListParameterListAdaptationListLexicalVarListCloseParenthesisToken" -var _Position_index = [...]uint16{0, 5, 8, 17, 23, 32, 36, 39, 42, 52, 65, 76, 82, 85, 89, 93, 101, 109, 116, 120, 124, 133, 139, 144, 147, 152, 155, 161, 168, 175, 180, 187, 191, 198, 200, 206, 210, 218, 223, 228, 232, 237, 242, 247, 251, 255, 258, 263, 268, 273, 280, 289, 297, 306, 318, 331, 344, 355, 367, 380, 394, 408, 428, 449} +var _Position_index = [...]uint16{0, 5, 8, 17, 23, 32, 36, 39, 42, 52, 65, 76, 82, 85, 89, 93, 101, 109, 116, 120, 124, 133, 139, 142, 145, 152, 159, 164, 171, 175, 182, 190, 195, 200, 205, 210, 214, 217, 222, 227, 232, 239, 248, 256, 265, 277, 290, 303, 314, 326, 339, 353, 367, 388} func (i Position) String() string { if i < 0 || i >= Position(len(_Position_index)-1) {