create expr.Reference node
[wip] create expr.Reference node [wip] create expr.Reference node [wip] create expr.Reference node fix
This commit is contained in:
1063
php7/php7.go
1063
php7/php7.go
File diff suppressed because it is too large
Load Diff
77
php7/php7.y
77
php7/php7.y
@@ -23,7 +23,6 @@ import (
|
||||
node node.Node
|
||||
token *scanner.Token
|
||||
list []node.Node
|
||||
foreachVariable foreachVariable
|
||||
str string
|
||||
|
||||
ClassExtends *stmt.ClassExtends
|
||||
@@ -275,7 +274,7 @@ import (
|
||||
|
||||
%type <node> member_modifier
|
||||
%type <node> use_type
|
||||
%type <foreachVariable> foreach_variable
|
||||
%type <node> foreach_variable
|
||||
|
||||
|
||||
%type <list> encaps_list backticks_expr namespace_name catch_name_list catch_list class_const_list
|
||||
@@ -963,12 +962,10 @@ statement:
|
||||
switch n := $7.(type) {
|
||||
case *stmt.Foreach :
|
||||
n.Expr = $3
|
||||
n.ByRef = $5.byRef
|
||||
n.Variable = $5.node
|
||||
n.Variable = $5
|
||||
case *stmt.AltForeach :
|
||||
n.Expr = $3
|
||||
n.ByRef = $5.byRef
|
||||
n.Variable = $5.node
|
||||
n.Variable = $5
|
||||
}
|
||||
|
||||
$$ = $7
|
||||
@@ -988,13 +985,11 @@ statement:
|
||||
case *stmt.Foreach :
|
||||
n.Expr = $3
|
||||
n.Key = $5
|
||||
n.ByRef = $7.byRef
|
||||
n.Variable = $7.node
|
||||
n.Variable = $7
|
||||
case *stmt.AltForeach :
|
||||
n.Expr = $3
|
||||
n.Key = $5
|
||||
n.ByRef = $7.byRef
|
||||
n.Variable = $7.node
|
||||
n.Variable = $7
|
||||
}
|
||||
|
||||
$$ = $9
|
||||
@@ -1339,41 +1334,41 @@ implements_list:
|
||||
|
||||
foreach_variable:
|
||||
variable
|
||||
{ $$ = foreachVariable{$1, false} }
|
||||
{
|
||||
$$ = $1
|
||||
}
|
||||
| '&' variable
|
||||
{
|
||||
$$ = foreachVariable{$2, true}
|
||||
$$ = expr.NewReference($2)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition($2, yylex.(*Parser).positionBuilder.NewTokenNodePosition($1, $2))
|
||||
|
||||
// save comments
|
||||
yylex.(*Parser).comments.AddFromToken($2, $1, comment.AmpersandToken)
|
||||
yylex.(*Parser).comments.AddFromToken($$, $1, comment.AmpersandToken)
|
||||
}
|
||||
| T_LIST '(' array_pair_list ')'
|
||||
{
|
||||
list := expr.NewList($3)
|
||||
$$ = foreachVariable{list, false}
|
||||
$$ = expr.NewList($3)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition(list, yylex.(*Parser).positionBuilder.NewTokensPosition($1, $4))
|
||||
yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokensPosition($1, $4))
|
||||
|
||||
// save comments
|
||||
yylex.(*Parser).comments.AddFromToken(list, $1, comment.ListToken)
|
||||
yylex.(*Parser).comments.AddFromToken(list, $2, comment.OpenParenthesisToken)
|
||||
yylex.(*Parser).comments.AddFromToken(list, $4, comment.CloseParenthesisToken)
|
||||
yylex.(*Parser).comments.AddFromToken($$, $1, comment.ListToken)
|
||||
yylex.(*Parser).comments.AddFromToken($$, $2, comment.OpenParenthesisToken)
|
||||
yylex.(*Parser).comments.AddFromToken($$, $4, comment.CloseParenthesisToken)
|
||||
}
|
||||
| '[' array_pair_list ']'
|
||||
{
|
||||
list := expr.NewShortList($2)
|
||||
$$ = foreachVariable{list, false}
|
||||
$$ = expr.NewShortList($2)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition(list, yylex.(*Parser).positionBuilder.NewTokensPosition($1, $3))
|
||||
yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokensPosition($1, $3))
|
||||
|
||||
// save comments
|
||||
yylex.(*Parser).comments.AddFromToken(list, $1, comment.OpenSquareBracket)
|
||||
yylex.(*Parser).comments.AddFromToken(list, $3, comment.CloseSquareBracket)
|
||||
yylex.(*Parser).comments.AddFromToken($$, $1, comment.OpenSquareBracket)
|
||||
yylex.(*Parser).comments.AddFromToken($$, $3, comment.CloseSquareBracket)
|
||||
}
|
||||
;
|
||||
|
||||
@@ -1404,7 +1399,7 @@ for_statement:
|
||||
foreach_statement:
|
||||
statement
|
||||
{
|
||||
$$ = stmt.NewForeach(nil, nil, nil, $1, false)
|
||||
$$ = stmt.NewForeach(nil, nil, nil, $1)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewNodePosition($1))
|
||||
@@ -1412,7 +1407,7 @@ foreach_statement:
|
||||
| ':' inner_statement_list T_ENDFOREACH ';'
|
||||
{
|
||||
stmtList := stmt.NewStmtList($2)
|
||||
$$ = stmt.NewAltForeach(nil, nil, nil, stmtList, false)
|
||||
$$ = stmt.NewAltForeach(nil, nil, nil, stmtList)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition(stmtList, yylex.(*Parser).positionBuilder.NewNodeListPosition($2))
|
||||
@@ -3273,7 +3268,7 @@ lexical_var:
|
||||
{
|
||||
identifier := node.NewIdentifier(strings.TrimLeft($1.Value, "$"))
|
||||
variable := expr.NewVariable(identifier)
|
||||
$$ = expr.NewClosureUse(variable, false)
|
||||
$$ = expr.NewClosureUse(variable)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition(identifier, yylex.(*Parser).positionBuilder.NewTokenPosition($1))
|
||||
@@ -3287,7 +3282,8 @@ lexical_var:
|
||||
{
|
||||
identifier := node.NewIdentifier(strings.TrimLeft($2.Value, "$"))
|
||||
variable := expr.NewVariable(identifier)
|
||||
$$ = expr.NewClosureUse(variable, true)
|
||||
reference := expr.NewReference(variable)
|
||||
$$ = expr.NewClosureUse(reference)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition(identifier, yylex.(*Parser).positionBuilder.NewTokenPosition($2))
|
||||
@@ -3296,7 +3292,7 @@ lexical_var:
|
||||
|
||||
// save comments
|
||||
yylex.(*Parser).comments.AddFromToken($$, $1, comment.AmpersandToken)
|
||||
yylex.(*Parser).comments.AddFromToken(variable, $2, comment.VariableToken)
|
||||
yylex.(*Parser).comments.AddFromToken(reference, $2, comment.VariableToken)
|
||||
}
|
||||
;
|
||||
|
||||
@@ -3915,7 +3911,7 @@ non_empty_array_pair_list:
|
||||
array_pair:
|
||||
expr T_DOUBLE_ARROW expr
|
||||
{
|
||||
$$ = expr.NewArrayItem($1, $3, false)
|
||||
$$ = expr.NewArrayItem($1, $3)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewNodesPosition($1, $3))
|
||||
@@ -3925,37 +3921,39 @@ array_pair:
|
||||
}
|
||||
| expr
|
||||
{
|
||||
$$ = expr.NewArrayItem(nil, $1, false)
|
||||
$$ = expr.NewArrayItem(nil, $1)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewNodePosition($1))
|
||||
}
|
||||
| expr T_DOUBLE_ARROW '&' variable
|
||||
{
|
||||
$$ = expr.NewArrayItem($1, $4, true)
|
||||
reference := expr.NewReference($4)
|
||||
$$ = expr.NewArrayItem($1, reference)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewNodesPosition($1, $4))
|
||||
|
||||
// save comments
|
||||
yylex.(*Parser).comments.AddFromToken($$, $2, comment.DoubleArrowToken)
|
||||
yylex.(*Parser).comments.AddFromToken($$, $3, comment.AmpersandToken)
|
||||
yylex.(*Parser).comments.AddFromToken(reference, $3, comment.AmpersandToken)
|
||||
}
|
||||
| '&' variable
|
||||
{
|
||||
$$ = expr.NewArrayItem(nil, $2, true)
|
||||
reference := expr.NewReference($2)
|
||||
$$ = expr.NewArrayItem(nil, reference)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokenNodePosition($1, $2))
|
||||
|
||||
// save comments
|
||||
yylex.(*Parser).comments.AddFromToken($$, $1, comment.AmpersandToken)
|
||||
yylex.(*Parser).comments.AddFromToken(reference, $1, comment.AmpersandToken)
|
||||
}
|
||||
| expr T_DOUBLE_ARROW T_LIST '(' array_pair_list ')'
|
||||
{
|
||||
// TODO: Cannot use list() as standalone expression
|
||||
list := expr.NewList($5)
|
||||
$$ = expr.NewArrayItem($1, list, false)
|
||||
$$ = expr.NewArrayItem($1, list)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition(list, yylex.(*Parser).positionBuilder.NewTokensPosition($3, $6))
|
||||
@@ -3971,7 +3969,7 @@ array_pair:
|
||||
{
|
||||
// TODO: Cannot use list() as standalone expression
|
||||
list := expr.NewList($3)
|
||||
$$ = expr.NewArrayItem(nil, list, false)
|
||||
$$ = expr.NewArrayItem(nil, list)
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition(list, yylex.(*Parser).positionBuilder.NewTokensPosition($1, $4))
|
||||
@@ -4279,8 +4277,3 @@ isset_variable:
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
%%
|
||||
|
||||
type foreachVariable struct {
|
||||
node node.Node
|
||||
byRef bool
|
||||
}
|
||||
|
||||
@@ -1155,35 +1155,32 @@ func TestPhp7(t *testing.T) {
|
||||
Stmt: &stmt.StmtList{Stmts: []node.Node{}},
|
||||
},
|
||||
&stmt.Foreach{
|
||||
ByRef: true,
|
||||
Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
Key: &expr.Variable{VarName: &node.Identifier{Value: "k"}},
|
||||
Variable: &expr.Variable{VarName: &node.Identifier{Value: "v"}},
|
||||
Stmt: &stmt.StmtList{Stmts: []node.Node{}},
|
||||
Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
Key: &expr.Variable{VarName: &node.Identifier{Value: "k"}},
|
||||
Variable: &expr.Reference{
|
||||
Variable: &expr.Variable{VarName: &node.Identifier{Value: "v"}},
|
||||
},
|
||||
Stmt: &stmt.StmtList{Stmts: []node.Node{}},
|
||||
},
|
||||
&stmt.Foreach{
|
||||
ByRef: false,
|
||||
Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
Key: &expr.Variable{VarName: &node.Identifier{Value: "k"}},
|
||||
Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
Key: &expr.Variable{VarName: &node.Identifier{Value: "k"}},
|
||||
Variable: &expr.List{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "v"}},
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "v"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
Stmt: &stmt.StmtList{Stmts: []node.Node{}},
|
||||
},
|
||||
&stmt.Foreach{
|
||||
ByRef: false,
|
||||
Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
Key: &expr.Variable{VarName: &node.Identifier{Value: "k"}},
|
||||
Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
Key: &expr.Variable{VarName: &node.Identifier{Value: "k"}},
|
||||
Variable: &expr.ShortList{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "v"}},
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "v"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -2062,8 +2059,7 @@ func TestPhp7(t *testing.T) {
|
||||
Expr: &expr.Array{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &scalar.Lnumber{Value: "1"},
|
||||
Val: &scalar.Lnumber{Value: "1"},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -2072,13 +2068,11 @@ func TestPhp7(t *testing.T) {
|
||||
Expr: &expr.Array{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Key: &scalar.Lnumber{Value: "1"},
|
||||
Val: &scalar.Lnumber{Value: "1"},
|
||||
Key: &scalar.Lnumber{Value: "1"},
|
||||
Val: &scalar.Lnumber{Value: "1"},
|
||||
},
|
||||
&expr.ArrayItem{
|
||||
ByRef: true,
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "b"}},
|
||||
Val: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "b"}}},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -2147,12 +2141,10 @@ func TestPhp7(t *testing.T) {
|
||||
},
|
||||
Uses: []node.Node{
|
||||
&expr.ClosureUse{
|
||||
ByRef: false,
|
||||
Variable: &expr.Variable{VarName: &node.Identifier{Value: "c"}},
|
||||
},
|
||||
&expr.ClosureUse{
|
||||
ByRef: true,
|
||||
Variable: &expr.Variable{VarName: &node.Identifier{Value: "d"}},
|
||||
Variable: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "d"}}},
|
||||
},
|
||||
},
|
||||
Stmts: []node.Node{},
|
||||
@@ -2339,8 +2331,7 @@ func TestPhp7(t *testing.T) {
|
||||
Variable: &expr.List{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -2352,7 +2343,6 @@ func TestPhp7(t *testing.T) {
|
||||
Variable: &expr.List{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &expr.ArrayDimFetch{
|
||||
Variable: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
},
|
||||
@@ -2367,12 +2357,10 @@ func TestPhp7(t *testing.T) {
|
||||
Variable: &expr.List{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &expr.List{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -2478,8 +2466,7 @@ func TestPhp7(t *testing.T) {
|
||||
Expr: &expr.ShortArray{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &scalar.Lnumber{Value: "1"},
|
||||
Val: &scalar.Lnumber{Value: "1"},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -2488,13 +2475,11 @@ func TestPhp7(t *testing.T) {
|
||||
Expr: &expr.ShortArray{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Key: &scalar.Lnumber{Value: "1"},
|
||||
Val: &scalar.Lnumber{Value: "1"},
|
||||
Key: &scalar.Lnumber{Value: "1"},
|
||||
Val: &scalar.Lnumber{Value: "1"},
|
||||
},
|
||||
&expr.ArrayItem{
|
||||
ByRef: true,
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "b"}},
|
||||
Val: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "b"}}},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -2504,8 +2489,7 @@ func TestPhp7(t *testing.T) {
|
||||
Variable: &expr.ShortList{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -2517,7 +2501,6 @@ func TestPhp7(t *testing.T) {
|
||||
Variable: &expr.ShortList{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &expr.ArrayDimFetch{
|
||||
Variable: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
},
|
||||
@@ -2532,12 +2515,10 @@ func TestPhp7(t *testing.T) {
|
||||
Variable: &expr.ShortList{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &expr.List{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -3133,8 +3114,7 @@ func TestPhp7(t *testing.T) {
|
||||
Variable: &expr.ShortArray{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "foo"}},
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "foo"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -3169,8 +3149,7 @@ func TestPhp7(t *testing.T) {
|
||||
Variable: &expr.ShortArray{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &scalar.Lnumber{Value: "1"},
|
||||
Val: &scalar.Lnumber{Value: "1"},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -3227,18 +3206,15 @@ func TestPhp7(t *testing.T) {
|
||||
Expr: &expr.ShortArray{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: true,
|
||||
Key: &scalar.Lnumber{Value: "1"},
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
|
||||
Key: &scalar.Lnumber{Value: "1"},
|
||||
Val: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "a"}}},
|
||||
},
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Key: &scalar.Lnumber{Value: "2"},
|
||||
Key: &scalar.Lnumber{Value: "2"},
|
||||
Val: &expr.List{
|
||||
Items: []node.Node{
|
||||
&expr.ArrayItem{
|
||||
ByRef: false,
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "b"}},
|
||||
Val: &expr.Variable{VarName: &node.Identifier{Value: "b"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user