From e78f0dc650016ffd19ebd4782b0cb0b73d93fcbc Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Mon, 14 Sep 2020 19:25:38 +0300 Subject: [PATCH] [refactoring] update ast structure of "Declare" and "ConstList" nodes --- internal/php5/php5.go | Bin 289930 -> 290009 bytes internal/php5/php5.y | 114 ++++++++++++++++--------------- internal/php7/php7.go | Bin 242866 -> 242956 bytes internal/php7/php7.y | 71 ++++++++++--------- pkg/ast/ast.go | 3 +- pkg/ast/node.go | 48 ++++++------- pkg/ast/traverser/dfs.go | 24 ------- pkg/ast/visitor/dump.go | 16 ++--- pkg/ast/visitor/filter_tokens.go | 11 +++ pkg/ast/visitor/null.go | 12 ++-- pkg/printer/printer.go | 74 +++++++------------- 11 files changed, 164 insertions(+), 209 deletions(-) diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 498f6b5468fba0723139ac5341758a126490bb1a..7492a95e14214c9de398c6cdef4dd7978946ff0b 100644 GIT binary patch delta 10028 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 UN&e1=aMs0>tYS%HrdXc;1(sD~%>V!Z delta 9817 zcmai32Xs|M`ad&sQ(hlZup#~L^vJjdpQiWI$S*m;3RVluO z56clyu~LFjM;A9BVndL~iUrU_DI!wsxTyc%H}}4mpnLXz4!O*HGxN>Y%e+rMY4-O| znpNJGk!Yu+RLq_cy+*dF`bWmvoOzL8o;MOK$n*LOeEhNVyn!G-1(9%`Hx$4p;*aE| zc>ED8hwMn6H^>_UHdX>QA1(~!d2N3o7JL|m3PU`yam4Hn1Tc>T@v(hAoDKxBDG@v(0_TgXFvbm-hJ3&b0s!D`z5gXX=kG*>xz5F*sPvHNNQW?_Pc_sIm=HI1>M7`^+`? z;C$>KU&Yk$2Y1E)g&+d{vweo*VAZ*IEisRUgFm2%0D<`f`Un%|kA0w`6pzspP)1^Z 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 diff --git a/internal/php5/php5.y b/internal/php5/php5.y index 5fb516e..53276ee 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -241,7 +241,7 @@ import ( %type trait_method_reference_fully_qualified trait_method_reference trait_modifiers member_modifier method %type static_scalar_value static_operation static_var_list global_var_list %type ctor_arguments function_call_parameter_list echo_expr_list -%type trait_adaptations unset_variables +%type trait_adaptations unset_variables declare_list %type switch_case_list %type method_body %type foreach_statement for_statement while_statement @@ -255,7 +255,7 @@ import ( %type top_statement_list namespace_name use_declarations use_function_declarations use_const_declarations %type inner_statement_list encaps_list isset_variables non_empty_array_pair_list %type array_pair_list assignment_list lexical_var_list elseif_list new_elseif_list non_empty_for_expr -%type for_expr case_list declare_list catch_statement additional_catches +%type for_expr case_list catch_statement additional_catches %type non_empty_additional_catches parameter_list non_empty_parameter_list class_statement_list %type class_statement_list variable_modifiers method_modifiers class_variable_declaration %type interface_list non_empty_function_call_parameter_list trait_list trait_adaptation_list non_empty_trait_adaptation_list @@ -722,7 +722,7 @@ constant_declaration: { constList := $1.(*ast.StmtConstList) constList.Node.Position = position.NewNodesPosition($1, $5) - lastNode(constList.Consts).(*ast.StmtConstant).CommaTkn = $2 + constList.SeparatorTkns = append(constList.SeparatorTkns, $2) constList.Consts = append(constList.Consts, &ast.StmtConstant{ Node: ast.Node{ Position: position.NewTokenNodePosition($3, $5), @@ -1130,16 +1130,14 @@ unticked_statement: } | T_DECLARE '(' declare_list ')' declare_statement { + $5.(*ast.StmtDeclare).DeclareTkn = $1 + $5.(*ast.StmtDeclare).OpenParenthesisTkn = $2 + $5.(*ast.StmtDeclare).Consts = $3.(*ast.ParserSeparatedList).Items + $5.(*ast.StmtDeclare).SeparatorTkns = $3.(*ast.ParserSeparatedList).SeparatorTkns + $5.(*ast.StmtDeclare).CloseParenthesisTkn = $4 + $5.(*ast.StmtDeclare).Node.Position = position.NewTokenNodePosition($1, $5) + $$ = $5 - $$.(*ast.StmtDeclare).Consts = $3 - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $5) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Declare, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.ConstList, $4.SkippedTokens) } | ';' { @@ -1646,29 +1644,30 @@ foreach_statement: declare_statement: statement { - $$ = &ast.StmtDeclare{ast.Node{}, false, nil, $1} - - // save position - $$.GetNode().Position = position.NewNodePosition($1) + $$ = &ast.StmtDeclare{ + Node: ast.Node{ + Position: position.NewNodePosition($1), + }, + Stmt: $1, + } } | ':' inner_statement_list T_ENDDECLARE ';' { - stmtList := &ast.StmtStmtList{ + $$ = &ast.StmtDeclare{ 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, + }, + EndDeclareTkn: $3, + SemiColonTkn: $4, } - $$ = &ast.StmtDeclare{ast.Node{}, true, 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) } ; @@ -1676,42 +1675,49 @@ declare_statement: declare_list: T_STRING '=' static_scalar { - $$ = []ast.Vertex{ - &ast.StmtConstant{ - Node: ast.Node{ - Position: position.NewTokenNodePosition($1, $3), - }, - Name: &ast.Identifier{ - Node: ast.Node{ - Position: position.NewTokenPosition($1), + $$ = &ast.ParserSeparatedList{ + Items: []ast.Vertex{ + &ast.StmtConstant{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($1, $3), }, - Value: $1.Value, + Name: &ast.Identifier{ + Node: ast.Node{ + Position: position.NewTokenPosition($1), + }, + Value: $1.Value, + }, + EqualTkn: $2, + Expr: $3, }, - EqualTkn: $2, - Expr: $3, }, } - yylex.(*Parser).setFreeFloating(lastNode($$).(*ast.StmtConstant).Name, token.Start, $1.SkippedTokens) + yylex.(*Parser).setFreeFloating(lastNode($$.(*ast.ParserSeparatedList).Items).(*ast.StmtConstant).Name, token.Start, $1.SkippedTokens) } | declare_list ',' T_STRING '=' static_scalar { - lastNode($1).(*ast.StmtConstant).CommaTkn = $2 - $$ = append($1, &ast.StmtConstant{ - Node: ast.Node{ - Position: position.NewTokenNodePosition($3, $5), - }, - Name: &ast.Identifier{ - Node: ast.Node{ - Position: position.NewTokenPosition($3), + $1.(*ast.ParserSeparatedList).SeparatorTkns = append($1.(*ast.ParserSeparatedList).SeparatorTkns, $2) + $1.(*ast.ParserSeparatedList).Items = append( + $1.(*ast.ParserSeparatedList).Items, + &ast.StmtConstant{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($3, $5), }, - Value: $3.Value, + Name: &ast.Identifier{ + Node: ast.Node{ + Position: position.NewTokenPosition($3), + }, + Value: $3.Value, + }, + EqualTkn: $4, + Expr: $5, }, - EqualTkn: $4, - Expr: $5, - }) + ) - yylex.(*Parser).setFreeFloating(lastNode($$).(*ast.StmtConstant).Name, token.Start, $3.SkippedTokens) + $$ = $1 + + yylex.(*Parser).setFreeFloating(lastNode($$.(*ast.ParserSeparatedList).Items).(*ast.StmtConstant).Name, token.Start, $3.SkippedTokens) } ; diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 4b801a5b3ae24a87ce3b4613bacb781be912af34..6ecb7f7a0d42c861a24492f24c51ab7651f705ad 100644 GIT binary patch delta 8002 zcma)B33Qd!wO;$2B#;0h2@ps^$V~!-KyJ8yhC9e&2xSNY8i5iK0|^j7nZj%pgjh>K zv|_KaRiq?Zu?`h9%0UJTOY@XL3=YMog5pS(La09Nt8IPXKL5>twO!BUxjExLd-(Qn zexChP{GDIK?~YH^L7%T7G4=5WI_Aa227^wXC;VbVzYcM+0beotUo_;RAM^*%Pkk<@ zTU@LY%<}|`?GH8ti;EhreeN#m==gkj9{hyAe12H8KhG2Lhx7N8#rQ*c9)BpjVb5Ke z1+s2`aEaq{a9;s7N(>btUVh?Yi*QVu<7@c|6f}fhsG(lCHi+gF zU@zA2e+Z(4io%EY4Nt^EDAIz^NU$KBxc_fMi$wt3=UDa0PvGA-=oFOOTDbH;Ir$sv z4*ViULHeARmh^yxUQviwc<>hDB5%+ae)6UJC=@Pvd7Ix_T?BWEut7Rr7YIeT*71QG zui(WSf<3&BBjf}lT^myrP%)^n0(3Sto>d^a@V~ajfOBu4DBR_h&2b_)bnXoW!w~`+_Bbmpu=T9Dig~VCi77;n7zMC|Tg> zEs)!-*aadM*u8KhI{{Y}TUqQ%sIVdPXobqNdcl$)#VN*VN8}eLkr}TT2+|9gfIs}i z@kL3N53hs87EZ%Cuier?aPAEigdcyc)T&-?b|54;6%v8saLkFSfucpML?jm_U@Ype zj9T{WT*wLEb0R-RmIHxsULTN%yIg%b z!l5u!_xh?%cGeQ}hclacVsEJFIDw^;( zW|oYkY1G>7M*Phv8bbjybTpk%6f&Jl@VKl~RzKKEQ1guc43mjWM{AcZ{c8 zp6OK`d5NFm&GKpVd%|6rvq5geTGt=oWR4kWgB>k%*`S=>j=7bL^ zzT3YpuHem;sxN=PhoX7#TI#?Mox{sfxaaj z@)elj3rK4i5j(QY+{JXh#iC|$4GkfCW^1*IGe?%v740w1T23JXP_JJ>w@`Ed`nZKX zt7w3UT18hAPhUZO`RYm)W7e*waRh8G9S@k4?V%WR?k0-E(bkzLlXNphspw)$q+$*A zHzjLmo{IL{iIR0RfEU!#pgrqonBre|RY|6-mO5!(KN05o!#sGxw%aMT!>H=n3#*n@ zbM0!}T{Dl8>@@#;jVL)X?89ZZQWQ4R=LnLqjbJ9KLl2 zkXOu$p2W|VLX~TB>gfJxPK>=PTbQHxTfNSjapYe251D^Nbqit zisq&#q2ro86l=Quj;3k8#-sc^;u}Pj3)^*!+5IH-(GVTJHJsyjAu9Q~WSqK^>vy@L z+2EQ)-1C`;f+g5ueCM-vFBqP|gG112uz?P$ACPB|Pcu{Y&?lnar(b~cO?`n->=^Xx z1+``S=_W{oKbd^&1#tP*e%dTvv+f|R)I~m@bUdc#i*ye~G%ca;-9NaIG?@?Wf_Ls) zsnbp6A;|B#*vr7irZqa%3{KOz#J$()u6*ktmCC+{a9Ld+-HXejbQagY1R(_&TdQ@n ziF=uj*-O&6xsl#<1D3=E{<;xZsw<)r9()eTXUTc|JpDes#QCq%HWzj{(Sc7NfiXNs zFlU3EjVbRQp+85c!e67>{Hh##E00qu4?6;Re|a21>6#kyv}`bEk3gQ55j)4|YQFTc z8l|1$BKJz)n>3d_cSF`KP4u}$G!Gwpi>mm{Q#zGrR3movc>|#-l2l%Ki>hTQS%iq^ zeQ(mGh*N-$0n{gn-T{OjeElqB^N0V4APcNq1O#jHsE^4wMXN{xF#wWp8sC8-1)zm| z^}E1AAzN%7d$+w0aN&D&GQxoIypMp`&OZj7p+^WMs6p1MS15hm+;*r^_2x%E0!f=p z2l44Ikqzq>Ap+IJ>W*CZHFe_SJyj30{bNa=O}Ak`R2$8CXJ`ofHX&{9`wSA!I8TW@ zL0ow8r}VCb10?P|{_X=>BfFB@$eGl0)K3AHBfg-evJo5&GPw5(M94`L}Jk4jozMTw8Ck5(kZH0~3xI+{mf)P6w(SSsX< zm#LN)e*@gtY}REwB3BLKnG?GuDeG^^NUk;H(u0;z>^-Q{@hwU zErZx44f-fobjH0l>o$8~Hr&>O7q8GA%<0ame7ebwX_@gYEow zcQsrRNv;8~K4}5@c>YI0S*ICay4u)=?nLuJAGJ*C zH5<~!{s#7cF`A!Aacjwe{Hy*TUMQ(#M?~)uAQ-u;yLo(oT1cFA2;mbs>xIZVx_!kI z$!1udx>M=^a5ju%^Hr%TvVJ+9e}e&MPNy8xWw6S!9OW>&a3P<1yS3O!G!HrI0Nk&D zn}W)3kaTW`2eb}`D&81WW0V8;460X@Etn+I4>Mm6QS0SyD_LcRPT;yi)rTjJP|4=P zP<1N-U$#oMfZH(~QU>^7P+u?UH`ZX^RF|Bj>G8x}M!7JwR*K;Z$FUv3c2H|tY{nvK}xQytg6Yv&rDdZve%ON)=jw9^kV3bS#(Mp_?r*`TRQNaNQ`H5J_Uo zF}!J-mE`a=)%Hdi$e&yXfnD62Efwl>;`|CVhHG?o8dm+h97=Vq!Q zgopyOW$;g`)FwfY!~dv)PqpQQsW@X_GYE&h`O{grJmAXn*V$si$SY|e*UnK=CAsC- znK`ON!|e=;v4u*UCxa{Jt1NTkMm3ruWogYCUC7ARv1ZCbMOrzIDPN*4DZXd1_Hf+> z6c~$^si$l_+MxQHVJlRUvS8kdWN((NQgb3->#uN= zM1HWAVLrNBJt~%wg2IaW*gYaDDuvz*(W1d?Jv6#uBh;|99?9a%->NZyitz6;QU0i^0aH<`Cs#hD63m62pol18t0a5p zOTQEKT5MRhAACX#2zB=}OP-Q0@=`xD>S<9{gzc2wc8fg2EQt%xh@>rScQr>EL=4Ne zRn(5>)%+D9)Q^JSF-);+vY>kebYOr&KzB-4qE%7Bal;P29Wwr20;PWl@Hi z9ue2HLcRUApcECQB`~Me(YWR;AeZybWtw#->0P8L*yftED%+fSPjc47BT<=&?%f^x zPeW4@hT2c^2N2&H-hlQ2Yx4|u|J5H05#+!Olk=&nP;DT8g=`x_N4#hf^ZDgC?J9R&wRb=;E^NSC8XsfvPoY$H8J z`+W|7LV6h$n{uUR+gGT3FS@LZ4D*I)J&qe@xs^jM$H!=?b&xNv;tzkR2XRwJ-PxRu z(Km|)?!H%V=e;Z87x`aNoaqs(0~UK3WkdZz{LC=zONrYYG@!grTdVy%6S=dYGNG8Xt+$QccZcKp|tRGl{1*td- zIQ4X|`@IasD@;O~?yn@AU%FO%%(dzIXiEgen^<=;haS-J#FISOZ_C~0BIshj2d1&5 z9NTeWmWv%kRJwl{s#V12;_vn%cgjz;vg@!g7FQ>c+5TE~oaugNafWp=WFAN7N3 zK%NNruCWB(nh^klqIYowvmv1U2sZ{5-3uxTPxJ!m0{<6>f(;9cdBb2R>z?-fN5eo6 z??e0La=0#c1B+ccG8|_BiUJ-v!ZmIozc@mVX-N((P?Zi3bz=;hu?s(vMFpbyG2Kex=#_5NM zy%VvcHLQdu>i2CZDB$|5K?=5ts4J}uL#u~-%UmWh%vDw5d5b2&MIujvmcqG*Ntmp| zk$8@73hyXK8T8>4y-7(Dv01ctIi9_n$5pQwInFd+r$K_%?8l%);*0Yj zhvOndo{o&C<1UWBL4WGX-Su@xTH*v-B%9&~#ZSQK!v*uP?GFwtnti ztleybe@D>$`L)IRdKdw9g2U67fJBJ#O}`hPnM55;;}YOn+}wWU8^2U1M)I)7tX-z} zkt&L$U?F8zuF%=`VYl=qJ=C09sUMIBKL(ClN6Lj6=G4u)LUQTf*6GFOku`d%Mr6hy zMN91~AI4_<9Bc%B;B)e!s}tWfMs=`}+YGo}`-F^ro-y20N`C`CwN=+;4<~DXyn=>q zf==ysfd?1?45j}}-9sXHN51Ml1TDM-#w*Up6TxKPrT?j7{670Zx3;^=7sw==1zYsf z@>&M@QeHa+n!fYbS}C|HGQv^qB2>&}*59u)B)sDv8$1#XrwSH&ZqpN#DsoKqcKvIJ z{loOKwqE~CWU^T;`4N3u^jH3r9!w_tF)g1@_!>zU^B&i8TXV4N_Qn7Qvg delta 7827 zcmZ`;34D~*wf~)alaL8pSQ26a%!Cj&lQ1)x%pwRxb`eQXK|z)fc9F0Ii_&P&iW^H{ zUN|TeL#YK9AThud6+w}rsF0v-6_H}CwN;i-UTa@n=>OcAEco90{rD!|J>R)!-|l7g z*X>^ZTf6FZsX7n})OJXH{^=M`R)Qn^R&8c0SHPVo?-y(PwsHmi0eSDfw|5tpCy3Wz zUNFlQ%*&G>AAW+hckW$7aiLI_D-;S}*f%H^pF(+I_x^%-k2^QZg`e=M{cF-a@@jwF z^5zCDuRqHrPY|1fp|H>NogToeJRZ>Y2qhrnNpOU`c##Jr?1O!w7Ee&<_^p6=!A@`V z2||YECw$Oc*DC-Bo&ade0~fTuQeU=gJNB`9cK z`~U&}LiP#2`Rd>ffQ6z@5Ecn~!W~}w_l-VLKrCm?CqDsf`F|eR6k0St;Zd(oq`cay z*B^~j(7yMPk|b!DEe6RJ8M1TbEf5O7c%+ho;rzEZj}xzpZ9P7GmzQjTczhy)I4v6? z0~kD!?eRcN`&saE!8sSG*&g}v3LlA+?4wga`KhCyE3jGk+s$zxlpV+ow?Fn&0w{T~ zD?1bj|N7X-s!3EXYD(w_*47hJ6`G{ahUBD z%2r>mC?sNCc{d{wB=Zmi+14G|A#ZK3<5N_Y=p@{1$mUtL5JOT#Alc#?XfAXDdEq_p z-*VqLnpO$P=#qV3akvF!n$dm&b2S?hCg)QPc+1v+>317k=PGH*$wJ zoydt33kUq+_fOoK3_DxfM})K#vV(!J`=pa{!v!b1kw3ifWSfR>^Q-2o)!gK125+jZka@HOG@W=Iiz=}@w23p@!nQ-Q~ zQ&W>I8T(`7L6Rps5C|VRmD$PaCsq>M3Kyi%cc(HSsq@2h$_wXz_$7J5y+4`@f)yY2 ziIc5CU+o(oeZ7FEc2^G0nMLjRa6Wzxd_ry5Lwb=^&@n$Nvx$V z#Qz?8?Rw#G8cBY>TB1|TiQ%+gQP6xhmL6B!b_|V(^CmbPD-!tZaGGfjj-eYBdFAs7 zg*~6gP%@t@pb6w=Pdw%F{6f$Qu;(_a;o|W$0wB6w4dTC!r%{4)8-2@{tFdXw5}nTH z#!~{%yWOJMEvFnbOaki+*Ijg;m>y7FWLGgH!G@tc@oxG%`8aKodWJVlwNhCLhfSjq(g)0%Y4kKH zcTfcH!HZIK8=g=EygYukh>-`jGPA;d>#D!}hYw!VTLlorCvnkC?UqSII z)+5oud&;Pn3763v6>GzV3s+JfKKL+Q&sF8Xy|VJBJmh-yP^)3HiWd|unZ-r>=}yPcl7&l4Zvhh5 zzeAn4Za;P8ssSpV6Ca119waZ`55lu?G|!@+5WCOdVA+ zmxok>S+a(bl?sN;lk2FxhK$c_peYK38e_0+BnEm{f>^FuTuI>=F3M^VpAH`O42@L2 zkn!|Z6NtaqYz2V}lK5~DvaoQAb?)M0u>657Xj3e|Nl*j%)}G6EfMsqll6BwjKs23;q3E~yJFPg8Z-3c| zZ}<{|-7579E68w$#c%e;Ju)?3a_E}shD zFMAWJ&G=F|d7J~%9Inw0;_u#qpkH|5pTqZ|GCs9HWtg*D$VI$-p}LtH-lock_lHc@ z3Ff(@^qzz}d~>0NSJoW^^XZ>Ztf@XhorvFkmo`VR(s}uNa7^MY@ZF)~#Lb(`viImh z#4wVkO;I~#k-m;UD%H#Qlg+SZn-erL$rH3i)!}d~Exp%9v+IT%Ip;G<;UTk;G$0?( z4SsU*lpNUa*Po&4y}b**mze1p&4(35OG|TZEtxrMMOl`sbjh+=S+0fi7G$|BNnUw` z-r4w}YR~6esTR>+`pRV80 zY@Y7Z4t5RK9k_Znwb>}4xB3QtEY!yprSe|=Y|hq{Fi1^Vl#H- zDLUO$h`6Dimh++WsQrl_(LXqUi%K(K_KH-ZZ8H=~+3#tj&I<+j^2Zb~Wq+V0gxItR zSv^`^#}!%dOwUhfyzHoNkDnJ#qa}E`u08zL>r;eev8t?lSq}xNw^uXbS#Cd*ZCEq-M3_jH@6KjHw=2zN4oIC?&cazkSG)`-) zlFXWRYN`lfowFzr^)e+<4QU!Ke%3)fX^p|&j#gjmGBnRN=EaU`fZ$n2Bcfy3oup#9 zO=tCp@(0ZN&T5_Fns_~s>o!oQjSfAA8?gp))&06JOVAhu&6$<~@8^lBkkpP+(TU_l zDimw(BGnVIZBUx>p!$maon~D(^$79h0jjqNIn@$drTsiTr23kKbhS11+9@oazv=~D z+|t3Gh3*DjbSv?n*25;YO-Xs@Iax^5-ThQ$7H|IPQLiI0L#D*9mMZS;S0f3dkY628654q2 z8>q8hS~WE8Zm{bOAz>RQ?AzB$$2*3oWHV}zdXTt-GcpUN@xKN`TOW4`>ARctGeDi7 z`0t-JDt)Ps>MWx~xmcuTn3@NJ%Iu1Kn+aQ0j!+w=N!gSu7^OxkPf#jWk|1>DSknx5E&*oZdzKk`Y8sGyD$qJ}Ga&f($_O6>N%W`HP?C){T=Tdm^!p zsUntL`4nSbn5=qYzQMG}&U{p9tj{8er$H8Xq`29k@}}vMDVR4fhe@~OUlyq+nnwII zo;btG1=HRm!ZcfTa51ck+2nn`Z6@AqU2D$w(|{>o(2jgO_%8^fA+uCSBl#@ItedOu zw9}W9*Udv}WZxr+oof~@Q281&zo{uvmlc;kq%!$~1t{GQu9bJrCOQmACs2+(M2MsF4K<;nKzP26KDk2rA?TJY*^2mx3*le<@`R{MVyVPeGx zu|#%O!S-ji3)ma6w1{MCo>Plta{HpyngixMPM5(%s zD#q-7Q?*uhbZ5Ki>=CuMQ3=MPm3iYRAkCWaqIUt@dJK{IQ+4nK-Py){vyKJtiH;KY zCi4UFa%0F(rPiiAU;mEyR2?$g%Q)$Jcx-*de@_0#hpHD>tcB0kw$-gUun2xgT&nIc zI0ep^n6m*0tfXlAS{3{MUd-T$5KI2p)+3vgWgm-hR*s3M(VY-GHY#u=NHBS4&{=SK z0g^7$@vLB?UUg;n8Pto*e^jqVBl-B}z>_nN(>(Wuv^cawr&;->ni7%0{P2}pU~!}4 z%`<*&4{k8#Y!$>v`D|8`nLcY0LArDA~B40NB(0j zE+JeSR1BYO4mr1$)w4L*HNea4*eVH*49H~JLrDIm)hu& zk)$dwhJ_}#)qk)h4Ji>_R}g=d2qc?aa-uWXxfm9bLqnude%(orZqYhscE%Fu9zNSy zOSgsRJ$z>ppfD?rg)-hAO~NNz0n*H_Vfs_zm=qv1c1L^Wzk}T7w<)?eM*il$p2p5p zsAw;m?D4)GuTIsYB!cWcQyRym2`5QwXPJ&QOVe~WC1u@4a7{Oj^QQGn8n;h}&Rd;& zg5==my|jzlZPD56?x(-t%pO_}Gy*kidcf*1I~IQ8v`qODT|C{ZaZ%QcQQ5Z<2=q?Z zH!e^$E3(8QvKNbXIgndMJaaWerxCC2kM#|!@B?r4;>2_v%LREl+myQXuTd20kt5B( z*B?-EYS)r3ArcPmZW>~&cTs*8w55zhiJKPgqFtjGf}o(S&!5sl-nMQJpA*K z@U+y2h^H@&(VK9GGaAICQnUpAVhn&bgeB+LRik|a1b9$#?%;+OM8CZC(AuQRhA*Iwd%x8sWq!h*+jQe}m5 z@b_hEET7w<>-f6~xalpKpl`SBLE@4HYag(P)m@^L-0t9l;$Xc|>OYw=+fZ zX#I;d(`IQL1H3kU8WVo>Tu`RA=C}ImGWR z*Ebr^efnwK0vIfCl(QLPjhAFREA$jelXXAWZ_Cvk{x0OQBjn)S3skBYxGRHJtchEx z=g3VSN^_v;{;m+AKVTK~L}p*d-?heI@$fIS`+uF variable_class_name dereferencable_scalar constant dereferencable %type callable_expr callable_variable static_member new_variable %type encaps_var encaps_var_offset echo_expr_list -%type if_stmt +%type if_stmt const_list %type alt_if_stmt %type if_stmt_without_else %type class_const_decl @@ -276,7 +276,7 @@ import ( %type encaps_list backticks_expr namespace_name catch_name_list catch_list class_const_list -%type const_list for_exprs non_empty_for_exprs +%type for_exprs non_empty_for_exprs %type unprefixed_use_declarations inline_use_declarations property_list %type case_list trait_adaptation_list %type use_declarations lexical_var_list isset_variables non_empty_array_pair_list @@ -541,9 +541,10 @@ top_statement: Node: ast.Node{ Position: position.NewTokensPosition($1, $3), }, - ConstTkn: $1, - Consts: $2, - SemiColonTkn: $3, + ConstTkn: $1, + Consts: $2.(*ast.ParserSeparatedList).Items, + SeparatorTkns: $2.(*ast.ParserSeparatedList).SeparatorTkns, + SemiColonTkn: $3, } } ; @@ -782,13 +783,16 @@ use_declaration: const_list: const_list ',' const_decl { - lastNode($1).(*ast.StmtConstant).CommaTkn = $2 + $1.(*ast.ParserSeparatedList).SeparatorTkns = append($1.(*ast.ParserSeparatedList).SeparatorTkns, $2) + $1.(*ast.ParserSeparatedList).Items = append($1.(*ast.ParserSeparatedList).Items, $3) - $$ = append($1, $3) + $$ = $1 } | const_decl { - $$ = []ast.Vertex{$1} + $$ = &ast.ParserSeparatedList{ + Items: []ast.Vertex{$1}, + } } ; @@ -1036,16 +1040,14 @@ statement: } | T_DECLARE '(' const_list ')' declare_statement { + $5.(*ast.StmtDeclare).DeclareTkn = $1 + $5.(*ast.StmtDeclare).OpenParenthesisTkn = $2 + $5.(*ast.StmtDeclare).Consts = $3.(*ast.ParserSeparatedList).Items + $5.(*ast.StmtDeclare).SeparatorTkns = $3.(*ast.ParserSeparatedList).SeparatorTkns + $5.(*ast.StmtDeclare).CloseParenthesisTkn = $4 + $5.(*ast.StmtDeclare).Node.Position = position.NewTokenNodePosition($1, $5) + $$ = $5 - $$.(*ast.StmtDeclare).Consts = $3 - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $5) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Declare, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.ConstList, $4.SkippedTokens) } | ';' { @@ -1509,29 +1511,30 @@ foreach_statement: declare_statement: statement { - $$ = &ast.StmtDeclare{ast.Node{}, false, nil, $1} - - // save position - $$.GetNode().Position = position.NewNodePosition($1) + $$ = &ast.StmtDeclare{ + Node: ast.Node{ + Position: position.NewNodePosition($1), + }, + Stmt: $1, + } } | ':' inner_statement_list T_ENDDECLARE ';' { - stmtList := &ast.StmtStmtList{ + $$ = &ast.StmtDeclare{ 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, + }, + EndDeclareTkn: $3, + SemiColonTkn: $4, } - $$ = &ast.StmtDeclare{ast.Node{}, true, 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/pkg/ast/ast.go b/pkg/ast/ast.go index aa2170a..7e02236 100644 --- a/pkg/ast/ast.go +++ b/pkg/ast/ast.go @@ -189,7 +189,6 @@ type NodeVisitor interface { NameRelative(n *NameRelative) NameNamePart(n *NameNamePart) - ParserAs(n *ParserAs) - ParserNsSeparator(n *ParserNsSeparator) ParserBrackets(n *ParserBrackets) + ParserSeparatedList(n *ParserSeparatedList) } diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 516019f..845c124 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -278,9 +278,10 @@ func (n *StmtClassMethod) Accept(v NodeVisitor) { // StmtConstList node type StmtConstList struct { Node - ConstTkn *token.Token - Consts []Vertex - SemiColonTkn *token.Token + ConstTkn *token.Token + Consts []Vertex + SeparatorTkns []*token.Token + SemiColonTkn *token.Token } func (n *StmtConstList) Accept(v NodeVisitor) { @@ -315,9 +316,16 @@ func (n *StmtContinue) Accept(v NodeVisitor) { // StmtDeclare node type StmtDeclare struct { Node - Alt bool - Consts []Vertex - Stmt Vertex + Alt bool + DeclareTkn *token.Token + OpenParenthesisTkn *token.Token + Consts []Vertex + SeparatorTkns []*token.Token + CloseParenthesisTkn *token.Token + ColonTkn *token.Token + Stmt Vertex + EndDeclareTkn *token.Token + SemiColonTkn *token.Token } func (n *StmtDeclare) Accept(v NodeVisitor) { @@ -1887,24 +1895,6 @@ func (n *NameNamePart) Accept(v NodeVisitor) { v.NameNamePart(n) } -type ParserAs struct { - Node - Child Vertex -} - -func (n *ParserAs) Accept(v NodeVisitor) { - v.ParserAs(n) -} - -type ParserNsSeparator struct { - Node - Child Vertex -} - -func (n *ParserNsSeparator) Accept(v NodeVisitor) { - v.ParserNsSeparator(n) -} - type ParserBrackets struct { Node OpenBracketTkn *token.Token @@ -1915,3 +1905,13 @@ type ParserBrackets struct { func (n *ParserBrackets) Accept(v NodeVisitor) { v.ParserBrackets(n) } + +type ParserSeparatedList struct { + Node + Items []Vertex + SeparatorTkns []*token.Token +} + +func (n *ParserSeparatedList) Accept(v NodeVisitor) { + v.ParserSeparatedList(n) +} diff --git a/pkg/ast/traverser/dfs.go b/pkg/ast/traverser/dfs.go index 615c682..b9189a0 100644 --- a/pkg/ast/traverser/dfs.go +++ b/pkg/ast/traverser/dfs.go @@ -2607,30 +2607,6 @@ func (t *DFS) Traverse(n ast.Vertex) { if !t.visitor.EnterNode(nn) { return } - case *ast.ParserAs: - if nn == nil { - return - } - if !t.visitor.EnterNode(nn) { - return - } - if nn.Child != nil { - t.visitor.Enter("Child", true) - t.Traverse(nn.Child) - t.visitor.Leave("Child", true) - } - case *ast.ParserNsSeparator: - if nn == nil { - return - } - if !t.visitor.EnterNode(nn) { - return - } - if nn.Child != nil { - t.visitor.Enter("Child", true) - t.Traverse(nn.Child) - t.visitor.Leave("Child", true) - } case *ast.ParserBrackets: if nn == nil { return diff --git a/pkg/ast/visitor/dump.go b/pkg/ast/visitor/dump.go index de06927..d8160c1 100644 --- a/pkg/ast/visitor/dump.go +++ b/pkg/ast/visitor/dump.go @@ -1293,20 +1293,12 @@ func (v *Dump) NameNamePart(n *ast.NameNamePart) { v.print(fmt.Sprintf("Value: []byte(%q),\n", n.Value)) } -func (v *Dump) ParserAs(n *ast.ParserAs) { - v.printIndentIfNotSingle(v.indent - 1) - v.print("&ast.ParserAs{\n") - v.printNode(n.GetNode()) -} - -func (v *Dump) ParserNsSeparator(n *ast.ParserNsSeparator) { - v.printIndentIfNotSingle(v.indent - 1) - v.print("&ast.ParserNsSeparator{\n") - v.printNode(n.GetNode()) -} - func (v *Dump) ParserBrackets(n *ast.ParserBrackets) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.ParserBrackets{\n") v.printNode(n.GetNode()) } + +func (v *Dump) ParserSeparatedList(n *ast.ParserSeparatedList) { + // do nothing +} diff --git a/pkg/ast/visitor/filter_tokens.go b/pkg/ast/visitor/filter_tokens.go index 6c86b92..63fc40e 100644 --- a/pkg/ast/visitor/filter_tokens.go +++ b/pkg/ast/visitor/filter_tokens.go @@ -70,6 +70,7 @@ func (v *FilterTokens) StmtHaltCompiler(n *ast.StmtHaltCompiler) { func (v *FilterTokens) StmtConstList(n *ast.StmtConstList) { n.ConstTkn = nil + n.SeparatorTkns = nil n.SemiColonTkn = nil } @@ -224,3 +225,13 @@ func (v *FilterTokens) StmtForeach(n *ast.StmtForeach) { n.EndForeachTkn = nil n.SemiColonTkn = nil } + +func (v *FilterTokens) StmtDeclare(n *ast.StmtDeclare) { + n.DeclareTkn = nil + n.OpenParenthesisTkn = nil + n.SeparatorTkns = nil + n.CloseParenthesisTkn = nil + n.ColonTkn = nil + n.EndDeclareTkn = nil + n.SemiColonTkn = nil +} diff --git a/pkg/ast/visitor/null.go b/pkg/ast/visitor/null.go index 582033e..f5e1467 100644 --- a/pkg/ast/visitor/null.go +++ b/pkg/ast/visitor/null.go @@ -674,14 +674,10 @@ func (v *Null) NameNamePart(_ *ast.NameNamePart) { // do nothing } -func (v *Null) ParserAs(_ *ast.ParserAs) { - // do nothing -} - -func (v *Null) ParserNsSeparator(_ *ast.ParserNsSeparator) { - // do nothing -} - func (v *Null) ParserBrackets(_ *ast.ParserBrackets) { // do nothing } + +func (v *Null) ParserSeparatedList(_ *ast.ParserSeparatedList) { + // do nothing +} diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index b808de1..9195d83 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -484,10 +484,6 @@ func (p *Printer) printNode(n ast.Vertex) { p.printStmtUseDeclaration(n) case *ast.StmtWhile: p.printStmtWhile(n) - case *ast.ParserAs: - p.printParserAs(n) - case *ast.ParserNsSeparator: - p.printParserNsSeparator(n) case *ast.ParserBrackets: p.printParserBrackets(n) } @@ -2158,7 +2154,7 @@ func (p *Printer) printStmtClassConstList(n *ast.StmtClassConstList) { func (p *Printer) printStmtConstList(n *ast.StmtConstList) { p.printToken(n.ConstTkn, "const") p.bufStart = " " - p.joinPrintRefactored(",", n.Consts) + p.printSeparatedList(n.Consts, n.SeparatorTkns, ",") p.printToken(n.SemiColonTkn, ";") } @@ -2180,37 +2176,33 @@ func (p *Printer) printStmtContinue(n *ast.StmtContinue) { p.printToken(n.SemiColonTkn, ";") } -func (p *Printer) printStmtDeclare(n ast.Vertex) { - nn := n.(*ast.StmtDeclare) - p.printFreeFloating(nn, token.Start) +func (p *Printer) printStmtDeclare(n *ast.StmtDeclare) { + if n.Alt { + p.printStmtAltDeclare(n) + return + } + p.printToken(n.DeclareTkn, "declare") + p.printToken(n.OpenParenthesisTkn, "(") + p.printSeparatedList(n.Consts, n.SeparatorTkns, ",") + p.printToken(n.CloseParenthesisTkn, ")") + p.Print(n.Stmt) +} - p.write([]byte("declare")) - p.printFreeFloating(nn, token.Declare) - p.write([]byte("(")) - p.joinPrintRefactored(",", nn.Consts) - p.printFreeFloating(nn, token.ConstList) - p.write([]byte(")")) +func (p *Printer) printStmtAltDeclare(n *ast.StmtDeclare) { + p.printToken(n.DeclareTkn, "declare") + p.printToken(n.OpenParenthesisTkn, "(") + p.printSeparatedList(n.Consts, n.SeparatorTkns, ",") + p.printToken(n.CloseParenthesisTkn, ")") + p.printToken(n.ColonTkn, ":") - if nn.Alt { - p.printFreeFloating(nn, token.Cond) - p.write([]byte(":")) - - s := nn.Stmt.(*ast.StmtStmtList) - p.printNodes(s.Stmts) - p.printFreeFloating(nn, token.Stmts) - - p.write([]byte("enddeclare")) - p.printFreeFloating(nn, token.AltEnd) - - p.printFreeFloating(nn, token.SemiColon) - if nn.GetNode().Tokens.IsEmpty() { - p.write([]byte(";")) - } + if stmtList, ok := n.Stmt.(*ast.StmtStmtList); ok { + p.printNodes(stmtList.Stmts) } else { - p.Print(nn.Stmt) + p.Print(n.Stmt) } - p.printFreeFloating(nn, token.End) + p.printToken(n.EndDeclareTkn, "enddeclare") + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtDefault(n *ast.StmtDefault) { @@ -2960,26 +2952,6 @@ func (p *Printer) printStmtAltWhile(n *ast.StmtWhile) { p.printToken(n.SemiColonTkn, ";") } -func (p *Printer) printParserAs(n ast.Vertex) { - nn := n.(*ast.ParserAs) - p.printFreeFloating(nn, token.Start) - - p.write([]byte("as")) - p.Print(nn.Child) - - p.printFreeFloating(nn, token.End) -} - -func (p *Printer) printParserNsSeparator(n ast.Vertex) { - nn := n.(*ast.ParserNsSeparator) - p.printFreeFloating(nn, token.Start) - - p.write([]byte("\\")) - p.Print(nn.Child) - - p.printFreeFloating(nn, token.End) -} - func (p *Printer) printParserBrackets(n ast.Vertex) { nn := n.(*ast.ParserBrackets) p.printFreeFloating(nn, token.Start)