refactoring: update ast structure of "ArrayItem" node

This commit is contained in:
Vadym Slizov 2020-12-26 20:13:50 +02:00
parent 8bf1fa822d
commit 0f5f5e7dc7
No known key found for this signature in database
GPG Key ID: AEA2A9388EF42A4A
10 changed files with 228 additions and 271 deletions

View File

@ -30786,61 +30786,53 @@ func TestExprArray_Items(t *testing.T) {
StartPos: 15, StartPos: 15,
EndPos: 18, EndPos: 18,
}, },
Val: &ast.ExprReference{ AmpersandTkn: &token.Token{
ID: token.ID(38),
Value: []byte("&"),
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
EndLine: 1, EndLine: 1,
StartPos: 15, StartPos: 15,
EndPos: 18, EndPos: 16,
}, },
AmpersandTkn: &token.Token{ FreeFloating: []*token.Token{
ID: token.ID(38), {
Value: []byte("&"), ID: token.T_WHITESPACE,
Position: &position.Position{ Value: []byte(" "),
StartLine: 1, Position: &position.Position{
EndLine: 1, StartLine: 1,
StartPos: 15, EndLine: 1,
EndPos: 16, StartPos: 14,
}, EndPos: 15,
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 14,
EndPos: 15,
},
}, },
}, },
}, },
Var: &ast.ExprVariable{ },
Val: &ast.ExprVariable{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 16,
EndPos: 18,
},
VarName: &ast.Identifier{
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
EndLine: 1, EndLine: 1,
StartPos: 16, StartPos: 16,
EndPos: 18, EndPos: 18,
}, },
VarName: &ast.Identifier{ IdentifierTkn: &token.Token{
ID: token.T_VARIABLE,
Value: []byte("$b"),
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
EndLine: 1, EndLine: 1,
StartPos: 16, StartPos: 16,
EndPos: 18, EndPos: 18,
}, },
IdentifierTkn: &token.Token{
ID: token.T_VARIABLE,
Value: []byte("$b"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 16,
EndPos: 18,
},
},
Value: []byte("$b"),
}, },
Value: []byte("$b"),
}, },
}, },
}, },
@ -39025,61 +39017,53 @@ func TestExprShortArray_Items(t *testing.T) {
StartPos: 10, StartPos: 10,
EndPos: 13, EndPos: 13,
}, },
Val: &ast.ExprReference{ AmpersandTkn: &token.Token{
ID: token.ID(38),
Value: []byte("&"),
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
EndLine: 1, EndLine: 1,
StartPos: 10, StartPos: 10,
EndPos: 13, EndPos: 11,
}, },
AmpersandTkn: &token.Token{ FreeFloating: []*token.Token{
ID: token.ID(38), {
Value: []byte("&"), ID: token.T_WHITESPACE,
Position: &position.Position{ Value: []byte(" "),
StartLine: 1, Position: &position.Position{
EndLine: 1, StartLine: 1,
StartPos: 10, EndLine: 1,
EndPos: 11, StartPos: 9,
}, EndPos: 10,
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 9,
EndPos: 10,
},
}, },
}, },
}, },
Var: &ast.ExprVariable{ },
Val: &ast.ExprVariable{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 11,
EndPos: 13,
},
VarName: &ast.Identifier{
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
EndLine: 1, EndLine: 1,
StartPos: 11, StartPos: 11,
EndPos: 13, EndPos: 13,
}, },
VarName: &ast.Identifier{ IdentifierTkn: &token.Token{
ID: token.T_VARIABLE,
Value: []byte("$b"),
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
EndLine: 1, EndLine: 1,
StartPos: 11, StartPos: 11,
EndPos: 13, EndPos: 13,
}, },
IdentifierTkn: &token.Token{
ID: token.T_VARIABLE,
Value: []byte("$b"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 11,
EndPos: 13,
},
},
Value: []byte("$b"),
}, },
Value: []byte("$b"),
}, },
}, },
}, },

100
internal/php5/php5.go generated
View File

