From ad884c99df00ca08f49513739f12a26bda696aa6 Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Sun, 27 Dec 2020 23:19:49 +0200 Subject: [PATCH] refactoring: update ast structure of "StaticCall" node --- internal/php5/php5.go | Bin 265114 -> 265640 bytes internal/php5/php5.y | 20 ++++++++++++++++++-- internal/php7/php7.go | Bin 219920 -> 220446 bytes internal/php7/php7.y | 20 ++++++++++++++++++-- pkg/ast/node.go | 18 ++++++++++-------- pkg/ast/visitor/dumper.go | 2 ++ pkg/ast/visitor/formatter.go | 11 +++++++++++ pkg/ast/visitor/formatter_test.go | 30 ++++++++++++++++++++++++++++++ pkg/ast/visitor/printer.go | 2 ++ 9 files changed, 91 insertions(+), 12 deletions(-) diff --git a/internal/php5/php5.go b/internal/php5/php5.go index a2bd33cfae51cbd291beebc187308c51052d3e7a..4e5baf8f419e80c834553b73dc282d4902ff0ba6 100644 GIT binary patch delta 3913 zcmcgvYgE-$7GLM=%Tq*HCWu_)qJUP4_XQU+muL!PY0wk%0XJM}J_<*N9L0j^p|x6z zR*h_D8b!uuiV9Yqe4#G0a`J(XG80pD9D52iMwU*_@0>rEYajYL_tXFEv(J9--`@9c z9JB7tn1GM6GpRg!DL8$x$`S%M^bLRTzK3RIVf96cbovQ7+%#l2FCpq}8zlvM9 z`Lc-UHPrF+499}V2>gP~>>ng=;o6;))FVht*JAj{PKt{R64~{h=*=O!XdpKn5n(sq zq~DMa3Kx%9CX-Z~ji9!^$j%2z?&7*g$`@JOS}PLOm>B9Oct8~8f}+K! z!?9E?xOX%t*%oDYPkKu5mpy2-%yM--n7}=f7grRYr0W{dN!J-3m)7H0=#^5 zF}ZkkFDUeK;}sFd&B-vs5l4A2JJv%3RCOHvhoBr@b>6<)hw@~$hi6|Dy|{V0%;I|! zDPLy$*qhcem4FneDQKJK!#hzR>34*q7)fZthE4gqvI6l>yne zLbk`#CFvpQ=@fh841LNuA+{)twyJC*YJ@BsQ3Pfi2h)q!+@ z7Y(4%?6{pSa^paJjk$yV%`La#wtNuyLhr!WiouZ5K7jV}kU@x_hZ_mD?Mb5#dHi4y zOl8<>=7FnVt#oj6n@r=FXQ(Gv%!BGTofN^(4MT)h%%d>ASS%9Mf^>R7h)kVS{qRX0 zFvFh0Jwjy&S39YkV>}eER*TJEK5x?qkDL47ua*h0A0OI|MNkbYI*qwfT=ROqK924jXMySXx2hH>*pBAFfC zVK2C1)WO*_M{xO2XfA9LcHIRbT-G9O9Ccn!QaN|g9|Yo%{Dw^8r(0x*0=Y!6Z#d;~ z^4@@{jX1*T*+tYDzSB9lhnpULcm%F|T@7V~+qa&U;euO7;>v0g(|uf4Eko6~yQzV726XUySA zOXX+$N`c8@7mipKT`iy_c-div)n*ZgJpdxis=9%KG7dlgASDXvap}CK@~eM=yk!sT zO4y9>8dthKLJs|A#6-AK_^2fSDM{rWuYvoi@!+mZyGhL%e)}=gU;*nx`SrKtNxnJ( z)J)6plk4T@oHNOI@>|0>sa_uEs>#MD)1n$1xnv^By>uh4_7~$S+eDUEZIYjGxE~xMUx0W|{&E z^vgSf6Q2rL9&8NLFRKMNmBEP&Q)R)+-|dHw^%)6BQcwQGH(_@&yaw zaHdl|`!S7_eEK=crA(KXpZl16D(5gQ7yNS--W#+BW;_B2Nje5ZshlN4Ip;XJxw)C% z;o9fH>eZU|EY<82e zjCnYLPuEbCI`j&qLtr8#4NYptquXh81^C=L_sehbRH*1!l-o7N*!bL%ly?%aTJ zdAXh<`LQ%Pkhg3AdnRLQc{sfu8Zq+qwqatrwx05oSgCiGqD{uBpzdQJ@b@)0dQMd!a5NBX-IbJhk9G*mA$T4Fy;}0t+0Y6MNUVr!{Y?enM`pWKb79&BfN^D?6E+XK;o z?a1*sYOZK6ost)m_!}j+>8TK{&V5EU9aOBJH-k{a zFk!P~Iab3SYL^4}waZvuici7CmKN-14X?@w{`GSz)%&U0efM}|25&r#X2OzcD2R6$ zUuzMu95qlzs`M606+A*wif&~)zj4MC3-F=8!akd$Hv+v?X~ZwreQgFTYPN!%*Twy6 zPb+P{Y2>Tw3-puJvrvywgJ)%5(idIm7{SXfQ6umF8k@D*D;<|;Dz8|HS{=R(NK&~$ z___F7ie<+a_=6QwhnkN5nv~vTthonqQ@CUY=x6(49Q^kTTs~5aW9?QfF^j*UCdscK z!Ygc^CxTB}e}NoxLe1d;b{#><#rHD?yP zo<+Ul5T=ITpjg36q%EEs4v2@A?6B#7ES)_uR@(IF(g@_@56uA;qVazO+4P?k^FIn} v@mqq&h1hacZJ6zSbZVF_PpyxzH3_bCh)^z#uyyXONoseP4HIu#H=Fx^6bv)9 delta 3550 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 diff --git a/internal/php5/php5.y b/internal/php5/php5.y index ba55690..a9d05ee 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -3688,7 +3688,7 @@ function_call: } | class_name T_PAAMAYIM_NEKUDOTAYIM variable_name function_call_parameter_list { - $$ = &ast.ExprStaticCall{ + staticCall := &ast.ExprStaticCall{ Position: yylex.(*Parser).builder.NewNodesPosition($1, $4), Class: $1, DoubleColonTkn: $2, @@ -3698,6 +3698,14 @@ function_call: SeparatorTkns: $4.(*ast.ArgumentList).SeparatorTkns, CloseParenthesisTkn: $4.(*ast.ArgumentList).CloseParenthesisTkn, } + + if brackets, ok := $3.(*ast.ParserBrackets); ok { + staticCall.OpenCurlyBracketTkn = brackets.OpenBracketTkn + staticCall.Call = brackets.Child + staticCall.CloseCurlyBracketTkn = brackets.CloseBracketTkn + } + + $$ = staticCall } | class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects function_call_parameter_list { @@ -3714,7 +3722,7 @@ function_call: } | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_name function_call_parameter_list { - $$ = &ast.ExprStaticCall{ + staticCall := &ast.ExprStaticCall{ Position: yylex.(*Parser).builder.NewNodesPosition($1, $4), Class: $1, DoubleColonTkn: $2, @@ -3724,6 +3732,14 @@ function_call: SeparatorTkns: $4.(*ast.ArgumentList).SeparatorTkns, CloseParenthesisTkn: $4.(*ast.ArgumentList).CloseParenthesisTkn, } + + if brackets, ok := $3.(*ast.ParserBrackets); ok { + staticCall.OpenCurlyBracketTkn = brackets.OpenBracketTkn + staticCall.Call = brackets.Child + staticCall.CloseCurlyBracketTkn = brackets.CloseBracketTkn + } + + $$ = staticCall } | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects function_call_parameter_list { diff --git a/internal/php7/php7.go b/internal/php7/php7.go index bdd9dc602c500972979286197865b835c79bda2e..72e8ddc19ce3bc761f1a6662688f62ada9d60d6c 100644 GIT binary patch delta 2138 zcmcIlYfzMB6rT4SQ7!_DC`v4_OCTzyy9>**Dgq@7H5jXqLem9@NlnzzH2Yy8YNJzA zh{MD)HjSY)I{nB|OFy+VohGWWDQZI0GDQI+kkp2}aGB2cEjR6VKX&GQ&v!1*dCv2m ztvVXK`$X`;s7P|#wnj&8kB(GYbR-=+Ja*msCF@@D8GQ=FaLAh z`UWacsmQ8UQLrtgQJVWFa*%Ri!ECX3v(-t=`-O5*(Wxfl^owFUrC)DV(!e#Xk#dzA zS^HFk@B86K%0Yb-g~3~`#^6Gk3PJ2SvCTa%HcJMLLscfn;AVze1WO-n!KNlj;lR!* zY9{W;nH)|n>pbNtN_HZvOih5>Nm2Ong1Dt%b0bBdwov)O%jA!wi&QMuuwJs`=tY5M z+DI0hPGCPwyhP7y6~EFeN;=#*jpH@3>{rsTBsH6S1B7?TICepB40mgqZXvM%Bkr(UBl8g$)eijRCQfW zNq@@M&;O9G&vZzZAKT~*TG}Z`Ik6yt%&2XpdW3X{!JywT_-U_oP!OTHTpT`ZrO}Xk zv`$qHR=%%7(cVEOBz94?O4BJH2>PvyQk4v0Ft6WGn8ENU+~}aO&~DOkO10@!Iq=af z@=&TBS&0-;6US!6+!iEu96BxRZM#ipWgzx%$f}ihQ=LLYxAd{>jtu?gdJ529@1_nV zjaXMn$gVpw7biA%Dqp7Yca5He;|SmMEAEPeG$|4>O7-XtE?slJ`>Xeau8KxM)pbuF zV6T+%4cN?m$nOzv5!j&jcRhmKWz%(F$K$;cTG~&OMg-LLkw?;JR;!6dx#)gL;PCm^ z^h<$~shn_R2V2#9@$6B_STdF4<-Sabjt0(Fg*nU~a;9o;G9O?x$8j=V8pAn4yxy6S z`Lgdm)L5}U=aAc>?e*t!qBOftt2$$NDw9IA{2*Sg1WMROiZv_{OCZ+7(n8ekRiTCK|h z7cN%U!`8PZ2;?-k_VWZCvfBpx8efI`D2o(!+&Yf~Xr$16eE*1~5jHyq*F$F%=OQGA z&6?ND^Au{+4Bn&hZM4KYai(F=^Lh;HLJ7+t>w_y`D{?IcODg6Jg?;gy%_%lfMyFbVq6C3;HIcWXVi$#=U^*{E z%rp+bJCnIgqK%DLGF}YkM6MSV7<5A8ipjF`dnZW>+cYkb&h{kmZ2YxbcGbZXDjo4jybF~x*o~^c>1n)uL?$daX6x%! z)=?TPf%4ca{c5sr`sSH3V_{qtVFbK~CE+4F=aPG137V#;G1?b)X_f6Z8F!hAgC&_u z*>1N%_T^oar|=4C%@E0;;6%x;R3SHcsAKEHbxkhzC#g2bK#(@e&Hv~qN9(uL59c6Si)|@)+&JT>ey%Ll7kj4(Aal+W`H*rf#Pchqm0qWkgQ5)|ktAEZP`)O5SZx;St%jq)?$j)#4<_0i2Mfr1#1e$UEZ5v@h;{dEqRe1 p;56QcR=8LKV9k@g+3=joM^ll^$(5{Gi@8ddtL(+;`2AUS{0pxSyV?K% delta 2043 zcma)7eN2^Q6yI}>C>JHJq#fmBvqsa`d*zWDijeab9z8SlLH?^3G{I5qyfw;;m9P3Hlx8 zihwyryeTS34mkN|Ir}YzO4%7)x4WdUN{tnllPvPn8Klh6O9DcsU~!$LIZ}{32nd za9VZ=r!7};T6dW)%6HeuBL}YFbo)9^omcVI+J&!S*C|1Jql-oo@@~yRKWe)uL45hj zBLyWKCOuu?>QWp@mh@Rx{GoS9aI4`p%(-iEJx@HC|6FuJd9Y=J;avg4#w8$raf-(rGDM4ev4u> z2xYoLrD%hJIYv(QBk8n0kYGGCYk=I8WfWx*MEA>{`+m=ZE9)n*M?M?~Jih*8SiTC1 z*FqInDH;9w5QPM3n~0Yw5OS-6YSqOV5J4WA%4uC<_+bQ3Iy+I#xTN&lI3wU+po>1!+5w-_95Rkn)wgV zZgfMRPknrQWk)ztIs9RUBWMiD!Vm|@U!$AX!`Y_m-l)o^WMqT^cytZ&4slDQj?$r> zkJM4-xb)hMEpbm)TewK~RBs1v7IQvCTKOo)>Pjt_Dfg*P=EWhC z0Xo3M2{`1jSdQ^8lWrR>rq@H_M$5_*5I$5Mt#C+QJcnrUKz@e6FK*Cuk8?A?kE3p7Z9#YBj?gTt(Ddz;K zm~1pcwNaw@QnBoAZpJ=p+OP5?Bb6KEg-M(zja?YFwF}TZui_MW^Gj@@MN>GJq$QPI zVhceo+khJH*T6(OI!@V6|E??D3uc~iaIvl*WBZvWs1e!^4$fDc?!uf_sRU_uVgP42 z*#j45PIu`GRKo(z)hjmSQ)>qQNH$$Q4dq{@Ce<-Z7+jKz!gCCW`Fbmp^@OTtd$zox{iOw!ar4{eC!5t2WRO)}ZVnSKJmb-27( zqDDwsId=AveBS1tA!B;~=UX!+tU;Nz$%X7yGOU2>B{mKF5z;gNGrNZD-w^5_1lunW z9;0dyqVIKM*>_V$mbS8(t0*MX5n?jc;AfIO#hk2#&txkDpgyab_X!Lx<=C}jUOq~c z5t!%CX7ehYV}qUPWgM&ziTxNZJpUv|VR4qRP1{k9yW&g1aq3fgNTxAn+Tu9~0h`89 i8Jg{!i(Wgkwf4hU$+Bub6uf#agoVG|2)QwzGyVoLgQ%4N diff --git a/internal/php7/php7.y b/internal/php7/php7.y index 078c6eb..dbb58b7 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -3321,7 +3321,7 @@ function_call: } | class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list { - $$ = &ast.ExprStaticCall{ + staticCall := &ast.ExprStaticCall{ Position: yylex.(*Parser).builder.NewNodesPosition($1, $4), Class: $1, DoubleColonTkn: $2, @@ -3331,10 +3331,18 @@ function_call: SeparatorTkns: $4.(*ast.ArgumentList).SeparatorTkns, CloseParenthesisTkn: $4.(*ast.ArgumentList).CloseParenthesisTkn, } + + if brackets, ok := $3.(*ast.ParserBrackets); ok { + staticCall.OpenCurlyBracketTkn = brackets.OpenBracketTkn + staticCall.Call = brackets.Child + staticCall.CloseCurlyBracketTkn = brackets.CloseBracketTkn + } + + $$ = staticCall } | variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list { - $$ = &ast.ExprStaticCall{ + staticCall := &ast.ExprStaticCall{ Position: yylex.(*Parser).builder.NewNodesPosition($1, $4), Class: $1, DoubleColonTkn: $2, @@ -3344,6 +3352,14 @@ function_call: SeparatorTkns: $4.(*ast.ArgumentList).SeparatorTkns, CloseParenthesisTkn: $4.(*ast.ArgumentList).CloseParenthesisTkn, } + + if brackets, ok := $3.(*ast.ParserBrackets); ok { + staticCall.OpenCurlyBracketTkn = brackets.OpenBracketTkn + staticCall.Call = brackets.Child + staticCall.CloseCurlyBracketTkn = brackets.CloseBracketTkn + } + + $$ = staticCall } | callable_expr argument_list { diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 7a89a90..290a51a 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -1681,14 +1681,16 @@ func (n *ExprShellExec) GetPosition() *position.Position { // ExprStaticCall node type ExprStaticCall struct { - Position *position.Position - Class Vertex - DoubleColonTkn *token.Token - Call Vertex - OpenParenthesisTkn *token.Token - Arguments []Vertex - SeparatorTkns []*token.Token - CloseParenthesisTkn *token.Token + Position *position.Position + Class Vertex + DoubleColonTkn *token.Token + OpenCurlyBracketTkn *token.Token + Call Vertex + CloseCurlyBracketTkn *token.Token + OpenParenthesisTkn *token.Token + Arguments []Vertex + SeparatorTkns []*token.Token + CloseParenthesisTkn *token.Token } func (n *ExprStaticCall) Accept(v NodeVisitor) { diff --git a/pkg/ast/visitor/dumper.go b/pkg/ast/visitor/dumper.go index 11f3159..dde094a 100644 --- a/pkg/ast/visitor/dumper.go +++ b/pkg/ast/visitor/dumper.go @@ -1473,7 +1473,9 @@ func (v *Dumper) ExprStaticCall(n *ast.ExprStaticCall) { v.dumpPosition(n.Position) v.dumpVertex("Class", n.Class) v.dumpToken("DoubleColonTkn", n.DoubleColonTkn) + v.dumpToken("OpenCurlyBracketTkn", n.OpenCurlyBracketTkn) v.dumpVertex("Call", n.Call) + v.dumpToken("CloseCurlyBracketTkn", n.CloseCurlyBracketTkn) v.dumpToken("OpenParenthesisTkn", n.OpenParenthesisTkn) v.dumpVertexList("Arguments", n.Arguments) v.dumpTokenList("SeparatorTkns", n.SeparatorTkns) diff --git a/pkg/ast/visitor/formatter.go b/pkg/ast/visitor/formatter.go index 9dd5d00..c698359 100644 --- a/pkg/ast/visitor/formatter.go +++ b/pkg/ast/visitor/formatter.go @@ -1394,6 +1394,17 @@ func (f *formatter) ExprShellExec(n *ast.ExprShellExec) { func (f *formatter) ExprStaticCall(n *ast.ExprStaticCall) { n.Class.Accept(f) n.DoubleColonTkn = f.newToken(token.T_PAAMAYIM_NEKUDOTAYIM, []byte("::")) + + n.OpenCurlyBracketTkn = nil + n.CloseCurlyBracketTkn = nil + switch n.Call.(type) { + case *ast.Identifier: + case *ast.ExprVariable: + default: + n.OpenCurlyBracketTkn = f.newToken('{', []byte("{")) + n.CloseCurlyBracketTkn = f.newToken('}', []byte("}")) + } + n.Call.Accept(f) n.OpenParenthesisTkn = f.newToken('(', []byte("(")) diff --git a/pkg/ast/visitor/formatter_test.go b/pkg/ast/visitor/formatter_test.go index bc08e81..8180fdb 100644 --- a/pkg/ast/visitor/formatter_test.go +++ b/pkg/ast/visitor/formatter_test.go @@ -4692,6 +4692,36 @@ func TestFormatter_ExprStaticCall(t *testing.T) { } } +func TestFormatter_ExprStaticCall_Expr(t *testing.T) { + o := bytes.NewBufferString("") + + n := &ast.ExprStaticCall{ + Class: &ast.NameName{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Value: []byte("foo"), + }, + }, + }, + Call: &ast.ScalarString{ + Value: []byte("'bar'"), + }, + } + + f := visitor.NewFormatter().WithState(visitor.FormatterStatePHP).WithIndent(1) + n.Accept(f) + + p := visitor.NewPrinter(o).WithState(visitor.PrinterStatePHP) + n.Accept(p) + + expected := `foo::{'bar'}()` + actual := o.String() + + if expected != actual { + t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) + } +} + func TestFormatter_ExprStaticCall_Arguments(t *testing.T) { o := bytes.NewBufferString("") diff --git a/pkg/ast/visitor/printer.go b/pkg/ast/visitor/printer.go index d4ac78a..23b23f1 100644 --- a/pkg/ast/visitor/printer.go +++ b/pkg/ast/visitor/printer.go @@ -840,7 +840,9 @@ func (p *printer) ExprShellExec(n *ast.ExprShellExec) { func (p *printer) ExprStaticCall(n *ast.ExprStaticCall) { p.printNode(n.Class) p.printToken(n.DoubleColonTkn, []byte("::")) + p.printToken(n.OpenCurlyBracketTkn, nil) p.printNode(n.Call) + p.printToken(n.CloseCurlyBracketTkn, nil) p.printToken(n.OpenParenthesisTkn, p.ifNodeList(n.Arguments, []byte("("))) p.printSeparatedList(n.Arguments, n.SeparatorTkns, []byte(",")) p.printToken(n.CloseParenthesisTkn, p.ifNodeList(n.Arguments, []byte(")")))