diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index a60a8fb..6ff6707 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -31770,7 +31770,7 @@ func TestExprClosure_Use(t *testing.T) { EndPos: 36, }, FunctionTkn: &token.Token{ - ID: token.T_FUNCTION, + ID: token.T_FUNCTION, Value: []byte("function"), Position: &position.Position{ StartLine: 1, @@ -31780,7 +31780,7 @@ func TestExprClosure_Use(t *testing.T) { }, FreeFloating: []*token.Token{ { - ID: token.T_OPEN_TAG, + ID: token.T_OPEN_TAG, Value: []byte("= 0; i-- { yyDollar[1].list[i].(*ast.ExprVariable).VarName = yyDollar[2].node @@ -7396,7 +7403,7 @@ yydefault: } case 449: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:4859 + // line internal/php5/php5.y:4866 { yyVAL.node = &ast.ExprStaticPropertyFetch{ Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node), @@ -7407,7 +7414,7 @@ yydefault: } case 450: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:4868 + // line internal/php5/php5.y:4875 { yyVAL.node = &ast.ExprStaticPropertyFetch{ Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node), @@ -7418,13 +7425,13 @@ yydefault: } case 451: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:4880 + // line internal/php5/php5.y:4887 { yyVAL.node = yyDollar[1].node } case 452: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:4887 + // line internal/php5/php5.y:4894 { yyVAL.node = &ast.ExprArrayDimFetch{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[4].token), @@ -7436,7 +7443,7 @@ yydefault: } case 453: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:4897 + // line internal/php5/php5.y:4904 { yyVAL.node = &ast.ExprArrayDimFetch{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[4].token), @@ -7448,31 +7455,31 @@ yydefault: } case 454: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:4910 + // line internal/php5/php5.y:4917 { yyVAL.node = yyDollar[1].node } case 455: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:4914 + // line internal/php5/php5.y:4921 { yyVAL.node = yyDollar[1].node } case 456: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:4918 + // line internal/php5/php5.y:4925 { yyVAL.node = yyDollar[1].node } case 457: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:4926 + // line internal/php5/php5.y:4933 { yyVAL.node = yyDollar[1].node } case 458: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:4930 + // line internal/php5/php5.y:4937 { for i := len(yyDollar[1].list) - 1; i >= 0; i-- { yyDollar[1].list[i].(*ast.ExprVariable).VarName = yyDollar[2].node @@ -7484,13 +7491,13 @@ yydefault: } case 459: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:4940 + // line internal/php5/php5.y:4947 { yyVAL.node = yyDollar[1].node } case 460: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:4947 + // line internal/php5/php5.y:4954 { yyVAL.node = &ast.ExprArrayDimFetch{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[4].token), @@ -7502,7 +7509,7 @@ yydefault: } case 461: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:4957 + // line internal/php5/php5.y:4964 { yyVAL.node = &ast.ExprArrayDimFetch{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[4].token), @@ -7514,13 +7521,13 @@ yydefault: } case 462: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:4967 + // line internal/php5/php5.y:4974 { yyVAL.node = yyDollar[1].node } case 463: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:4975 + // line internal/php5/php5.y:4982 { yyVAL.node = &ast.ExprVariable{ Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), @@ -7533,7 +7540,7 @@ yydefault: } case 464: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:4986 + // line internal/php5/php5.y:4993 { yyVAL.node = &ast.ExprVariable{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -7548,25 +7555,25 @@ yydefault: } case 465: yyDollar = yyS[yypt-0 : yypt+1] - // line internal/php5/php5.y:5002 + // line internal/php5/php5.y:5009 { yyVAL.node = nil } case 466: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5006 + // line internal/php5/php5.y:5013 { yyVAL.node = yyDollar[1].node } case 467: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5014 + // line internal/php5/php5.y:5021 { yyVAL.list = yyDollar[1].list } case 468: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5018 + // line internal/php5/php5.y:5025 { yyVAL.list = []ast.Vertex{ &ast.ExprPropertyFetch{ @@ -7577,7 +7584,7 @@ yydefault: } case 469: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5030 + // line internal/php5/php5.y:5037 { fetch := &ast.ExprArrayDimFetch{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[2].token, yyDollar[4].token), @@ -7591,7 +7598,7 @@ yydefault: } case 470: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5042 + // line internal/php5/php5.y:5049 { fetch := &ast.ExprArrayDimFetch{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[2].token, yyDollar[4].token), @@ -7605,7 +7612,7 @@ yydefault: } case 471: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5054 + // line internal/php5/php5.y:5061 { yyVAL.list = []ast.Vertex{ &ast.ExprPropertyFetch{ @@ -7616,7 +7623,7 @@ yydefault: } case 472: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5066 + // line internal/php5/php5.y:5073 { yyVAL.node = &ast.Identifier{ Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), @@ -7626,7 +7633,7 @@ yydefault: } case 473: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5074 + // line internal/php5/php5.y:5081 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -7637,7 +7644,7 @@ yydefault: } case 474: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5086 + // line internal/php5/php5.y:5093 { yyVAL.list = []ast.Vertex{ &ast.ExprVariable{ @@ -7648,7 +7655,7 @@ yydefault: } case 475: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5095 + // line internal/php5/php5.y:5102 { yyVAL.list = append(yyDollar[1].list, &ast.ExprVariable{ Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[2].token), @@ -7657,7 +7664,7 @@ yydefault: } case 476: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5105 + // line internal/php5/php5.y:5112 { yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token) yyDollar[1].node.(*ast.ParserSeparatedList).Items = append(yyDollar[1].node.(*ast.ParserSeparatedList).Items, yyDollar[3].node) @@ -7666,7 +7673,7 @@ yydefault: } case 477: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5112 + // line internal/php5/php5.y:5119 { yyVAL.node = &ast.ParserSeparatedList{ Items: []ast.Vertex{yyDollar[1].node}, @@ -7674,7 +7681,7 @@ yydefault: } case 478: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5122 + // line internal/php5/php5.y:5129 { yyVAL.node = &ast.ExprArrayItem{ Position: yylex.(*Parser).builder.NewNodePosition(yyDollar[1].node), @@ -7683,7 +7690,7 @@ yydefault: } case 479: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5129 + // line internal/php5/php5.y:5136 { pairList := yyDollar[3].node.(*ast.ParserSeparatedList) fistPair := pairList.Items[0].(*ast.ExprArrayItem) @@ -7706,19 +7713,19 @@ yydefault: } case 480: yyDollar = yyS[yypt-0 : yypt+1] - // line internal/php5/php5.y:5150 + // line internal/php5/php5.y:5157 { yyVAL.node = &ast.ExprArrayItem{} } case 481: yyDollar = yyS[yypt-0 : yypt+1] - // line internal/php5/php5.y:5158 + // line internal/php5/php5.y:5165 { yyVAL.node = &ast.ParserSeparatedList{} } case 482: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5162 + // line internal/php5/php5.y:5169 { if yyDollar[2].token != nil { yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token) @@ -7729,7 +7736,7 @@ yydefault: } case 483: yyDollar = yyS[yypt-5 : yypt+1] - // line internal/php5/php5.y:5174 + // line internal/php5/php5.y:5181 { arrayItem := &ast.ExprArrayItem{ Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[3].node, yyDollar[5].node), @@ -7745,7 +7752,7 @@ yydefault: } case 484: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5188 + // line internal/php5/php5.y:5195 { arrayItem := &ast.ExprArrayItem{ Position: yylex.(*Parser).builder.NewNodePosition(yyDollar[3].node), @@ -7759,7 +7766,7 @@ yydefault: } case 485: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5200 + // line internal/php5/php5.y:5207 { yyVAL.node = &ast.ParserSeparatedList{ Items: []ast.Vertex{ @@ -7774,7 +7781,7 @@ yydefault: } case 486: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5213 + // line internal/php5/php5.y:5220 { yyVAL.node = &ast.ParserSeparatedList{ Items: []ast.Vertex{ @@ -7787,7 +7794,7 @@ yydefault: } case 487: yyDollar = yyS[yypt-6 : yypt+1] - // line internal/php5/php5.y:5224 + // line internal/php5/php5.y:5231 { arrayItem := &ast.ExprArrayItem{ Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[3].node, yyDollar[6].node), @@ -7807,7 +7814,7 @@ yydefault: } case 488: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5242 + // line internal/php5/php5.y:5249 { arrayItem := &ast.ExprArrayItem{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[3].token, yyDollar[4].node), @@ -7825,7 +7832,7 @@ yydefault: } case 489: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5258 + // line internal/php5/php5.y:5265 { yyVAL.node = &ast.ParserSeparatedList{ Items: []ast.Vertex{ @@ -7844,7 +7851,7 @@ yydefault: } case 490: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5275 + // line internal/php5/php5.y:5282 { yyVAL.node = &ast.ParserSeparatedList{ Items: []ast.Vertex{ @@ -7861,13 +7868,13 @@ yydefault: } case 491: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5293 + // line internal/php5/php5.y:5300 { yyVAL.list = append(yyDollar[1].list, yyDollar[2].node) } case 492: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5297 + // line internal/php5/php5.y:5304 { yyVAL.list = append( yyDollar[1].list, @@ -7880,13 +7887,13 @@ yydefault: } case 493: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5308 + // line internal/php5/php5.y:5315 { yyVAL.list = []ast.Vertex{yyDollar[1].node} } case 494: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5312 + // line internal/php5/php5.y:5319 { yyVAL.list = []ast.Vertex{ &ast.ScalarEncapsedStringPart{ @@ -7899,7 +7906,7 @@ yydefault: } case 495: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5326 + // line internal/php5/php5.y:5333 { yyVAL.node = &ast.ExprVariable{ Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), @@ -7912,7 +7919,7 @@ yydefault: } case 496: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5337 + // line internal/php5/php5.y:5344 { yyVAL.node = &ast.ExprArrayDimFetch{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -7931,7 +7938,7 @@ yydefault: } case 497: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5354 + // line internal/php5/php5.y:5361 { yyVAL.node = &ast.ExprPropertyFetch{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -7953,7 +7960,7 @@ yydefault: } case 498: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5374 + // line internal/php5/php5.y:5381 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -7967,7 +7974,7 @@ yydefault: } case 499: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5386 + // line internal/php5/php5.y:5393 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -7985,7 +7992,7 @@ yydefault: } case 500: yyDollar = yyS[yypt-6 : yypt+1] - // line internal/php5/php5.y:5402 + // line internal/php5/php5.y:5409 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[6].token), @@ -8009,7 +8016,7 @@ yydefault: } case 501: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5424 + // line internal/php5/php5.y:5431 { yyVAL.node = &ast.ParserBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), @@ -8020,7 +8027,7 @@ yydefault: } case 502: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5436 + // line internal/php5/php5.y:5443 { yyVAL.node = &ast.ScalarString{ Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), @@ -8030,7 +8037,7 @@ yydefault: } case 503: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5444 + // line internal/php5/php5.y:5451 { // TODO: add option to handle 64 bit integer if _, err := strconv.Atoi(string(yyDollar[1].token.Value)); err == nil { @@ -8049,7 +8056,7 @@ yydefault: } case 504: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5461 + // line internal/php5/php5.y:5468 { yyVAL.node = &ast.ExprVariable{ Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), @@ -8062,7 +8069,7 @@ yydefault: } case 505: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5475 + // line internal/php5/php5.y:5482 { yyVAL.node = &ast.ExprIsset{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -8075,7 +8082,7 @@ yydefault: } case 506: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5486 + // line internal/php5/php5.y:5493 { yyVAL.node = &ast.ExprEmpty{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -8087,7 +8094,7 @@ yydefault: } case 507: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5496 + // line internal/php5/php5.y:5503 { yyVAL.node = &ast.ExprEmpty{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -8099,7 +8106,7 @@ yydefault: } case 508: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5506 + // line internal/php5/php5.y:5513 { yyVAL.node = &ast.ExprInclude{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -8109,7 +8116,7 @@ yydefault: } case 509: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5514 + // line internal/php5/php5.y:5521 { yyVAL.node = &ast.ExprIncludeOnce{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -8119,7 +8126,7 @@ yydefault: } case 510: yyDollar = yyS[yypt-4 : yypt+1] - // line internal/php5/php5.y:5522 + // line internal/php5/php5.y:5529 { yyVAL.node = &ast.ExprEval{ Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), @@ -8131,7 +8138,7 @@ yydefault: } case 511: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5532 + // line internal/php5/php5.y:5539 { yyVAL.node = &ast.ExprRequire{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -8141,7 +8148,7 @@ yydefault: } case 512: yyDollar = yyS[yypt-2 : yypt+1] - // line internal/php5/php5.y:5540 + // line internal/php5/php5.y:5547 { yyVAL.node = &ast.ExprRequireOnce{ Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), @@ -8151,7 +8158,7 @@ yydefault: } case 513: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5551 + // line internal/php5/php5.y:5558 { yyVAL.node = &ast.ParserSeparatedList{ Items: []ast.Vertex{yyDollar[1].node}, @@ -8159,7 +8166,7 @@ yydefault: } case 514: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5557 + // line internal/php5/php5.y:5564 { yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token) yyDollar[1].node.(*ast.ParserSeparatedList).Items = append(yyDollar[1].node.(*ast.ParserSeparatedList).Items, yyDollar[3].node) @@ -8168,19 +8175,19 @@ yydefault: } case 515: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5567 + // line internal/php5/php5.y:5574 { yyVAL.node = yyDollar[1].node } case 516: yyDollar = yyS[yypt-1 : yypt+1] - // line internal/php5/php5.y:5571 + // line internal/php5/php5.y:5578 { yyVAL.node = yyDollar[1].node } case 517: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5578 + // line internal/php5/php5.y:5585 { yyVAL.node = &ast.ExprClassConstFetch{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token), @@ -8195,7 +8202,7 @@ yydefault: } case 518: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5591 + // line internal/php5/php5.y:5598 { yyVAL.node = &ast.ExprClassConstFetch{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token), @@ -8210,7 +8217,7 @@ yydefault: } case 519: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5607 + // line internal/php5/php5.y:5614 { yyVAL.node = &ast.ExprClassConstFetch{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token), @@ -8225,7 +8232,7 @@ yydefault: } case 520: yyDollar = yyS[yypt-3 : yypt+1] - // line internal/php5/php5.y:5623 + // line internal/php5/php5.y:5630 { yyVAL.node = &ast.ExprClassConstFetch{ Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token), diff --git a/internal/php5/php5.y b/internal/php5/php5.y index 7867d5c..50edcc3 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -3367,36 +3367,38 @@ expr_without_variable: } | function is_reference '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' { - $$ = &ast.ExprClosure{ - Position: yylex.(*Parser).builder.NewTokensPosition($1, $9), - FunctionTkn: $1, - AmpersandTkn: $2, - OpenParenthesisTkn: $3, - Params: $4.(*ast.ParserSeparatedList).Items, - SeparatorTkns: $4.(*ast.ParserSeparatedList).SeparatorTkns, - CloseParenthesisTkn: $5, - ClosureUse: $6, - OpenCurlyBracketTkn: $7, - Stmts: $8, - CloseCurlyBracketTkn: $9, - } + closure := $6.(*ast.ExprClosure) + + closure.Position = yylex.(*Parser).builder.NewTokensPosition($1, $9) + closure.FunctionTkn = $1 + closure.AmpersandTkn = $2 + closure.OpenParenthesisTkn = $3 + closure.Params = $4.(*ast.ParserSeparatedList).Items + closure.SeparatorTkns = $4.(*ast.ParserSeparatedList).SeparatorTkns + closure.CloseParenthesisTkn = $5 + closure.OpenCurlyBracketTkn = $7 + closure.Stmts = $8 + closure.CloseCurlyBracketTkn = $9 + + $$ = closure } | T_STATIC function is_reference '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' { - $$ = &ast.ExprClosure{ - Position: yylex.(*Parser).builder.NewTokensPosition($1, $10), - StaticTkn: $1, - FunctionTkn: $2, - AmpersandTkn: $3, - OpenParenthesisTkn: $4, - Params: $5.(*ast.ParserSeparatedList).Items, - SeparatorTkns: $5.(*ast.ParserSeparatedList).SeparatorTkns, - CloseParenthesisTkn: $6, - ClosureUse: $7, - OpenCurlyBracketTkn: $8, - Stmts: $9, - CloseCurlyBracketTkn: $10, - } + closure := $7.(*ast.ExprClosure) + + closure.Position = yylex.(*Parser).builder.NewTokensPosition($1, $10) + closure.StaticTkn = $1 + closure.FunctionTkn = $2 + closure.AmpersandTkn = $3 + closure.OpenParenthesisTkn = $4 + closure.Params = $5.(*ast.ParserSeparatedList).Items + closure.SeparatorTkns = $5.(*ast.ParserSeparatedList).SeparatorTkns + closure.CloseParenthesisTkn = $6 + closure.OpenCurlyBracketTkn = $8 + closure.Stmts = $9 + closure.CloseCurlyBracketTkn = $10 + + $$ = closure } ; @@ -3520,17 +3522,16 @@ function: lexical_vars: /* empty */ { - $$ = nil + $$ = &ast.ExprClosure{} } | T_USE '(' lexical_var_list ')' { - $$ = &ast.ExprClosureUse{ - Position: yylex.(*Parser).builder.NewTokensPosition($1, $4), - UseTkn: $1, - OpenParenthesisTkn: $2, - Uses: $3.(*ast.ParserSeparatedList).Items, - SeparatorTkns: $3.(*ast.ParserSeparatedList).SeparatorTkns, - CloseParenthesisTkn: $4, + $$ = &ast.ExprClosure{ + UseTkn: $1, + UseOpenParenthesisTkn: $2, + Use: $3.(*ast.ParserSeparatedList).Items, + UseSeparatorTkns: $3.(*ast.ParserSeparatedList).SeparatorTkns, + UseCloseParenthesisTkn: $4, } } ; @@ -3538,12 +3539,15 @@ lexical_vars: lexical_var_list: lexical_var_list ',' T_VARIABLE { - variable := &ast.ExprVariable{ + variable := &ast.ExprClosureUse{ Position: yylex.(*Parser).builder.NewTokenPosition($3), - VarName: &ast.Identifier{ + Var: &ast.ExprVariable{ Position: yylex.(*Parser).builder.NewTokenPosition($3), - IdentifierTkn: $3, - Value: $3.Value, + VarName: &ast.Identifier{ + Position: yylex.(*Parser).builder.NewTokenPosition($3), + IdentifierTkn: $3, + Value: $3.Value, + }, }, } @@ -3554,7 +3558,7 @@ lexical_var_list: } | lexical_var_list ',' '&' T_VARIABLE { - reference := &ast.ExprReference{ + variable := &ast.ExprClosureUse{ Position: yylex.(*Parser).builder.NewTokensPosition($3, $4), AmpersandTkn: $3, Var: &ast.ExprVariable{ @@ -3568,43 +3572,46 @@ lexical_var_list: } $1.(*ast.ParserSeparatedList).SeparatorTkns = append($1.(*ast.ParserSeparatedList).SeparatorTkns, $2) - $1.(*ast.ParserSeparatedList).Items = append($1.(*ast.ParserSeparatedList).Items, reference) + $1.(*ast.ParserSeparatedList).Items = append($1.(*ast.ParserSeparatedList).Items, variable) $$ = $1 } | T_VARIABLE { - $$ = &ast.ParserSeparatedList{ - Items: []ast.Vertex{ - &ast.ExprVariable{ + variable := &ast.ExprClosureUse{ + Position: yylex.(*Parser).builder.NewTokenPosition($1), + Var: &ast.ExprVariable{ + Position: yylex.(*Parser).builder.NewTokenPosition($1), + VarName: &ast.Identifier{ Position: yylex.(*Parser).builder.NewTokenPosition($1), - VarName: &ast.Identifier{ - Position: yylex.(*Parser).builder.NewTokenPosition($1), - IdentifierTkn: $1, - Value: $1.Value, - }, + IdentifierTkn: $1, + Value: $1.Value, }, }, } + + $$ = &ast.ParserSeparatedList{ + Items: []ast.Vertex{ variable }, + } } | '&' T_VARIABLE { - $$ = &ast.ParserSeparatedList{ - Items: []ast.Vertex{ - &ast.ExprReference{ - Position: yylex.(*Parser).builder.NewTokensPosition($1, $2), - AmpersandTkn: $1, - Var: &ast.ExprVariable{ - Position: yylex.(*Parser).builder.NewTokenPosition($2), - VarName: &ast.Identifier{ - Position: yylex.(*Parser).builder.NewTokenPosition($2), - IdentifierTkn: $2, - Value: $2.Value, - }, - }, + variable := &ast.ExprClosureUse{ + Position: yylex.(*Parser).builder.NewTokensPosition($1, $2), + AmpersandTkn: $1, + Var: &ast.ExprVariable{ + Position: yylex.(*Parser).builder.NewTokenPosition($2), + VarName: &ast.Identifier{ + Position: yylex.(*Parser).builder.NewTokenPosition($2), + IdentifierTkn: $2, + Value: $2.Value, }, }, } + + $$ = &ast.ParserSeparatedList{ + Items: []ast.Vertex{ variable }, + } } ; diff --git a/internal/php7/parser_test.go b/internal/php7/parser_test.go index 76706ed..c33bafd 100644 --- a/internal/php7/parser_test.go +++ b/internal/php7/parser_test.go @@ -36268,7 +36268,7 @@ func TestExprClosure_Use(t *testing.T) { EndPos: 36, }, FunctionTkn: &token.Token{ - ID: token.T_FUNCTION, + ID: token.T_FUNCTION, Value: []byte("function"), Position: &position.Position{ StartLine: 1, @@ -36278,7 +36278,7 @@ func TestExprClosure_Use(t *testing.T) { }, FreeFloating: []*token.Token{ { - ID: token.T_OPEN_TAG, + ID: token.T_OPEN_TAG, Value: []byte(" 0 { f.addFreeFloating(token.T_WHITESPACE, []byte(" ")) - n.ClosureUse.Accept(f) + n.UseTkn = f.newToken(token.T_USE, []byte("use")) + n.OpenParenthesisTkn = f.newToken('(', []byte("(")) + n.SeparatorTkns = f.formatList(n.Use, ',') + n.CloseParenthesisTkn = f.newToken(')', []byte(")")) } n.ColonTkn = nil @@ -1189,10 +1196,11 @@ func (f *formatter) ExprClosure(n *ast.ExprClosure) { } func (f *formatter) ExprClosureUse(n *ast.ExprClosureUse) { - n.UseTkn = f.newToken(token.T_USE, []byte("use")) - n.OpenParenthesisTkn = f.newToken('(', []byte("(")) - n.SeparatorTkns = f.formatList(n.Uses, ',') - n.CloseParenthesisTkn = f.newToken(')', []byte(")")) + if n.AmpersandTkn != nil { + n.AmpersandTkn = f.newToken('&', []byte("&")) + } + + n.Var.Accept(f) } func (f *formatter) ExprConstFetch(n *ast.ExprConstFetch) { diff --git a/pkg/ast/visitor/formatter_test.go b/pkg/ast/visitor/formatter_test.go index ee8637b..b917aea 100644 --- a/pkg/ast/visitor/formatter_test.go +++ b/pkg/ast/visitor/formatter_test.go @@ -3714,9 +3714,9 @@ func TestFormatter_ExprClosure_Use(t *testing.T) { o := bytes.NewBufferString("") n := &ast.ExprClosure{ - ClosureUse: &ast.ExprClosureUse{ - Uses: []ast.Vertex{ - &ast.ExprVariable{ + Use: []ast.Vertex{ + &ast.ExprClosureUse{ + Var: &ast.ExprVariable{ VarName: &ast.Identifier{ Value: []byte("$foo"), }, @@ -3748,16 +3748,9 @@ func TestFormatter_ExprClosureUse(t *testing.T) { o := bytes.NewBufferString("") n := &ast.ExprClosureUse{ - Uses: []ast.Vertex{ - &ast.ExprVariable{ - VarName: &ast.Identifier{ - Value: []byte("$a"), - }, - }, - &ast.ExprVariable{ - VarName: &ast.Identifier{ - Value: []byte("$b"), - }, + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{ + Value: []byte("$a"), }, }, } @@ -3768,7 +3761,33 @@ func TestFormatter_ExprClosureUse(t *testing.T) { p := visitor.NewPrinter(o).WithState(visitor.PrinterStatePHP) n.Accept(p) - expected := `use($a, $b)` + expected := `$a` + actual := o.String() + + if expected != actual { + t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) + } +} + +func TestFormatter_ExprClosureUse_Reference(t *testing.T) { + o := bytes.NewBufferString("") + + n := &ast.ExprClosureUse{ + AmpersandTkn: &token.Token{}, + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{ + Value: []byte("$a"), + }, + }, + } + + f := visitor.NewFormatter().WithState(visitor.FormatterStatePHP).WithIndent(1) + n.Accept(f) + + p := visitor.NewPrinter(o).WithState(visitor.PrinterStatePHP) + n.Accept(p) + + expected := `&$a` actual := o.String() if expected != actual { diff --git a/pkg/ast/visitor/namespace_resolver_test.go b/pkg/ast/visitor/namespace_resolver_test.go index f42f11e..8a8bb14 100644 --- a/pkg/ast/visitor/namespace_resolver_test.go +++ b/pkg/ast/visitor/namespace_resolver_test.go @@ -562,7 +562,6 @@ func TestResolveClosureName(t *testing.T) { Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, }, }, - ClosureUse: nil, ReturnType: &ast.Nullable{Expr: nameBC}, Stmts: []ast.Vertex{}, } diff --git a/pkg/ast/visitor/printer.go b/pkg/ast/visitor/printer.go index 255ffe9..8802a43 100644 --- a/pkg/ast/visitor/printer.go +++ b/pkg/ast/visitor/printer.go @@ -684,7 +684,10 @@ func (p *printer) ExprClosure(n *ast.ExprClosure) { p.printToken(n.OpenParenthesisTkn, []byte("(")) p.printSeparatedList(n.Params, n.SeparatorTkns, []byte(",")) p.printToken(n.CloseParenthesisTkn, []byte(")")) - p.printNode(n.ClosureUse) + p.printToken(n.UseTkn, p.ifNodeList(n.Use, []byte("use"))) + p.printToken(n.UseOpenParenthesisTkn, p.ifNodeList(n.Use, []byte("("))) + p.printSeparatedList(n.Use, n.UseSeparatorTkns, []byte(",")) + p.printToken(n.UseCloseParenthesisTkn, p.ifNodeList(n.Use, []byte(")"))) p.printToken(n.ColonTkn, p.ifNode(n.ReturnType, []byte(":"))) p.printNode(n.ReturnType) p.printToken(n.OpenCurlyBracketTkn, []byte("{")) @@ -693,10 +696,8 @@ func (p *printer) ExprClosure(n *ast.ExprClosure) { } func (p *printer) ExprClosureUse(n *ast.ExprClosureUse) { - p.printToken(n.UseTkn, []byte("use")) - p.printToken(n.OpenParenthesisTkn, []byte("(")) - p.printSeparatedList(n.Uses, n.SeparatorTkns, []byte(",")) - p.printToken(n.CloseParenthesisTkn, []byte(")")) + p.printToken(n.AmpersandTkn, nil) + p.printNode(n.Var) } func (p *printer) ExprConstFetch(n *ast.ExprConstFetch) { diff --git a/pkg/ast/visitor/printer_test.go b/pkg/ast/visitor/printer_test.go index d918f0a..571f51e 100644 --- a/pkg/ast/visitor/printer_test.go +++ b/pkg/ast/visitor/printer_test.go @@ -1717,18 +1717,35 @@ func TestPrinterPrintExprClosureUse(t *testing.T) { p := visitor.NewPrinter(o).WithState(visitor.PrinterStatePHP) n := &ast.ExprClosureUse{ - Uses: []ast.Vertex{ - &ast.ExprReference{Var: &ast.ExprVariable{ - VarName: &ast.Identifier{Value: []byte("$foo")}, - }}, - &ast.ExprVariable{ - VarName: &ast.Identifier{Value: []byte("$bar")}, - }, + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("$foo")}, }, } n.Accept(p) - expected := `use(&$foo,$bar)` + expected := `$foo` + actual := o.String() + + if expected != actual { + t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) + } +} + +func TestPrinterPrintExprClosureUse_Reference(t *testing.T) { + o := bytes.NewBufferString("") + + p := visitor.NewPrinter(o).WithState(visitor.PrinterStatePHP) + n := &ast.ExprClosureUse{ + AmpersandTkn: &token.Token{ + Value: []byte("&"), + }, + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("$foo")}, + }, + } + n.Accept(p) + + expected := `&$foo` actual := o.String() if expected != actual { @@ -1754,12 +1771,17 @@ func TestPrinterPrintExprClosure(t *testing.T) { }, }, }, - ClosureUse: &ast.ExprClosureUse{ - Uses: []ast.Vertex{ - &ast.ExprReference{Var: &ast.ExprVariable{ + Use: []ast.Vertex{ + &ast.ExprClosureUse{ + AmpersandTkn: &token.Token{ + Value: []byte("&"), + }, + Var: &ast.ExprVariable{ VarName: &ast.Identifier{Value: []byte("$a")}, - }}, - &ast.ExprVariable{ + }, + }, + &ast.ExprClosureUse{ + Var: &ast.ExprVariable{ VarName: &ast.Identifier{Value: []byte("$b")}, }, },