use empty *expr.ArrayItem to represent missed a list and array items.

This commit is contained in:
z7zmey 2018-06-26 23:49:00 +03:00
parent b62cb4359b
commit 36d0cf4823
9 changed files with 83 additions and 80 deletions

View File

@ -202,7 +202,7 @@ func TestArrayItems(t *testing.T) {
}, },
}, },
}, },
nil, &expr.ArrayItem{},
}, },
}, },
}, },

View File

@ -420,7 +420,7 @@ func TestListEmptyItem(t *testing.T) {
EndPos: 13, EndPos: 13,
}, },
Items: []node.Node{ Items: []node.Node{
nil, &expr.ArrayItem{},
&expr.ArrayItem{ &expr.ArrayItem{
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
@ -514,8 +514,8 @@ func TestListEmptyItems(t *testing.T) {
EndPos: 17, EndPos: 17,
}, },
Items: []node.Node{ Items: []node.Node{
nil, &expr.ArrayItem{},
nil, &expr.ArrayItem{},
&expr.ArrayItem{ &expr.ArrayItem{
Position: &position.Position{ Position: &position.Position{
StartLine: 1, StartLine: 1,
@ -541,7 +541,7 @@ func TestListEmptyItems(t *testing.T) {
}, },
}, },
}, },
nil, &expr.ArrayItem{},
}, },
}, },
Expression: &expr.Variable{ Expression: &expr.Variable{

View File

@ -202,7 +202,7 @@ func TestShortArrayItems(t *testing.T) {
}, },
}, },
}, },
nil, &expr.ArrayItem{},
}, },
}, },
}, },

View File

@ -347,6 +347,7 @@ const yyErrCode = 2
const yyInitialStackSize = 16 const yyInitialStackSize = 16
//line php5/php5.y:6795 //line php5/php5.y:6795
type simpleIndirectReference struct { type simpleIndirectReference struct {
all []*expr.Variable all []*expr.Variable
last *expr.Variable last *expr.Variable
@ -8741,15 +8742,15 @@ yydefault:
//line php5/php5.y:6190 //line php5/php5.y:6190
{ {
if len(yyDollar[1].list) == 0 { if len(yyDollar[1].list) == 0 {
yyDollar[1].list = []node.Node{nil} yyDollar[1].list = []node.Node{expr.NewArrayItem(nil, nil)}
} }
yyVAL.list = append(yyDollar[1].list, yyDollar[3].node) yyVAL.list = append(yyDollar[1].list, yyDollar[3].node)
// save comments // save comments
if lastNode(yyDollar[1].list) != nil { // if lastNode($1) != nil {
lastNode(yyDollar[1].list).AddComments(yyDollar[2].token.Comments, comment.CommaToken) lastNode(yyDollar[1].list).AddComments(yyDollar[2].token.Comments, comment.CommaToken)
} // }
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
} }
@ -8757,7 +8758,7 @@ yydefault:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
//line php5/php5.y:6205 //line php5/php5.y:6205
{ {
if yyDollar[1].node == nil { if yyDollar[1].node.(*expr.ArrayItem).Key == nil && yyDollar[1].node.(*expr.ArrayItem).Val == nil {
yyVAL.list = []node.Node{} yyVAL.list = []node.Node{}
} else { } else {
yyVAL.list = []node.Node{yyDollar[1].node} yyVAL.list = []node.Node{yyDollar[1].node}
@ -8798,7 +8799,7 @@ yydefault:
yyDollar = yyS[yypt-0 : yypt+1] yyDollar = yyS[yypt-0 : yypt+1]
//line php5/php5.y:6244 //line php5/php5.y:6244
{ {
yyVAL.node = nil yyVAL.node = expr.NewArrayItem(nil, nil)
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
} }
@ -8817,7 +8818,7 @@ yydefault:
yyVAL.list = yyDollar[1].list yyVAL.list = yyDollar[1].list
if yyDollar[2].token != nil { if yyDollar[2].token != nil {
yyVAL.list = append(yyDollar[1].list, nil) yyVAL.list = append(yyDollar[1].list, expr.NewArrayItem(nil, nil))
} }
// save comments // save comments

View File

@ -6189,21 +6189,19 @@ assignment_list:
assignment_list ',' assignment_list_element assignment_list ',' assignment_list_element
{ {
if len($1) == 0 { if len($1) == 0 {
$1 = []node.Node{nil} $1 = []node.Node{expr.NewArrayItem(nil, nil)}
} }
$$ = append($1, $3) $$ = append($1, $3)
// save comments // save comments
if lastNode($1) != nil { lastNode($1).AddComments($2.Comments, comment.CommaToken)
lastNode($1).AddComments($2.Comments, comment.CommaToken)
}
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
} }
| assignment_list_element | assignment_list_element
{ {
if $1 == nil { if $1.(*expr.ArrayItem).Key == nil && $1.(*expr.ArrayItem).Val == nil {
$$ = []node.Node{} $$ = []node.Node{}
} else { } else {
$$ = []node.Node{$1} $$ = []node.Node{$1}
@ -6242,7 +6240,7 @@ assignment_list_element:
} }
| /* empty */ | /* empty */
{ {
$$ = nil $$ = expr.NewArrayItem(nil, nil)
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
} }
@ -6261,7 +6259,7 @@ array_pair_list:
$$ = $1 $$ = $1
if $2 != nil { if $2 != nil {
$$ = append($1, nil) $$ = append($1, expr.NewArrayItem(nil, nil))
} }
// save comments // save comments

View File

@ -8216,7 +8216,7 @@ func TestPhp5(t *testing.T) {
}, },
}, },
}, },
nil, &expr.ArrayItem{},
}, },
}, },
}, },
@ -11019,7 +11019,7 @@ func TestPhp5(t *testing.T) {
}, },
}, },
}, },
nil, &expr.ArrayItem{},
}, },
}, },
}, },