@ -340,7 +340,7 @@ const yyEofCode = 1
const yyErrCode = 2 const yyErrCode = 2
const yyInitialStackSize = 16 const yyInitialStackSize = 16
// line internal/php5/php5.y:5669 // line internal/php5/php5.y:5657
// line yacctab:1 // line yacctab:1
var yyExca = [...]int{ var yyExca = [...]int{
@ -7825,11 +7825,8 @@ yydefault:
Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[3].node, yyDollar[6].node), Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[3].node, yyDollar[6].node),
Key: yyDollar[3].node, Key: yyDollar[3].node,
DoubleArrowTkn: yyDollar[4].token, DoubleArrowTkn: yyDollar[4].token,
Val: &ast.ExprReference{ AmpersandTkn: yyDollar[5].token,
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[5].token, yyDollar[6].node), Val: yyDollar[6].node,
AmpersandTkn: yyDollar[5].token,
Var: yyDollar[6].node,
},
} }
yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token) yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token)
@ -7839,15 +7836,12 @@ yydefault:
} }
case 488: case 488:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
// line internal/php5/php5.y:5274 // line internal/php5/php5.y:5271
{ {
arrayItem := &ast.ExprArrayItem{ arrayItem := &ast.ExprArrayItem{
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[3].token, yyDollar[4].node), Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[3].token, yyDollar[4].node),
Val: &ast.ExprReference{ AmpersandTkn: yyDollar[3].token,
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[3].token, yyDollar[4].node), Val: yyDollar[4].node,
AmpersandTkn: yyDollar[3].token,
Var: yyDollar[4].node,
},
} }
yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token) yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token)
@ -7857,7 +7851,7 @@ yydefault:
} }
case 489: case 489:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
// line internal/php5/php5.y:5290 // line internal/php5/php5.y:5284
{ {
yyVAL.node = &ast.ParserSeparatedList{ yyVAL.node = &ast.ParserSeparatedList{
Items: []ast.Vertex{ Items: []ast.Vertex{
@ -7865,41 +7859,35 @@ yydefault:
Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[1].node, yyDollar[4].node), Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[1].node, yyDollar[4].node),
Key: yyDollar[1].node, Key: yyDollar[1].node,
DoubleArrowTkn: yyDollar[2].token, DoubleArrowTkn: yyDollar[2].token,
Val: &ast.ExprReference{ AmpersandTkn: yyDollar[3].token,
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[3].token, yyDollar[4].node), Val: yyDollar[4].node,
AmpersandTkn: yyDollar[3].token,
Var: yyDollar[4].node,
},
}, },
}, },
} }
} }
case 490: case 490:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php5/php5.y:5307 // line internal/php5/php5.y:5298
{ {
yyVAL.node = &ast.ParserSeparatedList{ yyVAL.node = &ast.ParserSeparatedList{
Items: []ast.Vertex{ Items: []ast.Vertex{
&ast.ExprArrayItem{ &ast.ExprArrayItem{
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node),
Val: &ast.ExprReference{ AmpersandTkn: yyDollar[1].token,
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Val: yyDollar[2].node,
AmpersandTkn: yyDollar[1].token,
Var: yyDollar[2].node,
},
}, },
}, },
} }
} }
case 491: case 491:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php5/php5.y:5325 // line internal/php5/php5.y:5313
{ {
yyVAL.list = append(yyDollar[1].list, yyDollar[2].node) yyVAL.list = append(yyDollar[1].list, yyDollar[2].node)
} }
case 492: case 492:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php5/php5.y:5329 // line internal/php5/php5.y:5317
{ {
yyVAL.list = append( yyVAL.list = append(
yyDollar[1].list, yyDollar[1].list,
@ -7912,13 +7900,13 @@ yydefault:
} }
case 493: case 493:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php5/php5.y:5340 // line internal/php5/php5.y:5328
{ {
yyVAL.list = []ast.Vertex{yyDollar[1].node} yyVAL.list = []ast.Vertex{yyDollar[1].node}
} }
case 494: case 494:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php5/php5.y:5344 // line internal/php5/php5.y:5332
{ {
yyVAL.list = []ast.Vertex{ yyVAL.list = []ast.Vertex{
&ast.ScalarEncapsedStringPart{ &ast.ScalarEncapsedStringPart{
@ -7931,7 +7919,7 @@ yydefault:
} }
case 495: case 495:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php5/php5.y:5358 // line internal/php5/php5.y:5346
{ {
yyVAL.node = &ast.ExprVariable{ yyVAL.node = &ast.ExprVariable{
Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token),
@ -7944,7 +7932,7 @@ yydefault:
} }
case 496: case 496:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
// line internal/php5/php5.y:5369 // line internal/php5/php5.y:5357
{ {
yyVAL.node = &ast.ExprArrayDimFetch{ yyVAL.node = &ast.ExprArrayDimFetch{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token),
@ -7963,7 +7951,7 @@ yydefault:
} }
case 497: case 497:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php5/php5.y:5386 // line internal/php5/php5.y:5374
{ {
yyVAL.node = &ast.ExprPropertyFetch{ yyVAL.node = &ast.ExprPropertyFetch{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token),
@ -7985,7 +7973,7 @@ yydefault:
} }
case 498: case 498:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php5/php5.y:5406 // line internal/php5/php5.y:5394
{ {
yyVAL.node = &ast.ParserBrackets{ yyVAL.node = &ast.ParserBrackets{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token),
@ -7999,7 +7987,7 @@ yydefault:
} }
case 499: case 499:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php5/php5.y:5418 // line internal/php5/php5.y:5406
{ {
yyVAL.node = &ast.ParserBrackets{ yyVAL.node = &ast.ParserBrackets{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token),
@ -8017,7 +8005,7 @@ yydefault:
} }
case 500: case 500:
yyDollar = yyS[yypt-6 : yypt+1] yyDollar = yyS[yypt-6 : yypt+1]
// line internal/php5/php5.y:5434 // line internal/php5/php5.y:5422
{ {
yyVAL.node = &ast.ParserBrackets{ yyVAL.node = &ast.ParserBrackets{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[6].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[6].token),
@ -8041,7 +8029,7 @@ yydefault:
} }
case 501: case 501:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php5/php5.y:5456 // line internal/php5/php5.y:5444
{ {
yyVAL.node = &ast.ParserBrackets{ yyVAL.node = &ast.ParserBrackets{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token),
@ -8052,7 +8040,7 @@ yydefault:
} }
case 502: case 502:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php5/php5.y:5468 // line internal/php5/php5.y:5456
{ {
yyVAL.node = &ast.ScalarString{ yyVAL.node = &ast.ScalarString{
Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token),
@ -8062,7 +8050,7 @@ yydefault:
} }
case 503: case 503:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php5/php5.y:5476 // line internal/php5/php5.y:5464
{ {
// TODO: add option to handle 64 bit integer // TODO: add option to handle 64 bit integer
if _, err := strconv.Atoi(string(yyDollar[1].token.Value)); err == nil { if _, err := strconv.Atoi(string(yyDollar[1].token.Value)); err == nil {
@ -8081,7 +8069,7 @@ yydefault:
} }
case 504: case 504:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php5/php5.y:5493 // line internal/php5/php5.y:5481
{ {
yyVAL.node = &ast.ExprVariable{ yyVAL.node = &ast.ExprVariable{
Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token),
@ -8094,7 +8082,7 @@ yydefault:
} }
case 505: case 505:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
// line internal/php5/php5.y:5507 // line internal/php5/php5.y:5495
{ {
yyVAL.node = &ast.ExprIsset{ yyVAL.node = &ast.ExprIsset{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token),
@ -8107,7 +8095,7 @@ yydefault:
} }
case 506: case 506:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
// line internal/php5/php5.y:5518 // line internal/php5/php5.y:5506
{ {
yyVAL.node = &ast.ExprEmpty{ yyVAL.node = &ast.ExprEmpty{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token),
@ -8119,7 +8107,7 @@ yydefault:
} }
case 507: case 507:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
// line internal/php5/php5.y:5528 // line internal/php5/php5.y:5516
{ {
yyVAL.node = &ast.ExprEmpty{ yyVAL.node = &ast.ExprEmpty{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token),
@ -8131,7 +8119,7 @@ yydefault:
} }
case 508: case 508:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php5/php5.y:5538 // line internal/php5/php5.y:5526
{ {
yyVAL.node = &ast.ExprInclude{ yyVAL.node = &ast.ExprInclude{
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node),
@ -8141,7 +8129,7 @@ yydefault:
} }
case 509: case 509:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php5/php5.y:5546 // line internal/php5/php5.y:5534
{ {
yyVAL.node = &ast.ExprIncludeOnce{ yyVAL.node = &ast.ExprIncludeOnce{
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node),
@ -8151,7 +8139,7 @@ yydefault:
} }
case 510: case 510:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
// line internal/php5/php5.y:5554 // line internal/php5/php5.y:5542
{ {
yyVAL.node = &ast.ExprEval{ yyVAL.node = &ast.ExprEval{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token),
@ -8163,7 +8151,7 @@ yydefault:
} }
case 511: case 511:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php5/php5.y:5564 // line internal/php5/php5.y:5552
{ {
yyVAL.node = &ast.ExprRequire{ yyVAL.node = &ast.ExprRequire{
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node),
@ -8173,7 +8161,7 @@ yydefault:
} }
case 512: case 512:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php5/php5.y:5572 // line internal/php5/php5.y:5560
{ {
yyVAL.node = &ast.ExprRequireOnce{ yyVAL.node = &ast.ExprRequireOnce{
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node),
@ -8183,7 +8171,7 @@ yydefault:
} }
case 513: case 513:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php5/php5.y:5583 // line internal/php5/php5.y:5571
{ {
yyVAL.node = &ast.ParserSeparatedList{ yyVAL.node = &ast.ParserSeparatedList{
Items: []ast.Vertex{yyDollar[1].node}, Items: []ast.Vertex{yyDollar[1].node},
@ -8191,7 +8179,7 @@ yydefault:
} }
case 514: case 514:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php5/php5.y:5589 // line internal/php5/php5.y:5577
{ {
yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token) 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) yyDollar[1].node.(*ast.ParserSeparatedList).Items = append(yyDollar[1].node.(*ast.ParserSeparatedList).Items, yyDollar[3].node)
@ -8200,19 +8188,19 @@ yydefault:
} }
case 515: case 515:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php5/php5.y:5599 // line internal/php5/php5.y:5587
{ {
yyVAL.node = yyDollar[1].node yyVAL.node = yyDollar[1].node
} }
case 516: case 516:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php5/php5.y:5603 // line internal/php5/php5.y:5591
{ {
yyVAL.node = yyDollar[1].node yyVAL.node = yyDollar[1].node
} }
case 517: case 517:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php5/php5.y:5610 // line internal/php5/php5.y:5598
{ {
yyVAL.node = &ast.ExprClassConstFetch{ yyVAL.node = &ast.ExprClassConstFetch{
Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token), Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token),
@ -8227,7 +8215,7 @@ yydefault:
} }
case 518: case 518:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php5/php5.y:5623 // line internal/php5/php5.y:5611
{ {
yyVAL.node = &ast.ExprClassConstFetch{ yyVAL.node = &ast.ExprClassConstFetch{
Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token), Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token),
@ -8242,7 +8230,7 @@ yydefault:
} }
case 519: case 519:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php5/php5.y:5639 // line internal/php5/php5.y:5627
{ {
yyVAL.node = &ast.ExprClassConstFetch{ yyVAL.node = &ast.ExprClassConstFetch{
Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token), Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token),
@ -8257,7 +8245,7 @@ yydefault:
} }
case 520: case 520:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php5/php5.y:5655 // line internal/php5/php5.y:5643
{ {
yyVAL.node = &ast.ExprClassConstFetch{ yyVAL.node = &ast.ExprClassConstFetch{
Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token), Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[3].token),

View File

@ -5255,14 +5255,11 @@ non_empty_array_pair_list:
| non_empty_array_pair_list ',' expr T_DOUBLE_ARROW '&' w_variable | non_empty_array_pair_list ',' expr T_DOUBLE_ARROW '&' w_variable
{ {
arrayItem := &ast.ExprArrayItem{ arrayItem := &ast.ExprArrayItem{
Position: yylex.(*Parser).builder.NewNodesPosition($3, $6), Position: yylex.(*Parser).builder.NewNodesPosition($3, $6),
Key: $3, Key: $3,
DoubleArrowTkn: $4, DoubleArrowTkn: $4,
Val: &ast.ExprReference{ AmpersandTkn: $5,
Position: yylex.(*Parser).builder.NewTokenNodePosition($5, $6), Val: $6,
AmpersandTkn: $5,
Var: $6,
},
} }
$1.(*ast.ParserSeparatedList).SeparatorTkns = append($1.(*ast.ParserSeparatedList).SeparatorTkns, $2) $1.(*ast.ParserSeparatedList).SeparatorTkns = append($1.(*ast.ParserSeparatedList).SeparatorTkns, $2)
@ -5273,12 +5270,9 @@ non_empty_array_pair_list:
| non_empty_array_pair_list ',' '&' w_variable | non_empty_array_pair_list ',' '&' w_variable
{ {
arrayItem := &ast.ExprArrayItem{ arrayItem := &ast.ExprArrayItem{
Position: yylex.(*Parser).builder.NewTokenNodePosition($3, $4), Position: yylex.(*Parser).builder.NewTokenNodePosition($3, $4),
Val: &ast.ExprReference{ AmpersandTkn: $3,
Position: yylex.(*Parser).builder.NewTokenNodePosition($3, $4), Val: $4,
AmpersandTkn: $3,
Var: $4,
},
} }
$1.(*ast.ParserSeparatedList).SeparatorTkns = append($1.(*ast.ParserSeparatedList).SeparatorTkns, $2) $1.(*ast.ParserSeparatedList).SeparatorTkns = append($1.(*ast.ParserSeparatedList).SeparatorTkns, $2)
@ -5291,14 +5285,11 @@ non_empty_array_pair_list:
$$ = &ast.ParserSeparatedList{ $$ = &ast.ParserSeparatedList{
Items: []ast.Vertex{ Items: []ast.Vertex{
&ast.ExprArrayItem{ &ast.ExprArrayItem{
Position: yylex.(*Parser).builder.NewNodesPosition($1, $4), Position: yylex.(*Parser).builder.NewNodesPosition($1, $4),
Key: $1, Key: $1,
DoubleArrowTkn: $2, DoubleArrowTkn: $2,
Val: &ast.ExprReference{ AmpersandTkn: $3,
Position: yylex.(*Parser).builder.NewTokenNodePosition($3, $4), Val: $4,
AmpersandTkn: $3,
Var: $4,
},
}, },
}, },
} }
@ -5308,12 +5299,9 @@ non_empty_array_pair_list:
$$ = &ast.ParserSeparatedList{ $$ = &ast.ParserSeparatedList{
Items: []ast.Vertex{ Items: []ast.Vertex{
&ast.ExprArrayItem{ &ast.ExprArrayItem{
Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2), Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2),
Val: &ast.ExprReference{ AmpersandTkn: $1,
Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2), Val: $2,
AmpersandTkn: $1,
Var: $2,
},
}, },
}, },
} }

View File

@ -34718,61 +34718,53 @@ func TestExprArray_Items(t *testing.T) {
StartPos: 15, StartPos: 15,
EndPos: 18, EndPos: 18,
}, },
Val: &ast.ExprReference{ AmpersandTkn: &token.Token{
ID: token.ID(38),
Value: []byte("&"),
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
EndLine: 1, EndLine: 1,
StartPos: 15, StartPos: 15,
EndPos: 18, EndPos: 16,
}, },
AmpersandTkn: &token.Token{ FreeFloating: []*token.Token{
ID: token.ID(38), {
Value: []byte("&"), ID: token.T_WHITESPACE,
Position: &position.Position{ Value: []byte(" "),
StartLine: 1, Position: &position.Position{
EndLine: 1, StartLine: 1,
StartPos: 15, EndLine: 1,
EndPos: 16, StartPos: 14,
}, EndPos: 15,
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 14,
EndPos: 15,
},
}, },
}, },
}, },
Var: &ast.ExprVariable{ },
Val: &ast.ExprVariable{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 16,
EndPos: 18,
},
VarName: &ast.Identifier{
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
EndLine: 1, EndLine: 1,
StartPos: 16, StartPos: 16,
EndPos: 18, EndPos: 18,
}, },
VarName: &ast.Identifier{ IdentifierTkn: &token.Token{
ID: token.T_VARIABLE,
Value: []byte("$b"),
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
EndLine: 1, EndLine: 1,
StartPos: 16, StartPos: 16,
EndPos: 18, EndPos: 18,
}, },
IdentifierTkn: &token.Token{
ID: token.T_VARIABLE,
Value: []byte("$b"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 16,
EndPos: 18,
},
},
Value: []byte("$b"),
}, },
Value: []byte("$b"),
}, },
}, },
}, },
@ -43983,61 +43975,53 @@ func TestExprShortArray_Items(t *testing.T) {
StartPos: 10, StartPos: 10,
EndPos: 13, EndPos: 13,
}, },
Val: &ast.ExprReference{ AmpersandTkn: &token.Token{
ID: token.ID(38),
Value: []byte("&"),
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
EndLine: 1, EndLine: 1,
StartPos: 10, StartPos: 10,
EndPos: 13, EndPos: 11,
}, },
AmpersandTkn: &token.Token{ FreeFloating: []*token.Token{
ID: token.ID(38), {
Value: []byte("&"), ID: token.T_WHITESPACE,
Position: &position.Position{ Value: []byte(" "),
StartLine: 1, Position: &position.Position{
EndLine: 1, StartLine: 1,
StartPos: 10, EndLine: 1,
EndPos: 11, StartPos: 9,
}, EndPos: 10,
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 9,
EndPos: 10,
},
}, },
}, },
}, },
Var: &ast.ExprVariable{ },
Val: &ast.ExprVariable{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 11,
EndPos: 13,
},
VarName: &ast.Identifier{
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
EndLine: 1, EndLine: 1,
StartPos: 11, StartPos: 11,
EndPos: 13, EndPos: 13,
}, },
VarName: &ast.Identifier{ IdentifierTkn: &token.Token{
ID: token.T_VARIABLE,
Value: []byte("$b"),
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
EndLine: 1, EndLine: 1,
StartPos: 11, StartPos: 11,
EndPos: 13, EndPos: 13,
}, },
IdentifierTkn: &token.Token{
ID: token.T_VARIABLE,
Value: []byte("$b"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 11,
EndPos: 13,
},
},
Value: []byte("$b"),
}, },
Value: []byte("$b"),
}, },
}, },
}, },

76
internal/php7/php7.go generated
View File

@ -339,7 +339,7 @@ const yyEofCode = 1
const yyErrCode = 2 const yyErrCode = 2
const yyInitialStackSize = 16 const yyInitialStackSize = 16
// line internal/php7/php7.y:4359 // line internal/php7/php7.y:4353
// line yacctab:1 // line yacctab:1
var yyExca = [...]int{ var yyExca = [...]int{
@ -6677,29 +6677,23 @@ yydefault:
Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[1].node, yyDollar[4].node), Position: yylex.(*Parser).builder.NewNodesPosition(yyDollar[1].node, yyDollar[4].node),
Key: yyDollar[1].node, Key: yyDollar[1].node,
DoubleArrowTkn: yyDollar[2].token, DoubleArrowTkn: yyDollar[2].token,
Val: &ast.ExprReference{ AmpersandTkn: yyDollar[3].token,
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[3].token, yyDollar[4].node), Val: yyDollar[4].node,
AmpersandTkn: yyDollar[3].token,
Var: yyDollar[4].node,
},
} }
} }
case 466: case 466:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php7/php7.y:4008 // line internal/php7/php7.y:4005
{ {
yyVAL.node = &ast.ExprArrayItem{ yyVAL.node = &ast.ExprArrayItem{
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node),
Val: &ast.ExprReference{ AmpersandTkn: yyDollar[1].token,
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Val: yyDollar[2].node,
AmpersandTkn: yyDollar[1].token,
Var: yyDollar[2].node,
},
} }
} }
case 467: case 467:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php7/php7.y:4019 // line internal/php7/php7.y:4013
{ {
yyVAL.node = &ast.ExprArrayItem{ yyVAL.node = &ast.ExprArrayItem{
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node),
@ -6709,7 +6703,7 @@ yydefault:
} }
case 468: case 468:
yyDollar = yyS[yypt-6 : yypt+1] yyDollar = yyS[yypt-6 : yypt+1]
// line internal/php7/php7.y:4027 // line internal/php7/php7.y:4021
{ {
yyVAL.node = &ast.ExprArrayItem{ yyVAL.node = &ast.ExprArrayItem{
Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[6].token), Position: yylex.(*Parser).builder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[6].token),
@ -6727,7 +6721,7 @@ yydefault:
} }
case 469: case 469:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
// line internal/php7/php7.y:4043 // line internal/php7/php7.y:4037
{ {
yyVAL.node = &ast.ExprArrayItem{ yyVAL.node = &ast.ExprArrayItem{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token),
@ -6743,13 +6737,13 @@ yydefault:
} }
case 470: case 470:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php7/php7.y:4060 // line internal/php7/php7.y:4054
{ {
yyVAL.list = append(yyDollar[1].list, yyDollar[2].node) yyVAL.list = append(yyDollar[1].list, yyDollar[2].node)
} }
case 471: case 471:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php7/php7.y:4064 // line internal/php7/php7.y:4058
{ {
yyVAL.list = append( yyVAL.list = append(
yyDollar[1].list, yyDollar[1].list,
@ -6762,13 +6756,13 @@ yydefault:
} }
case 472: case 472:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php7/php7.y:4075 // line internal/php7/php7.y:4069
{ {
yyVAL.list = []ast.Vertex{yyDollar[1].node} yyVAL.list = []ast.Vertex{yyDollar[1].node}
} }
case 473: case 473:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php7/php7.y:4079 // line internal/php7/php7.y:4073
{ {
yyVAL.list = []ast.Vertex{ yyVAL.list = []ast.Vertex{
&ast.ScalarEncapsedStringPart{ &ast.ScalarEncapsedStringPart{
@ -6781,7 +6775,7 @@ yydefault:
} }
case 474: case 474:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php7/php7.y:4093 // line internal/php7/php7.y:4087
{ {
yyVAL.node = &ast.ExprVariable{ yyVAL.node = &ast.ExprVariable{
Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token),
@ -6794,7 +6788,7 @@ yydefault:
} }
case 475: case 475:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
// line internal/php7/php7.y:4104 // line internal/php7/php7.y:4098
{ {
yyVAL.node = &ast.ExprArrayDimFetch{ yyVAL.node = &ast.ExprArrayDimFetch{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token),
@ -6813,7 +6807,7 @@ yydefault:
} }
case 476: case 476:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php7/php7.y:4121 // line internal/php7/php7.y:4115
{ {
yyVAL.node = &ast.ExprPropertyFetch{ yyVAL.node = &ast.ExprPropertyFetch{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token),
@ -6835,7 +6829,7 @@ yydefault:
} }
case 477: case 477:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php7/php7.y:4141 // line internal/php7/php7.y:4135
{ {
yyVAL.node = &ast.ParserBrackets{ yyVAL.node = &ast.ParserBrackets{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token),
@ -6849,7 +6843,7 @@ yydefault:
} }
case 478: case 478:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php7/php7.y:4153 // line internal/php7/php7.y:4147
{ {
yyVAL.node = &ast.ParserBrackets{ yyVAL.node = &ast.ParserBrackets{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token),
@ -6867,7 +6861,7 @@ yydefault:
} }
case 479: case 479:
yyDollar = yyS[yypt-6 : yypt+1] yyDollar = yyS[yypt-6 : yypt+1]
// line internal/php7/php7.y:4169 // line internal/php7/php7.y:4163
{ {
yyVAL.node = &ast.ParserBrackets{ yyVAL.node = &ast.ParserBrackets{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[6].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[6].token),
@ -6891,7 +6885,7 @@ yydefault:
} }
case 480: case 480:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php7/php7.y:4191 // line internal/php7/php7.y:4185
{ {
yyVAL.node = &ast.ParserBrackets{ yyVAL.node = &ast.ParserBrackets{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[3].token),
@ -6902,7 +6896,7 @@ yydefault:
} }
case 481: case 481:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php7/php7.y:4203 // line internal/php7/php7.y:4197
{ {
yyVAL.node = &ast.ScalarString{ yyVAL.node = &ast.ScalarString{
Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token),
@ -6912,7 +6906,7 @@ yydefault:
} }
case 482: case 482:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php7/php7.y:4211 // line internal/php7/php7.y:4205
{ {
// TODO: add option to handle 64 bit integer // TODO: add option to handle 64 bit integer
if _, err := strconv.Atoi(string(yyDollar[1].token.Value)); err == nil { if _, err := strconv.Atoi(string(yyDollar[1].token.Value)); err == nil {
@ -6931,7 +6925,7 @@ yydefault:
} }
case 483: case 483:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php7/php7.y:4228 // line internal/php7/php7.y:4222
{ {
_, err := strconv.Atoi(string(yyDollar[2].token.Value)) _, err := strconv.Atoi(string(yyDollar[2].token.Value))
isInt := err == nil isInt := err == nil
@ -6957,7 +6951,7 @@ yydefault:
} }
case 484: case 484:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php7/php7.y:4252 // line internal/php7/php7.y:4246
{ {
yyVAL.node = &ast.ExprVariable{ yyVAL.node = &ast.ExprVariable{
Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token), Position: yylex.(*Parser).builder.NewTokenPosition(yyDollar[1].token),
@ -6970,7 +6964,7 @@ yydefault:
} }
case 485: case 485:
yyDollar = yyS[yypt-5 : yypt+1] yyDollar = yyS[yypt-5 : yypt+1]
// line internal/php7/php7.y:4266 // line internal/php7/php7.y:4260
{ {
if yyDollar[4].token != nil { if yyDollar[4].token != nil {
yyDollar[3].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[3].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[4].token) yyDollar[3].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[3].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[4].token)
@ -6987,7 +6981,7 @@ yydefault:
} }
case 486: case 486:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
// line internal/php7/php7.y:4281 // line internal/php7/php7.y:4275
{ {
yyVAL.node = &ast.ExprEmpty{ yyVAL.node = &ast.ExprEmpty{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token),
@ -6999,7 +6993,7 @@ yydefault:
} }
case 487: case 487:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php7/php7.y:4291 // line internal/php7/php7.y:4285
{ {
yyVAL.node = &ast.ExprInclude{ yyVAL.node = &ast.ExprInclude{
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node),
@ -7009,7 +7003,7 @@ yydefault:
} }
case 488: case 488:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php7/php7.y:4299 // line internal/php7/php7.y:4293
{ {
yyVAL.node = &ast.ExprIncludeOnce{ yyVAL.node = &ast.ExprIncludeOnce{
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node),
@ -7019,7 +7013,7 @@ yydefault:
} }
case 489: case 489:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
// line internal/php7/php7.y:4307 // line internal/php7/php7.y:4301
{ {
yyVAL.node = &ast.ExprEval{ yyVAL.node = &ast.ExprEval{
Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token), Position: yylex.(*Parser).builder.NewTokensPosition(yyDollar[1].token, yyDollar[4].token),
@ -7031,7 +7025,7 @@ yydefault:
} }
case 490: case 490:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php7/php7.y:4317 // line internal/php7/php7.y:4311
{ {
yyVAL.node = &ast.ExprRequire{ yyVAL.node = &ast.ExprRequire{
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node),
@ -7041,7 +7035,7 @@ yydefault:
} }
case 491: case 491:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
// line internal/php7/php7.y:4325 // line internal/php7/php7.y:4319
{ {
yyVAL.node = &ast.ExprRequireOnce{ yyVAL.node = &ast.ExprRequireOnce{
Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node), Position: yylex.(*Parser).builder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node),
@ -7051,7 +7045,7 @@ yydefault:
} }
case 492: case 492:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php7/php7.y:4336 // line internal/php7/php7.y:4330
{ {
yyVAL.node = &ast.ParserSeparatedList{ yyVAL.node = &ast.ParserSeparatedList{
Items: []ast.Vertex{yyDollar[1].node}, Items: []ast.Vertex{yyDollar[1].node},
@ -7059,7 +7053,7 @@ yydefault:
} }
case 493: case 493:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
// line internal/php7/php7.y:4342 // line internal/php7/php7.y:4336
{ {
yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns = append(yyDollar[1].node.(*ast.ParserSeparatedList).SeparatorTkns, yyDollar[2].token) 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) yyDollar[1].node.(*ast.ParserSeparatedList).Items = append(yyDollar[1].node.(*ast.ParserSeparatedList).Items, yyDollar[3].node)
@ -7068,7 +7062,7 @@ yydefault:
} }
case 494: case 494:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
// line internal/php7/php7.y:4352 // line internal/php7/php7.y:4346
{ {
yyVAL.node = yyDollar[1].node yyVAL.node = yyDollar[1].node
} }

View File

@ -3994,25 +3994,19 @@ array_pair:
| expr T_DOUBLE_ARROW '&' variable | expr T_DOUBLE_ARROW '&' variable
{ {
$$ = &ast.ExprArrayItem{ $$ = &ast.ExprArrayItem{
Position: yylex.(*Parser).builder.NewNodesPosition($1, $4), Position: yylex.(*Parser).builder.NewNodesPosition($1, $4),
Key: $1, Key: $1,
DoubleArrowTkn: $2, DoubleArrowTkn: $2,
Val: &ast.ExprReference{ AmpersandTkn: $3,
Position: yylex.(*Parser).builder.NewTokenNodePosition($3, $4), Val: $4,
AmpersandTkn: $3,
Var: $4,
},
} }
} }
| '&' variable | '&' variable
{ {
$$ = &ast.ExprArrayItem{ $$ = &ast.ExprArrayItem{
Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2), Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2),
Val: &ast.ExprReference{ AmpersandTkn: $1,
Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2), Val: $2,
AmpersandTkn: $1,
Var: $2,
},
} }
} }
| T_ELLIPSIS expr | T_ELLIPSIS expr

View File

@ -1177,6 +1177,7 @@ type ExprArrayItem struct {
EllipsisTkn *token.Token EllipsisTkn *token.Token
Key Vertex Key Vertex
DoubleArrowTkn *token.Token DoubleArrowTkn *token.Token
AmpersandTkn *token.Token
Val Vertex Val Vertex
} }

View File

@ -1056,6 +1056,7 @@ func (v *Dumper) ExprArrayItem(n *ast.ExprArrayItem) {
v.dumpToken("EllipsisTkn", n.EllipsisTkn) v.dumpToken("EllipsisTkn", n.EllipsisTkn)
v.dumpVertex("Key", n.Key) v.dumpVertex("Key", n.Key)
v.dumpToken("DoubleArrowTkn", n.DoubleArrowTkn) v.dumpToken("DoubleArrowTkn", n.DoubleArrowTkn)
v.dumpToken("AmpersandTkn", n.AmpersandTkn)
v.dumpVertex("Val", n.Val) v.dumpVertex("Val", n.Val)
v.indent-- v.indent--

View File

@ -641,6 +641,7 @@ func (p *printer) ExprArrayItem(n *ast.ExprArrayItem) {
p.printToken(n.EllipsisTkn, nil) p.printToken(n.EllipsisTkn, nil)
p.printNode(n.Key) p.printNode(n.Key)
p.printToken(n.DoubleArrowTkn, p.ifNode(n.Key, []byte("=>"))) p.printToken(n.DoubleArrowTkn, p.ifNode(n.Key, []byte("=>")))
p.printToken(n.AmpersandTkn, nil)
p.printNode(n.Val) p.printNode(n.Val)
} }

View File

@ -1559,9 +1559,31 @@ func TestPrinterPrintExprArrayItem(t *testing.T) {
p := visitor.NewPrinter(o).WithState(visitor.PrinterStatePHP) p := visitor.NewPrinter(o).WithState(visitor.PrinterStatePHP)
n := &ast.ExprArrayItem{ n := &ast.ExprArrayItem{
Val: &ast.ExprReference{Var: &ast.ExprVariable{ Val: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$world")}, VarName: &ast.Identifier{Value: []byte("$world")},
}}, },
}
n.Accept(p)
expected := `$world`
actual := o.String()
if expected != actual {
t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
}
}
func TestPrinterPrintExprArrayItem_Reference(t *testing.T) {
o := bytes.NewBufferString("")
p := visitor.NewPrinter(o).WithState(visitor.PrinterStatePHP)
n := &ast.ExprArrayItem{
AmpersandTkn: &token.Token{
Value: []byte("&"),
},
Val: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$world")},
},
} }
n.Accept(p) n.Accept(p)