View File

@ -346,7 +346,7 @@ const yyEofCode = 1
const yyErrCode = 2 const yyErrCode = 2
const yyInitialStackSize = 16 const yyInitialStackSize = 16
//line php7/php7.y:5348 //line php7/php7.y:5350
//line yacctab:1 //line yacctab:1
var yyExca = [...]int{ var yyExca = [...]int{
@ -7517,25 +7517,21 @@ yydefault:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:4861 //line php7/php7.y:4861
{ {
if len(yyDollar[1].list) == 1 && yyDollar[1].list[0] == nil { yyVAL.list = yyDollar[1].list
yyVAL.list = yyDollar[1].list[:0]
} else {
yyVAL.list = yyDollar[1].list
}
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
} }
case 455: case 455:
yyDollar = yyS[yypt-0 : yypt+1] yyDollar = yyS[yypt-0 : yypt+1]
//line php7/php7.y:4874 //line php7/php7.y:4870
{ {
yyVAL.node = nil yyVAL.node = expr.NewArrayItem(nil, nil)
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
} }
case 456: case 456:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:4880 //line php7/php7.y:4876
{ {
yyVAL.node = yyDollar[1].node yyVAL.node = yyDollar[1].node
@ -7543,28 +7539,34 @@ yydefault:
} }
case 457: case 457:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:4889 //line php7/php7.y:4885
{ {
if len(yyDollar[1].list) == 0 {
yyDollar[1].list = []node.Node{expr.NewArrayItem(nil, nil)}
}
yyVAL.list = append(yyDollar[1].list, yyDollar[3].node) yyVAL.list = append(yyDollar[1].list, yyDollar[3].node)
// save comments // save comments
if lastNode(yyDollar[1].list) != nil { lastNode(yyDollar[1].list).AddComments(yyDollar[2].token.Comments, comment.CommaToken)
lastNode(yyDollar[1].list).AddComments(yyDollar[2].token.Comments, comment.CommaToken)
}
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
} }
case 458: case 458:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:4900 //line php7/php7.y:4898
{ {
yyVAL.list = []node.Node{yyDollar[1].node} if yyDollar[1].node.(*expr.ArrayItem).Key == nil && yyDollar[1].node.(*expr.ArrayItem).Val == nil {
yyVAL.list = []node.Node{}
} else {
yyVAL.list = []node.Node{yyDollar[1].node}
}
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
} }
case 459: case 459:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:4909 //line php7/php7.y:4911
{ {
yyVAL.node = expr.NewArrayItem(yyDollar[1].node, yyDollar[3].node) yyVAL.node = expr.NewArrayItem(yyDollar[1].node, yyDollar[3].node)
@ -7578,7 +7580,7 @@ yydefault:
} }
case 460: case 460:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:4921 //line php7/php7.y:4923
{ {
yyVAL.node = expr.NewArrayItem(nil, yyDollar[1].node) yyVAL.node = expr.NewArrayItem(nil, yyDollar[1].node)
@ -7589,7 +7591,7 @@ yydefault:
} }
case 461: case 461:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:4930 //line php7/php7.y:4932
{ {
reference := expr.NewReference(yyDollar[4].node) reference := expr.NewReference(yyDollar[4].node)
yyVAL.node = expr.NewArrayItem(yyDollar[1].node, reference) yyVAL.node = expr.NewArrayItem(yyDollar[1].node, reference)
@ -7606,7 +7608,7 @@ yydefault:
} }
case 462: case 462:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:4945 //line php7/php7.y:4947
{ {
reference := expr.NewReference(yyDollar[2].node) reference := expr.NewReference(yyDollar[2].node)
yyVAL.node = expr.NewArrayItem(nil, reference) yyVAL.node = expr.NewArrayItem(nil, reference)
@ -7622,7 +7624,7 @@ yydefault:
} }
case 463: case 463:
yyDollar = yyS[yypt-6 : yypt+1] yyDollar = yyS[yypt-6 : yypt+1]
//line php7/php7.y:4959 //line php7/php7.y:4961
{ {
// TODO: Cannot use list() as standalone expression // TODO: Cannot use list() as standalone expression
list := expr.NewList(yyDollar[5].list) list := expr.NewList(yyDollar[5].list)
@ -7642,7 +7644,7 @@ yydefault:
} }
case 464: case 464:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:4977 //line php7/php7.y:4979
{ {
// TODO: Cannot use list() as standalone expression // TODO: Cannot use list() as standalone expression
list := expr.NewList(yyDollar[3].list) list := expr.NewList(yyDollar[3].list)
@ -7661,7 +7663,7 @@ yydefault:
} }
case 465: case 465:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:4997 //line php7/php7.y:4999
{ {
yyVAL.list = append(yyDollar[1].list, yyDollar[2].node) yyVAL.list = append(yyDollar[1].list, yyDollar[2].node)
@ -7669,7 +7671,7 @@ yydefault:
} }
case 466: case 466:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5003 //line php7/php7.y:5005
{ {
encapsed := scalar.NewEncapsedStringPart(yyDollar[2].token.Value) encapsed := scalar.NewEncapsedStringPart(yyDollar[2].token.Value)
yyVAL.list = append(yyDollar[1].list, encapsed) yyVAL.list = append(yyDollar[1].list, encapsed)
@ -7684,7 +7686,7 @@ yydefault:
} }
case 467: case 467:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5016 //line php7/php7.y:5018
{ {
yyVAL.list = []node.Node{yyDollar[1].node} yyVAL.list = []node.Node{yyDollar[1].node}
@ -7692,7 +7694,7 @@ yydefault:
} }
case 468: case 468:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5022 //line php7/php7.y:5024
{ {
encapsed := scalar.NewEncapsedStringPart(yyDollar[1].token.Value) encapsed := scalar.NewEncapsedStringPart(yyDollar[1].token.Value)
yyVAL.list = []node.Node{encapsed, yyDollar[2].node} yyVAL.list = []node.Node{encapsed, yyDollar[2].node}
@ -7707,7 +7709,7 @@ yydefault:
} }
case 469: case 469:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5038 //line php7/php7.y:5040
{ {
name := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar)) name := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
yyVAL.node = expr.NewVariable(name) yyVAL.node = expr.NewVariable(name)
@ -7723,7 +7725,7 @@ yydefault:
} }
case 470: case 470:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:5052 //line php7/php7.y:5054
{ {
identifier := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar)) identifier := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
variable := expr.NewVariable(identifier) variable := expr.NewVariable(identifier)
@ -7743,7 +7745,7 @@ yydefault:
} }
case 471: case 471:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5070 //line php7/php7.y:5072
{ {
identifier := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar)) identifier := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
variable := expr.NewVariable(identifier) variable := expr.NewVariable(identifier)
@ -7765,7 +7767,7 @@ yydefault:
} }
case 472: case 472:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5090 //line php7/php7.y:5092
{ {
yyVAL.node = expr.NewVariable(yyDollar[2].node) yyVAL.node = expr.NewVariable(yyDollar[2].node)
@ -7780,7 +7782,7 @@ yydefault:
} }
case 473: case 473:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5103 //line php7/php7.y:5105
{ {
name := node.NewIdentifier(yyDollar[2].token.Value) name := node.NewIdentifier(yyDollar[2].token.Value)
yyVAL.node = expr.NewVariable(name) yyVAL.node = expr.NewVariable(name)
@ -7798,7 +7800,7 @@ yydefault:
} }
case 474: case 474:
yyDollar = yyS[yypt-6 : yypt+1] yyDollar = yyS[yypt-6 : yypt+1]
//line php7/php7.y:5119 //line php7/php7.y:5121
{ {
identifier := node.NewIdentifier(yyDollar[2].token.Value) identifier := node.NewIdentifier(yyDollar[2].token.Value)
variable := expr.NewVariable(identifier) variable := expr.NewVariable(identifier)
@ -7820,7 +7822,7 @@ yydefault:
} }
case 475: case 475:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5139 //line php7/php7.y:5141
{ {
yyVAL.node = yyDollar[2].node yyVAL.node = yyDollar[2].node
@ -7828,7 +7830,7 @@ yydefault:
} }
case 476: case 476:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5148 //line php7/php7.y:5150
{ {
yyVAL.node = scalar.NewString(yyDollar[1].token.Value) yyVAL.node = scalar.NewString(yyDollar[1].token.Value)
@ -7842,7 +7844,7 @@ yydefault:
} }
case 477: case 477:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5160 //line php7/php7.y:5162
{ {
// TODO: add option to handle 64 bit integer // TODO: add option to handle 64 bit integer
if _, err := strconv.Atoi(yyDollar[1].token.Value); err == nil { if _, err := strconv.Atoi(yyDollar[1].token.Value); err == nil {
@ -7861,7 +7863,7 @@ yydefault:
} }
case 478: case 478:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5177 //line php7/php7.y:5179
{ {
var lnumber *scalar.Lnumber var lnumber *scalar.Lnumber
// TODO: add option to handle 64 bit integer // TODO: add option to handle 64 bit integer
@ -7894,7 +7896,7 @@ yydefault:
} }
case 479: case 479:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5208 //line php7/php7.y:5210
{ {
identifier := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar)) identifier := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
yyVAL.node = expr.NewVariable(identifier) yyVAL.node = expr.NewVariable(identifier)
@ -7910,7 +7912,7 @@ yydefault:
} }
case 480: case 480:
yyDollar = yyS[yypt-5 : yypt+1] yyDollar = yyS[yypt-5 : yypt+1]
//line php7/php7.y:5225 //line php7/php7.y:5227
{ {
yyVAL.node = expr.NewIsset(yyDollar[3].list) yyVAL.node = expr.NewIsset(yyDollar[3].list)
@ -7929,7 +7931,7 @@ yydefault:
} }
case 481: case 481:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:5242 //line php7/php7.y:5244
{ {
yyVAL.node = expr.NewEmpty(yyDollar[3].node) yyVAL.node = expr.NewEmpty(yyDollar[3].node)
@ -7945,7 +7947,7 @@ yydefault:
} }
case 482: case 482:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5256 //line php7/php7.y:5258
{ {
yyVAL.node = expr.NewInclude(yyDollar[2].node) yyVAL.node = expr.NewInclude(yyDollar[2].node)
@ -7959,7 +7961,7 @@ yydefault:
} }
case 483: case 483:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5268 //line php7/php7.y:5270
{ {
yyVAL.node = expr.NewIncludeOnce(yyDollar[2].node) yyVAL.node = expr.NewIncludeOnce(yyDollar[2].node)
@ -7973,7 +7975,7 @@ yydefault:
} }
case 484: case 484:
yyDollar = yyS[yypt-4 : yypt+1] yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:5280 //line php7/php7.y:5282
{ {
yyVAL.node = expr.NewEval(yyDollar[3].node) yyVAL.node = expr.NewEval(yyDollar[3].node)
@ -7989,7 +7991,7 @@ yydefault:
} }
case 485: case 485:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5294 //line php7/php7.y:5296
{ {
yyVAL.node = expr.NewRequire(yyDollar[2].node) yyVAL.node = expr.NewRequire(yyDollar[2].node)
@ -8003,7 +8005,7 @@ yydefault:
} }
case 486: case 486:
yyDollar = yyS[yypt-2 : yypt+1] yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5306 //line php7/php7.y:5308
{ {
yyVAL.node = expr.NewRequireOnce(yyDollar[2].node) yyVAL.node = expr.NewRequireOnce(yyDollar[2].node)
@ -8017,7 +8019,7 @@ yydefault:
} }
case 487: case 487:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5321 //line php7/php7.y:5323
{ {
yyVAL.list = []node.Node{yyDollar[1].node} yyVAL.list = []node.Node{yyDollar[1].node}
@ -8025,7 +8027,7 @@ yydefault:
} }
case 488: case 488:
yyDollar = yyS[yypt-3 : yypt+1] yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5327 //line php7/php7.y:5329
{ {
yyVAL.list = append(yyDollar[1].list, yyDollar[3].node) yyVAL.list = append(yyDollar[1].list, yyDollar[3].node)
@ -8036,7 +8038,7 @@ yydefault:
} }
case 489: case 489:
yyDollar = yyS[yypt-1 : yypt+1] yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5339 //line php7/php7.y:5341
{ {
yyVAL.node = yyDollar[1].node yyVAL.node = yyDollar[1].node

View File

@ -4859,11 +4859,7 @@ property_name:
array_pair_list: array_pair_list:
non_empty_array_pair_list non_empty_array_pair_list
{ {
if (len($1) == 1 && $1[0] == nil) { $$ = $1
$$ = $1[:0]
} else {
$$ = $1
}
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
} }
@ -4872,7 +4868,7 @@ array_pair_list:
possible_array_pair: possible_array_pair:
/* empty */ /* empty */
{ {
$$ = nil $$ = expr.NewArrayItem(nil, nil)
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
} }
@ -4887,18 +4883,24 @@ possible_array_pair:
non_empty_array_pair_list: non_empty_array_pair_list:
non_empty_array_pair_list ',' possible_array_pair non_empty_array_pair_list ',' possible_array_pair
{ {
if len($1) == 0 {
$1 = []node.Node{expr.NewArrayItem(nil, nil)}
}
$$ = append($1, $3) $$ = append($1, $3)
// save comments // save comments
if lastNode($1) != nil { lastNode($1).AddComments($2.Comments, comment.CommaToken)
lastNode($1).AddComments($2.Comments, comment.CommaToken)
}
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
} }
| possible_array_pair | possible_array_pair
{ {
$$ = []node.Node{$1} if $1.(*expr.ArrayItem).Key == nil && $1.(*expr.ArrayItem).Val == nil {
$$ = []node.Node{}
} else {
$$ = []node.Node{$1}
}
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
} }

View File

@ -9034,7 +9034,7 @@ func TestPhp7(t *testing.T) {
}, },
}, },
}, },
nil, &expr.ArrayItem{},
}, },
}, },
}, },
@ -11169,7 +11169,7 @@ func TestPhp7(t *testing.T) {
}, },
}, },
}, },
nil, &expr.ArrayItem{},
}, },
}, },
}, },