[refactoring] parameters: new node structure
This commit is contained in:
@@ -849,7 +849,7 @@ func TestPhp5ArgumentNode(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestPhp5ParameterNode(t *testing.T) {
|
||||
src := `<?
|
||||
src := `<?
|
||||
function foo(bar $bar=null, baz &...$baz) {}
|
||||
class foo {public function foo(bar $bar=null, baz &...$baz) {}}
|
||||
function(bar $bar=null, baz &...$baz) {};
|
||||
@@ -861,8 +861,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 5,
|
||||
StartPos: 6,
|
||||
EndPos: 211,
|
||||
StartPos: 5,
|
||||
EndPos: 210,
|
||||
},
|
||||
},
|
||||
Stmts: []ast.Vertex{
|
||||
@@ -871,18 +871,17 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 6,
|
||||
EndPos: 50,
|
||||
StartPos: 5,
|
||||
EndPos: 49,
|
||||
},
|
||||
},
|
||||
ReturnsRef: false,
|
||||
FunctionName: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 15,
|
||||
EndPos: 18,
|
||||
StartPos: 14,
|
||||
EndPos: 17,
|
||||
},
|
||||
},
|
||||
Value: []byte("foo"),
|
||||
@@ -893,19 +892,17 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 19,
|
||||
EndPos: 32,
|
||||
StartPos: 18,
|
||||
EndPos: 31,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Type: &ast.NameName{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 19,
|
||||
EndPos: 22,
|
||||
StartPos: 18,
|
||||
EndPos: 21,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -914,8 +911,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 19,
|
||||
EndPos: 22,
|
||||
StartPos: 18,
|
||||
EndPos: 21,
|
||||
},
|
||||
},
|
||||
Value: []byte("bar"),
|
||||
@@ -927,8 +924,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 23,
|
||||
EndPos: 27,
|
||||
StartPos: 22,
|
||||
EndPos: 26,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
@@ -936,8 +933,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 23,
|
||||
EndPos: 27,
|
||||
StartPos: 22,
|
||||
EndPos: 26,
|
||||
},
|
||||
},
|
||||
Value: []byte("$bar"),
|
||||
@@ -948,8 +945,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 28,
|
||||
EndPos: 32,
|
||||
StartPos: 27,
|
||||
EndPos: 31,
|
||||
},
|
||||
},
|
||||
Const: &ast.NameName{
|
||||
@@ -957,8 +954,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 28,
|
||||
EndPos: 32,
|
||||
StartPos: 27,
|
||||
EndPos: 31,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -967,8 +964,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 28,
|
||||
EndPos: 32,
|
||||
StartPos: 27,
|
||||
EndPos: 31,
|
||||
},
|
||||
},
|
||||
Value: []byte("null"),
|
||||
@@ -982,19 +979,17 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 34,
|
||||
EndPos: 46,
|
||||
StartPos: 33,
|
||||
EndPos: 45,
|
||||
},
|
||||
},
|
||||
ByRef: true,
|
||||
Variadic: true,
|
||||
Type: &ast.NameName{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 34,
|
||||
EndPos: 37,
|
||||
StartPos: 33,
|
||||
EndPos: 36,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1003,46 +998,67 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 34,
|
||||
EndPos: 37,
|
||||
StartPos: 33,
|
||||
EndPos: 36,
|
||||
},
|
||||
},
|
||||
Value: []byte("baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Var: &ast.Reference{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 42,
|
||||
EndPos: 46,
|
||||
StartPos: 37,
|
||||
EndPos: 45,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Var: &ast.Variadic{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 42,
|
||||
EndPos: 46,
|
||||
StartPos: 38,
|
||||
EndPos: 45,
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 41,
|
||||
EndPos: 45,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 41,
|
||||
EndPos: 45,
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Stmts: []ast.Vertex{},
|
||||
Stmts: []ast.Vertex{
|
||||
},
|
||||
},
|
||||
&ast.StmtClass{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 53,
|
||||
EndPos: 116,
|
||||
StartPos: 52,
|
||||
EndPos: 115,
|
||||
},
|
||||
},
|
||||
ClassName: &ast.Identifier{
|
||||
@@ -1050,8 +1066,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 59,
|
||||
EndPos: 62,
|
||||
StartPos: 58,
|
||||
EndPos: 61,
|
||||
},
|
||||
},
|
||||
Value: []byte("foo"),
|
||||
@@ -1062,18 +1078,17 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 64,
|
||||
EndPos: 115,
|
||||
StartPos: 63,
|
||||
EndPos: 114,
|
||||
},
|
||||
},
|
||||
ReturnsRef: false,
|
||||
MethodName: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 80,
|
||||
EndPos: 83,
|
||||
StartPos: 79,
|
||||
EndPos: 82,
|
||||
},
|
||||
},
|
||||
Value: []byte("foo"),
|
||||
@@ -1084,8 +1099,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 64,
|
||||
EndPos: 70,
|
||||
StartPos: 63,
|
||||
EndPos: 69,
|
||||
},
|
||||
},
|
||||
Value: []byte("public"),
|
||||
@@ -1097,19 +1112,17 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 84,
|
||||
EndPos: 97,
|
||||
StartPos: 83,
|
||||
EndPos: 96,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Type: &ast.NameName{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 84,
|
||||
EndPos: 87,
|
||||
StartPos: 83,
|
||||
EndPos: 86,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1118,8 +1131,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 84,
|
||||
EndPos: 87,
|
||||
StartPos: 83,
|
||||
EndPos: 86,
|
||||
},
|
||||
},
|
||||
Value: []byte("bar"),
|
||||
@@ -1131,8 +1144,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 88,
|
||||
EndPos: 92,
|
||||
StartPos: 87,
|
||||
EndPos: 91,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
@@ -1140,8 +1153,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 88,
|
||||
EndPos: 92,
|
||||
StartPos: 87,
|
||||
EndPos: 91,
|
||||
},
|
||||
},
|
||||
Value: []byte("$bar"),
|
||||
@@ -1152,8 +1165,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 93,
|
||||
EndPos: 97,
|
||||
StartPos: 92,
|
||||
EndPos: 96,
|
||||
},
|
||||
},
|
||||
Const: &ast.NameName{
|
||||
@@ -1161,8 +1174,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 93,
|
||||
EndPos: 97,
|
||||
StartPos: 92,
|
||||
EndPos: 96,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1171,8 +1184,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 93,
|
||||
EndPos: 97,
|
||||
StartPos: 92,
|
||||
EndPos: 96,
|
||||
},
|
||||
},
|
||||
Value: []byte("null"),
|
||||
@@ -1186,19 +1199,17 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 99,
|
||||
EndPos: 111,
|
||||
StartPos: 98,
|
||||
EndPos: 110,
|
||||
},
|
||||
},
|
||||
ByRef: true,
|
||||
Variadic: true,
|
||||
Type: &ast.NameName{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 99,
|
||||
EndPos: 102,
|
||||
StartPos: 98,
|
||||
EndPos: 101,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1207,33 +1218,53 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 99,
|
||||
EndPos: 102,
|
||||
StartPos: 98,
|
||||
EndPos: 101,
|
||||
},
|
||||
},
|
||||
Value: []byte("baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Var: &ast.Reference{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 107,
|
||||
EndPos: 111,
|
||||
StartPos: 102,
|
||||
EndPos: 110,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Var: &ast.Variadic{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 107,
|
||||
EndPos: 111,
|
||||
StartPos: 103,
|
||||
EndPos: 110,
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 106,
|
||||
EndPos: 110,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 106,
|
||||
EndPos: 110,
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -1243,11 +1274,12 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 113,
|
||||
EndPos: 115,
|
||||
StartPos: 112,
|
||||
EndPos: 114,
|
||||
},
|
||||
},
|
||||
Stmts: []ast.Vertex{},
|
||||
Stmts: []ast.Vertex{
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -1257,8 +1289,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 119,
|
||||
EndPos: 160,
|
||||
StartPos: 118,
|
||||
EndPos: 159,
|
||||
},
|
||||
},
|
||||
Expr: &ast.ExprClosure{
|
||||
@@ -1266,31 +1298,27 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 119,
|
||||
EndPos: 159,
|
||||
StartPos: 118,
|
||||
EndPos: 158,
|
||||
},
|
||||
},
|
||||
ReturnsRef: false,
|
||||
Static: false,
|
||||
Params: []ast.Vertex{
|
||||
&ast.Parameter{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 128,
|
||||
EndPos: 141,
|
||||
StartPos: 127,
|
||||
EndPos: 140,
|
||||
},
|
||||
},
|
||||
Variadic: false,
|
||||
ByRef: false,
|
||||
Type: &ast.NameName{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 128,
|
||||
EndPos: 131,
|
||||
StartPos: 127,
|
||||
EndPos: 130,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1299,8 +1327,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 128,
|
||||
EndPos: 131,
|
||||
StartPos: 127,
|
||||
EndPos: 130,
|
||||
},
|
||||
},
|
||||
Value: []byte("bar"),
|
||||
@@ -1312,8 +1340,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 132,
|
||||
EndPos: 136,
|
||||
StartPos: 131,
|
||||
EndPos: 135,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
@@ -1321,8 +1349,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 132,
|
||||
EndPos: 136,
|
||||
StartPos: 131,
|
||||
EndPos: 135,
|
||||
},
|
||||
},
|
||||
Value: []byte("$bar"),
|
||||
@@ -1333,8 +1361,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 137,
|
||||
EndPos: 141,
|
||||
StartPos: 136,
|
||||
EndPos: 140,
|
||||
},
|
||||
},
|
||||
Const: &ast.NameName{
|
||||
@@ -1342,8 +1370,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 137,
|
||||
EndPos: 141,
|
||||
StartPos: 136,
|
||||
EndPos: 140,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1352,8 +1380,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 137,
|
||||
EndPos: 141,
|
||||
StartPos: 136,
|
||||
EndPos: 140,
|
||||
},
|
||||
},
|
||||
Value: []byte("null"),
|
||||
@@ -1367,19 +1395,17 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 143,
|
||||
EndPos: 155,
|
||||
StartPos: 142,
|
||||
EndPos: 154,
|
||||
},
|
||||
},
|
||||
ByRef: true,
|
||||
Variadic: true,
|
||||
Type: &ast.NameName{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 143,
|
||||
EndPos: 146,
|
||||
StartPos: 142,
|
||||
EndPos: 145,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1388,38 +1414,59 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 143,
|
||||
EndPos: 146,
|
||||
StartPos: 142,
|
||||
EndPos: 145,
|
||||
},
|
||||
},
|
||||
Value: []byte("baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Var: &ast.Reference{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 151,
|
||||
EndPos: 155,
|
||||
StartPos: 146,
|
||||
EndPos: 154,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Var: &ast.Variadic{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 151,
|
||||
EndPos: 155,
|
||||
StartPos: 147,
|
||||
EndPos: 154,
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 150,
|
||||
EndPos: 154,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 150,
|
||||
EndPos: 154,
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Stmts: []ast.Vertex{},
|
||||
Stmts: []ast.Vertex{
|
||||
},
|
||||
},
|
||||
},
|
||||
&ast.StmtExpression{
|
||||
@@ -1427,8 +1474,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 163,
|
||||
EndPos: 211,
|
||||
StartPos: 162,
|
||||
EndPos: 210,
|
||||
},
|
||||
},
|
||||
Expr: &ast.ExprClosure{
|
||||
@@ -1436,31 +1483,28 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 163,
|
||||
EndPos: 210,
|
||||
StartPos: 162,
|
||||
EndPos: 209,
|
||||
},
|
||||
},
|
||||
ReturnsRef: false,
|
||||
Static: true,
|
||||
Static: true,
|
||||
Params: []ast.Vertex{
|
||||
&ast.Parameter{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 179,
|
||||
EndPos: 192,
|
||||
StartPos: 178,
|
||||
EndPos: 191,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Type: &ast.NameName{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 179,
|
||||
EndPos: 182,
|
||||
StartPos: 178,
|
||||
EndPos: 181,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1469,8 +1513,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 179,
|
||||
EndPos: 182,
|
||||
StartPos: 178,
|
||||
EndPos: 181,
|
||||
},
|
||||
},
|
||||
Value: []byte("bar"),
|
||||
@@ -1482,8 +1526,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 183,
|
||||
EndPos: 187,
|
||||
StartPos: 182,
|
||||
EndPos: 186,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
@@ -1491,8 +1535,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 183,
|
||||
EndPos: 187,
|
||||
StartPos: 182,
|
||||
EndPos: 186,
|
||||
},
|
||||
},
|
||||
Value: []byte("$bar"),
|
||||
@@ -1503,8 +1547,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 188,
|
||||
EndPos: 192,
|
||||
StartPos: 187,
|
||||
EndPos: 191,
|
||||
},
|
||||
},
|
||||
Const: &ast.NameName{
|
||||
@@ -1512,8 +1556,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 188,
|
||||
EndPos: 192,
|
||||
StartPos: 187,
|
||||
EndPos: 191,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1522,8 +1566,8 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 188,
|
||||
EndPos: 192,
|
||||
StartPos: 187,
|
||||
EndPos: 191,
|
||||
},
|
||||
},
|
||||
Value: []byte("null"),
|
||||
@@ -1537,19 +1581,17 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 194,
|
||||
EndPos: 206,
|
||||
StartPos: 193,
|
||||
EndPos: 205,
|
||||
},
|
||||
},
|
||||
ByRef: true,
|
||||
Variadic: true,
|
||||
Type: &ast.NameName{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 194,
|
||||
EndPos: 197,
|
||||
StartPos: 193,
|
||||
EndPos: 196,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1558,43 +1600,65 @@ func TestPhp5ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 194,
|
||||
EndPos: 197,
|
||||
StartPos: 193,
|
||||
EndPos: 196,
|
||||
},
|
||||
},
|
||||
Value: []byte("baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Var: &ast.Reference{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 202,
|
||||
EndPos: 206,
|
||||
StartPos: 197,
|
||||
EndPos: 205,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Var: &ast.Variadic{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 202,
|
||||
EndPos: 206,
|
||||
StartPos: 198,
|
||||
EndPos: 205,
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 201,
|
||||
EndPos: 205,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 201,
|
||||
EndPos: 205,
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Stmts: []ast.Vertex{},
|
||||
Stmts: []ast.Vertex{
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
lexer := scanner.NewLexer([]byte(src), "5.6", false, nil)
|
||||
php5parser := php5.NewParser(lexer, nil)
|
||||
php5parser.Parse()
|
||||
@@ -6906,8 +6970,6 @@ func TestStmtFunction_ReturnVar(t *testing.T) {
|
||||
EndPos: 24,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Type: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
@@ -6950,8 +7012,6 @@ func TestStmtFunction_ReturnVar(t *testing.T) {
|
||||
EndPos: 37,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Type: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
@@ -13403,8 +13463,6 @@ func TestExprClosure_Use(t *testing.T) {
|
||||
EndPos: 14,
|
||||
},
|
||||
},
|
||||
Variadic: false,
|
||||
ByRef: false,
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
@@ -13436,8 +13494,6 @@ func TestExprClosure_Use(t *testing.T) {
|
||||
EndPos: 18,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
@@ -13581,8 +13637,6 @@ func TestExprClosure_Use2(t *testing.T) {
|
||||
EndPos: 14,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
@@ -13614,8 +13668,6 @@ func TestExprClosure_Use2(t *testing.T) {
|
||||
EndPos: 18,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
|
||||
852
internal/php5/php5.go
generated
852
internal/php5/php5.go
generated
File diff suppressed because it is too large
Load Diff
@@ -2283,12 +2283,27 @@ parameter:
|
||||
optional_class_type is_reference is_variadic T_VARIABLE
|
||||
{
|
||||
identifier := &ast.Identifier{ast.Node{}, $4.Value}
|
||||
variable := &ast.ExprVariable{ast.Node{}, identifier}
|
||||
$$ = &ast.Parameter{ast.Node{}, $2 != nil, $3 != nil, $1, variable, nil}
|
||||
|
||||
// save position
|
||||
identifier.GetNode().Position = position.NewTokenPosition($4)
|
||||
|
||||
var variable ast.Vertex
|
||||
variable = &ast.ExprVariable{ast.Node{}, identifier}
|
||||
variable.GetNode().Position = position.NewTokenPosition($4)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.Start, $4.Tokens)
|
||||
|
||||
if $3 != nil {
|
||||
variable = &ast.Variadic{ast.Node{}, variable}
|
||||
variable.GetNode().Position = position.NewTokensPosition($3, $4)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.Start, $3.Tokens)
|
||||
}
|
||||
|
||||
if $2 != nil {
|
||||
variable = &ast.Reference{ast.Node{}, variable}
|
||||
variable.GetNode().Position = position.NewTokensPosition($2, $4)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.Start, $2.Tokens)
|
||||
}
|
||||
|
||||
$$ = &ast.Parameter{ast.Node{}, $1, variable, nil}
|
||||
|
||||
if $1 != nil {
|
||||
$$.GetNode().Position = position.NewNodeTokenPosition($1, $4)
|
||||
} else if $2 != nil {
|
||||
@@ -2299,40 +2314,33 @@ parameter:
|
||||
$$.GetNode().Position = position.NewTokenPosition($4)
|
||||
}
|
||||
|
||||
// save comments
|
||||
if $1 != nil {
|
||||
yylex.(*Parser).MoveFreeFloating($1, $$)
|
||||
}
|
||||
if $2 != nil {
|
||||
yylex.(*Parser).setFreeFloating($$, token.OptionalType, $2.Tokens)
|
||||
}
|
||||
if $3 != nil {
|
||||
yylex.(*Parser).setFreeFloating($$, token.Ampersand, $3.Tokens)
|
||||
}
|
||||
yylex.(*Parser).setFreeFloating($$, token.Variadic, $4.Tokens)
|
||||
|
||||
// normalize
|
||||
if $3 == nil {
|
||||
yylex.(*Parser).setFreeFloatingTokens($$, token.Ampersand, $$.GetNode().Tokens[token.Variadic]); delete($$.GetNode().Tokens, token.Variadic)
|
||||
}
|
||||
if $2 == nil {
|
||||
yylex.(*Parser).setFreeFloatingTokens($$, token.OptionalType, $$.GetNode().Tokens[token.Ampersand]); delete($$.GetNode().Tokens, token.Ampersand)
|
||||
}
|
||||
if $1 == nil {
|
||||
yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $$.GetNode().Tokens[token.OptionalType]); delete($$.GetNode().Tokens, token.OptionalType)
|
||||
}
|
||||
|
||||
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
|
||||
}
|
||||
| optional_class_type is_reference is_variadic T_VARIABLE '=' static_scalar
|
||||
{
|
||||
identifier := &ast.Identifier{ast.Node{}, $4.Value}
|
||||
variable := &ast.ExprVariable{ast.Node{}, identifier}
|
||||
$$ = &ast.Parameter{ast.Node{}, $2 != nil, $3 != nil, $1, variable, $6}
|
||||
|
||||
// save position
|
||||
identifier.GetNode().Position = position.NewTokenPosition($4)
|
||||
|
||||
var variable ast.Vertex
|
||||
variable = &ast.ExprVariable{ast.Node{}, identifier}
|
||||
variable.GetNode().Position = position.NewTokenPosition($4)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.Start, $4.Tokens)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.End, $5.Tokens)
|
||||
|
||||
if $3 != nil {
|
||||
variable = &ast.Variadic{ast.Node{}, variable}
|
||||
variable.GetNode().Position = position.NewTokensPosition($3, $4)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.Start, $3.Tokens)
|
||||
}
|
||||
|
||||
if $2 != nil {
|
||||
variable = &ast.Reference{ast.Node{}, variable}
|
||||
variable.GetNode().Position = position.NewTokensPosition($2, $4)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.Start, $2.Tokens)
|
||||
}
|
||||
|
||||
$$ = &ast.Parameter{ast.Node{}, $1, variable, $6}
|
||||
|
||||
if $1 != nil {
|
||||
$$.GetNode().Position = position.NewNodesPosition($1, $6)
|
||||
} else if $2 != nil {
|
||||
@@ -2343,30 +2351,6 @@ parameter:
|
||||
$$.GetNode().Position = position.NewTokenNodePosition($4, $6)
|
||||
}
|
||||
|
||||
// save comments
|
||||
if $1 != nil {
|
||||
yylex.(*Parser).MoveFreeFloating($1, $$)
|
||||
}
|
||||
if $2 != nil {
|
||||
yylex.(*Parser).setFreeFloating($$, token.OptionalType, $2.Tokens)
|
||||
}
|
||||
if $3 != nil {
|
||||
yylex.(*Parser).setFreeFloating($$, token.Ampersand, $3.Tokens)
|
||||
}
|
||||
yylex.(*Parser).setFreeFloating($$, token.Variadic, $4.Tokens)
|
||||
yylex.(*Parser).setFreeFloating($$, token.Var, $5.Tokens)
|
||||
|
||||
// normalize
|
||||
if $3 == nil {
|
||||
yylex.(*Parser).setFreeFloatingTokens($$, token.Ampersand, $$.GetNode().Tokens[token.Variadic]); delete($$.GetNode().Tokens, token.Variadic)
|
||||
}
|
||||
if $2 == nil {
|
||||
yylex.(*Parser).setFreeFloatingTokens($$, token.OptionalType, $$.GetNode().Tokens[token.Ampersand]); delete($$.GetNode().Tokens, token.Ampersand)
|
||||
}
|
||||
if $1 == nil {
|
||||
yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $$.GetNode().Tokens[token.OptionalType]); delete($$.GetNode().Tokens, token.OptionalType)
|
||||
}
|
||||
|
||||
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
|
||||
}
|
||||
;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
381
internal/php5/test.php
Normal file
381
internal/php5/test.php
Normal file
@@ -0,0 +1,381 @@
|
||||
<?
|
||||
foo($a, ...$b);
|
||||
$foo($a, ...$b);
|
||||
$foo->bar($a, ...$b);
|
||||
foo::bar($a, ...$b);
|
||||
$foo::bar($a, ...$b);
|
||||
new foo($a, ...$b);
|
||||
|
||||
function foo(bar $bar=null, baz &...$baz) {}
|
||||
class foo {public function foo(bar $bar=null, baz &...$baz) {}}
|
||||
function(bar $bar=null, baz &...$baz) {};
|
||||
static function(bar $bar=null, baz &...$baz) {};
|
||||
|
||||
1234567890123456789;
|
||||
12345678901234567890;
|
||||
0.;
|
||||
0b0111111111111111111111111111111111111111111111111111111111111111;
|
||||
0b1111111111111111111111111111111111111111111111111111111111111111;
|
||||
0x007111111111111111;
|
||||
0x8111111111111111;
|
||||
__CLASS__;
|
||||
__DIR__;
|
||||
__FILE__;
|
||||
__FUNCTION__;
|
||||
__LINE__;
|
||||
__NAMESPACE__;
|
||||
__METHOD__;
|
||||
__TRAIT__;
|
||||
|
||||
"test $var";
|
||||
"test $var[1]";
|
||||
"test $var[1234567890123456789012345678901234567890]";
|
||||
"test $var[bar]";
|
||||
"test $var[$bar]";
|
||||
"$foo $bar";
|
||||
"test $foo->bar()";
|
||||
"test ${foo}";
|
||||
"test ${foo[0]}";
|
||||
"test {$foo->bar()}";
|
||||
|
||||
if ($a) :
|
||||
endif;
|
||||
if ($a) :
|
||||
elseif ($b):
|
||||
endif;
|
||||
if ($a) :
|
||||
else:
|
||||
endif;
|
||||
if ($a) :
|
||||
elseif ($b):
|
||||
elseif ($c):
|
||||
else:
|
||||
endif;
|
||||
|
||||
while (1) { break; }
|
||||
while (1) { break 2; }
|
||||
while (1) : break(3); endwhile;
|
||||
class foo{ const FOO = 1, BAR = 2; }
|
||||
class foo{ function bar() {} }
|
||||
class foo{ public static function &bar() {} }
|
||||
class foo{ final private function bar() {} protected function baz() {} }
|
||||
abstract class foo{ abstract public function bar(); }
|
||||
final class foo extends bar { }
|
||||
final class foo implements bar { }
|
||||
final class foo implements bar, baz { }
|
||||
|
||||
const FOO = 1, BAR = 2;
|
||||
while (1) { continue; }
|
||||
while (1) { continue 2; }
|
||||
while (1) { continue(3); }
|
||||
declare(ticks=1);
|
||||
declare(ticks=1, strict_types=1) {}
|
||||
declare(ticks=1): enddeclare;
|
||||
do {} while(1);
|
||||
echo $a, 1;
|
||||
echo($a);
|
||||
for($i = 0; $i < 10; $i++, $i++) {}
|
||||
for(; $i < 10; $i++) : endfor;
|
||||
foreach ($a as $v) {}
|
||||
foreach ([] as $v) {}
|
||||
foreach ($a as $v) : endforeach;
|
||||
foreach ($a as $k => $v) {}
|
||||
foreach ([] as $k => $v) {}
|
||||
foreach ($a as $k => &$v) {}
|
||||
foreach ($a as $k => list($v)) {}
|
||||
function foo() {}
|
||||
|
||||
function foo() {
|
||||
function bar() {}
|
||||
class Baz {}
|
||||
return $a;
|
||||
}
|
||||
|
||||
function foo(array $a, callable $b) {return;}
|
||||
function &foo() {return 1;}
|
||||
function &foo() {}
|
||||
global $a, $b, $$c, ${foo()};
|
||||
a:
|
||||
goto a;
|
||||
if ($a) {}
|
||||
if ($a) {} elseif ($b) {}
|
||||
if ($a) {} else {}
|
||||
if ($a) {} elseif ($b) {} elseif ($c) {} else {}
|
||||
if ($a) {} elseif ($b) {} else if ($c) {} else {}
|
||||
?> <div></div> <?
|
||||
interface Foo {}
|
||||
interface Foo extends Bar {}
|
||||
interface Foo extends Bar, Baz {}
|
||||
namespace Foo;
|
||||
namespace Foo\Bar {}
|
||||
namespace {}
|
||||
class foo {var $a;}
|
||||
class foo {public static $a, $b = 1;}
|
||||
class foo {public static $a = 1, $b;}
|
||||
static $a, $b = 1;
|
||||
static $a = 1, $b;
|
||||
|
||||
switch (1) :
|
||||
case 1:
|
||||
default:
|
||||
case 2:
|
||||
endswitch;
|
||||
|
||||
switch (1) :;
|
||||
case 1;
|
||||
case 2;
|
||||
endswitch;
|
||||
|
||||
switch (1) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
}
|
||||
|
||||
switch (1) {;
|
||||
case 1; break;
|
||||
case 2; break;
|
||||
}
|
||||
throw $e;
|
||||
trait Foo {}
|
||||
class Foo { use Bar; }
|
||||
class Foo { use Bar, Baz {} }
|
||||
class Foo { use Bar, Baz { one as public; } }
|
||||
class Foo { use Bar, Baz { one as public two; } }
|
||||
class Foo { use Bar, Baz { Bar::one insteadof Baz, Quux; Baz::one as two; } }
|
||||
|
||||
try {}
|
||||
try {} catch (Exception $e) {}
|
||||
try {} catch (Exception $e) {} catch (RuntimeException $e) {}
|
||||
try {} catch (Exception $e) {} catch (\RuntimeException $e) {} catch (namespace\AdditionException $e) {}
|
||||
try {} catch (Exception $e) {} finally {}
|
||||
|
||||
unset($a, $b);
|
||||
|
||||
use Foo;
|
||||
use \Foo;
|
||||
use \Foo as Bar;
|
||||
use Foo, Bar;
|
||||
use Foo, Bar as Baz;
|
||||
use function Foo, \Bar;
|
||||
use function Foo as foo, \Bar as bar;
|
||||
use const Foo, \Bar;
|
||||
use const Foo as foo, \Bar as bar;
|
||||
|
||||
$a[1];
|
||||
$a[1][2];
|
||||
array();
|
||||
array(1);
|
||||
array(1=>1, &$b,);
|
||||
array(3 =>&$b);
|
||||
array(&$b, 1=>1, 1, 3 =>&$b);
|
||||
~$a;
|
||||
!$a;
|
||||
|
||||
Foo::Bar;
|
||||
clone($a);
|
||||
clone $a;
|
||||
function(){};
|
||||
function($a, $b) use ($c, &$d) {};
|
||||
function($a, $b) use (&$c, $d) {};
|
||||
function() {};
|
||||
foo;
|
||||
namespace\foo;
|
||||
\foo;
|
||||
|
||||
empty($a);
|
||||
empty(Foo);
|
||||
@$a;
|
||||
eval($a);
|
||||
exit;
|
||||
exit($a);
|
||||
die();
|
||||
die($a);
|
||||
foo();
|
||||
namespace\foo(&$a);
|
||||
\foo([]);
|
||||
$foo(yield $a);
|
||||
|
||||
$a--;
|
||||
$a++;
|
||||
--$a;
|
||||
++$a;
|
||||
|
||||
include $a;
|
||||
include_once $a;
|
||||
require $a;
|
||||
require_once $a;
|
||||
|
||||
$a instanceof Foo;
|
||||
$a instanceof namespace\Foo;
|
||||
$a instanceof \Foo;
|
||||
|
||||
isset($a, $b);
|
||||
isset(Foo);
|
||||
list() = $b;
|
||||
list($a, $b) = $b;
|
||||
list($a[]) = $b;
|
||||
list(list($a)) = $b;
|
||||
|
||||
$a->foo();
|
||||
new Foo;
|
||||
new namespace\Foo();
|
||||
new \Foo();
|
||||
print($a);
|
||||
$a->foo;
|
||||
$a->foo[1];
|
||||
$a->foo->bar->baz()->quux[0];
|
||||
$a->foo()[1][1];
|
||||
`cmd $a`;
|
||||
`cmd`;
|
||||
``;
|
||||
[];
|
||||
[1];
|
||||
[1=>1, &$b,];
|
||||
|
||||
Foo::bar();
|
||||
namespace\Foo::bar();
|
||||
\Foo::bar();
|
||||
Foo::$bar();
|
||||
$foo::$bar();
|
||||
Foo::$bar;
|
||||
namespace\Foo::$bar;
|
||||
\Foo::$bar;
|
||||
$a ? $b : $c;
|
||||
$a ? : $c;
|
||||
$a ? $b ? $c : $d : $e;
|
||||
$a ? $b : $c ? $d : $e;
|
||||
-$a;
|
||||
+$a;
|
||||
$$a;
|
||||
$$$a;
|
||||
yield;
|
||||
yield $a;
|
||||
yield $a => $b;
|
||||
yield Foo::class;
|
||||
yield $a => Foo::class;
|
||||
|
||||
(array)$a;
|
||||
(boolean)$a;
|
||||
(bool)$a;
|
||||
(double)$a;
|
||||
(float)$a;
|
||||
(integer)$a;
|
||||
(int)$a;
|
||||
(object)$a;
|
||||
(string)$a;
|
||||
(unset)$a;
|
||||
|
||||
$a & $b;
|
||||
$a | $b;
|
||||
$a ^ $b;
|
||||
$a && $b;
|
||||
$a || $b;
|
||||
$a . $b;
|
||||
$a / $b;
|
||||
$a == $b;
|
||||
$a >= $b;
|
||||
$a > $b;
|
||||
$a === $b;
|
||||
$a and $b;
|
||||
$a or $b;
|
||||
$a xor $b;
|
||||
$a - $b;
|
||||
$a % $b;
|
||||
$a * $b;
|
||||
$a != $b;
|
||||
$a !== $b;
|
||||
$a + $b;
|
||||
$a ** $b;
|
||||
$a << $b;
|
||||
$a >> $b;
|
||||
$a <= $b;
|
||||
$a < $b;
|
||||
|
||||
$a =& $b;
|
||||
$a =& new Foo;
|
||||
$a =& new Foo($b);
|
||||
$a = $b;
|
||||
$a &= $b;
|
||||
$a |= $b;
|
||||
$a ^= $b;
|
||||
$a .= $b;
|
||||
$a /= $b;
|
||||
$a -= $b;
|
||||
$a %= $b;
|
||||
$a *= $b;
|
||||
$a += $b;
|
||||
$a **= $b;
|
||||
$a <<= $b;
|
||||
$a >>= $b;
|
||||
|
||||
|
||||
(new \Foo());
|
||||
(new \Foo())->bar()->baz;
|
||||
(new \Foo())[0][0];
|
||||
(new \Foo())[0]->bar();
|
||||
|
||||
array([0])[0][0];
|
||||
"foo"[0];
|
||||
foo[0];
|
||||
static::foo;
|
||||
|
||||
new $foo;
|
||||
new $foo::$bar;
|
||||
new $a->b[0];
|
||||
new $a->b{$b ?: null}->$c->d[0];static $a = [1][0];
|
||||
|
||||
static $a = !1;
|
||||
static $a = ~1;
|
||||
static $a = +1;
|
||||
static $a = -1;
|
||||
static $a = (1);
|
||||
static $a = 1 ?: 2;
|
||||
static $a = 1 ? 2 : 3;
|
||||
static $a = 1 & 2;
|
||||
static $a = 1 | 2;
|
||||
static $a = 1 ^ 2;
|
||||
static $a = 1 && 2;
|
||||
static $a = 1 || 2;
|
||||
static $a = 1 . 2;
|
||||
static $a = 1 / 2;
|
||||
static $a = 1 == 2;
|
||||
static $a = 1 >= 2;
|
||||
static $a = 1 > 2;
|
||||
static $a = 1 === 2;
|
||||
static $a = 1 and 2;
|
||||
static $a = 1 or 2;
|
||||
static $a = 1 xor 2;
|
||||
static $a = 1 - 2;
|
||||
static $a = 1 % 2;
|
||||
static $a = 1 * 2;
|
||||
static $a = 1 != 2;
|
||||
static $a = 1 !== 2;
|
||||
static $a = 1 + 2;
|
||||
static $a = 1 ** 2;
|
||||
static $a = 1 << 2;
|
||||
static $a = 1 >> 2;
|
||||
static $a = 1 <= 2;
|
||||
static $a = 1 < 2;
|
||||
static $a = Foo::bar;
|
||||
static $a = Foo::class;
|
||||
static $a = __CLASS__;
|
||||
static $a = Foo;
|
||||
static $a = namespace\Foo;
|
||||
static $a = \Foo;
|
||||
static $a = array();
|
||||
static $a = array(1 => 1, 2);
|
||||
static $a = [1, 2 => 2][0];
|
||||
|
||||
if (yield 1) {}
|
||||
Foo::$$bar;
|
||||
|
||||
$foo();
|
||||
$foo()[0][0];
|
||||
$a{$b};
|
||||
${$a};
|
||||
$foo::{$bar}();
|
||||
$foo::bar;
|
||||
|
||||
__halt_compiler();
|
||||
|
||||
parsing process must be terminated
|
||||
@@ -960,7 +960,7 @@ func TestPhp7ArgumentNode(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestPhp7ParameterNode(t *testing.T) {
|
||||
src := `<?
|
||||
src := `<?
|
||||
function foo(?bar $bar=null, baz &...$baz) {}
|
||||
class foo {public function foo(?bar $bar=null, baz &...$baz) {}}
|
||||
function(?bar $bar=null, baz &...$baz) {};
|
||||
@@ -972,8 +972,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 5,
|
||||
StartPos: 6,
|
||||
EndPos: 215,
|
||||
StartPos: 5,
|
||||
EndPos: 214,
|
||||
},
|
||||
},
|
||||
Stmts: []ast.Vertex{
|
||||
@@ -982,18 +982,17 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 6,
|
||||
EndPos: 51,
|
||||
StartPos: 5,
|
||||
EndPos: 50,
|
||||
},
|
||||
},
|
||||
ReturnsRef: false,
|
||||
FunctionName: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 15,
|
||||
EndPos: 18,
|
||||
StartPos: 14,
|
||||
EndPos: 17,
|
||||
},
|
||||
},
|
||||
Value: []byte("foo"),
|
||||
@@ -1004,19 +1003,17 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 19,
|
||||
EndPos: 33,
|
||||
StartPos: 18,
|
||||
EndPos: 32,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Type: &ast.Nullable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 19,
|
||||
EndPos: 23,
|
||||
StartPos: 18,
|
||||
EndPos: 22,
|
||||
},
|
||||
},
|
||||
Expr: &ast.NameName{
|
||||
@@ -1024,8 +1021,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 20,
|
||||
EndPos: 23,
|
||||
StartPos: 19,
|
||||
EndPos: 22,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1034,8 +1031,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 20,
|
||||
EndPos: 23,
|
||||
StartPos: 19,
|
||||
EndPos: 22,
|
||||
},
|
||||
},
|
||||
Value: []byte("bar"),
|
||||
@@ -1048,8 +1045,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 24,
|
||||
EndPos: 28,
|
||||
StartPos: 23,
|
||||
EndPos: 27,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
@@ -1057,8 +1054,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 24,
|
||||
EndPos: 28,
|
||||
StartPos: 23,
|
||||
EndPos: 27,
|
||||
},
|
||||
},
|
||||
Value: []byte("$bar"),
|
||||
@@ -1069,8 +1066,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 29,
|
||||
EndPos: 33,
|
||||
StartPos: 28,
|
||||
EndPos: 32,
|
||||
},
|
||||
},
|
||||
Const: &ast.NameName{
|
||||
@@ -1078,8 +1075,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 29,
|
||||
EndPos: 33,
|
||||
StartPos: 28,
|
||||
EndPos: 32,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1088,8 +1085,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 29,
|
||||
EndPos: 33,
|
||||
StartPos: 28,
|
||||
EndPos: 32,
|
||||
},
|
||||
},
|
||||
Value: []byte("null"),
|
||||
@@ -1103,19 +1100,17 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 35,
|
||||
EndPos: 47,
|
||||
StartPos: 34,
|
||||
EndPos: 46,
|
||||
},
|
||||
},
|
||||
ByRef: true,
|
||||
Variadic: true,
|
||||
Type: &ast.NameName{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 35,
|
||||
EndPos: 38,
|
||||
StartPos: 34,
|
||||
EndPos: 37,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1124,46 +1119,67 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 35,
|
||||
EndPos: 38,
|
||||
StartPos: 34,
|
||||
EndPos: 37,
|
||||
},
|
||||
},
|
||||
Value: []byte("baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Var: &ast.Reference{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 43,
|
||||
EndPos: 47,
|
||||
StartPos: 38,
|
||||
EndPos: 46,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Var: &ast.Variadic{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 43,
|
||||
EndPos: 47,
|
||||
StartPos: 39,
|
||||
EndPos: 46,
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 42,
|
||||
EndPos: 46,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 2,
|
||||
EndLine: 2,
|
||||
StartPos: 42,
|
||||
EndPos: 46,
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Stmts: []ast.Vertex{},
|
||||
Stmts: []ast.Vertex{
|
||||
},
|
||||
},
|
||||
&ast.StmtClass{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 54,
|
||||
EndPos: 118,
|
||||
StartPos: 53,
|
||||
EndPos: 117,
|
||||
},
|
||||
},
|
||||
ClassName: &ast.Identifier{
|
||||
@@ -1171,8 +1187,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 60,
|
||||
EndPos: 63,
|
||||
StartPos: 59,
|
||||
EndPos: 62,
|
||||
},
|
||||
},
|
||||
Value: []byte("foo"),
|
||||
@@ -1183,18 +1199,17 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 65,
|
||||
EndPos: 117,
|
||||
StartPos: 64,
|
||||
EndPos: 116,
|
||||
},
|
||||
},
|
||||
ReturnsRef: false,
|
||||
MethodName: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 81,
|
||||
EndPos: 84,
|
||||
StartPos: 80,
|
||||
EndPos: 83,
|
||||
},
|
||||
},
|
||||
Value: []byte("foo"),
|
||||
@@ -1205,8 +1220,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 65,
|
||||
EndPos: 71,
|
||||
StartPos: 64,
|
||||
EndPos: 70,
|
||||
},
|
||||
},
|
||||
Value: []byte("public"),
|
||||
@@ -1218,19 +1233,17 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 85,
|
||||
EndPos: 99,
|
||||
StartPos: 84,
|
||||
EndPos: 98,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Type: &ast.Nullable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 85,
|
||||
EndPos: 89,
|
||||
StartPos: 84,
|
||||
EndPos: 88,
|
||||
},
|
||||
},
|
||||
Expr: &ast.NameName{
|
||||
@@ -1238,8 +1251,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 86,
|
||||
EndPos: 89,
|
||||
StartPos: 85,
|
||||
EndPos: 88,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1248,8 +1261,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 86,
|
||||
EndPos: 89,
|
||||
StartPos: 85,
|
||||
EndPos: 88,
|
||||
},
|
||||
},
|
||||
Value: []byte("bar"),
|
||||
@@ -1262,8 +1275,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 90,
|
||||
EndPos: 94,
|
||||
StartPos: 89,
|
||||
EndPos: 93,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
@@ -1271,8 +1284,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 90,
|
||||
EndPos: 94,
|
||||
StartPos: 89,
|
||||
EndPos: 93,
|
||||
},
|
||||
},
|
||||
Value: []byte("$bar"),
|
||||
@@ -1283,8 +1296,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 95,
|
||||
EndPos: 99,
|
||||
StartPos: 94,
|
||||
EndPos: 98,
|
||||
},
|
||||
},
|
||||
Const: &ast.NameName{
|
||||
@@ -1292,8 +1305,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 95,
|
||||
EndPos: 99,
|
||||
StartPos: 94,
|
||||
EndPos: 98,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1302,8 +1315,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 95,
|
||||
EndPos: 99,
|
||||
StartPos: 94,
|
||||
EndPos: 98,
|
||||
},
|
||||
},
|
||||
Value: []byte("null"),
|
||||
@@ -1317,19 +1330,17 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 101,
|
||||
EndPos: 113,
|
||||
StartPos: 100,
|
||||
EndPos: 112,
|
||||
},
|
||||
},
|
||||
ByRef: true,
|
||||
Variadic: true,
|
||||
Type: &ast.NameName{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 101,
|
||||
EndPos: 104,
|
||||
StartPos: 100,
|
||||
EndPos: 103,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1338,33 +1349,53 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 101,
|
||||
EndPos: 104,
|
||||
StartPos: 100,
|
||||
EndPos: 103,
|
||||
},
|
||||
},
|
||||
Value: []byte("baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Var: &ast.Reference{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 109,
|
||||
EndPos: 113,
|
||||
StartPos: 104,
|
||||
EndPos: 112,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Var: &ast.Variadic{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 109,
|
||||
EndPos: 113,
|
||||
StartPos: 105,
|
||||
EndPos: 112,
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 108,
|
||||
EndPos: 112,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 108,
|
||||
EndPos: 112,
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -1374,11 +1405,12 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 3,
|
||||
EndLine: 3,
|
||||
StartPos: 115,
|
||||
EndPos: 117,
|
||||
StartPos: 114,
|
||||
EndPos: 116,
|
||||
},
|
||||
},
|
||||
Stmts: []ast.Vertex{},
|
||||
Stmts: []ast.Vertex{
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -1388,8 +1420,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 121,
|
||||
EndPos: 163,
|
||||
StartPos: 120,
|
||||
EndPos: 162,
|
||||
},
|
||||
},
|
||||
Expr: &ast.ExprClosure{
|
||||
@@ -1397,31 +1429,27 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 121,
|
||||
EndPos: 162,
|
||||
StartPos: 120,
|
||||
EndPos: 161,
|
||||
},
|
||||
},
|
||||
ReturnsRef: false,
|
||||
Static: false,
|
||||
Params: []ast.Vertex{
|
||||
&ast.Parameter{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 130,
|
||||
EndPos: 144,
|
||||
StartPos: 129,
|
||||
EndPos: 143,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Type: &ast.Nullable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 130,
|
||||
EndPos: 134,
|
||||
StartPos: 129,
|
||||
EndPos: 133,
|
||||
},
|
||||
},
|
||||
Expr: &ast.NameName{
|
||||
@@ -1429,8 +1457,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 131,
|
||||
EndPos: 134,
|
||||
StartPos: 130,
|
||||
EndPos: 133,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1439,8 +1467,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 131,
|
||||
EndPos: 134,
|
||||
StartPos: 130,
|
||||
EndPos: 133,
|
||||
},
|
||||
},
|
||||
Value: []byte("bar"),
|
||||
@@ -1453,8 +1481,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 135,
|
||||
EndPos: 139,
|
||||
StartPos: 134,
|
||||
EndPos: 138,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
@@ -1462,8 +1490,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 135,
|
||||
EndPos: 139,
|
||||
StartPos: 134,
|
||||
EndPos: 138,
|
||||
},
|
||||
},
|
||||
Value: []byte("$bar"),
|
||||
@@ -1474,8 +1502,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 140,
|
||||
EndPos: 144,
|
||||
StartPos: 139,
|
||||
EndPos: 143,
|
||||
},
|
||||
},
|
||||
Const: &ast.NameName{
|
||||
@@ -1483,8 +1511,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 140,
|
||||
EndPos: 144,
|
||||
StartPos: 139,
|
||||
EndPos: 143,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1493,8 +1521,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 140,
|
||||
EndPos: 144,
|
||||
StartPos: 139,
|
||||
EndPos: 143,
|
||||
},
|
||||
},
|
||||
Value: []byte("null"),
|
||||
@@ -1508,19 +1536,17 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 146,
|
||||
EndPos: 158,
|
||||
StartPos: 145,
|
||||
EndPos: 157,
|
||||
},
|
||||
},
|
||||
Variadic: true,
|
||||
ByRef: true,
|
||||
Type: &ast.NameName{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 146,
|
||||
EndPos: 149,
|
||||
StartPos: 145,
|
||||
EndPos: 148,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1529,38 +1555,59 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 146,
|
||||
EndPos: 149,
|
||||
StartPos: 145,
|
||||
EndPos: 148,
|
||||
},
|
||||
},
|
||||
Value: []byte("baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Var: &ast.Reference{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 154,
|
||||
EndPos: 158,
|
||||
StartPos: 149,
|
||||
EndPos: 157,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Var: &ast.Variadic{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 154,
|
||||
EndPos: 158,
|
||||
StartPos: 150,
|
||||
EndPos: 157,
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 153,
|
||||
EndPos: 157,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 4,
|
||||
EndLine: 4,
|
||||
StartPos: 153,
|
||||
EndPos: 157,
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Stmts: []ast.Vertex{},
|
||||
Stmts: []ast.Vertex{
|
||||
},
|
||||
},
|
||||
},
|
||||
&ast.StmtExpression{
|
||||
@@ -1568,8 +1615,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 166,
|
||||
EndPos: 215,
|
||||
StartPos: 165,
|
||||
EndPos: 214,
|
||||
},
|
||||
},
|
||||
Expr: &ast.ExprClosure{
|
||||
@@ -1577,31 +1624,28 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 166,
|
||||
EndPos: 214,
|
||||
StartPos: 165,
|
||||
EndPos: 213,
|
||||
},
|
||||
},
|
||||
Static: true,
|
||||
ReturnsRef: false,
|
||||
Static: true,
|
||||
Params: []ast.Vertex{
|
||||
&ast.Parameter{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 182,
|
||||
EndPos: 196,
|
||||
StartPos: 181,
|
||||
EndPos: 195,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Type: &ast.Nullable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 182,
|
||||
EndPos: 186,
|
||||
StartPos: 181,
|
||||
EndPos: 185,
|
||||
},
|
||||
},
|
||||
Expr: &ast.NameName{
|
||||
@@ -1609,8 +1653,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 183,
|
||||
EndPos: 186,
|
||||
StartPos: 182,
|
||||
EndPos: 185,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1619,8 +1663,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 183,
|
||||
EndPos: 186,
|
||||
StartPos: 182,
|
||||
EndPos: 185,
|
||||
},
|
||||
},
|
||||
Value: []byte("bar"),
|
||||
@@ -1633,8 +1677,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 187,
|
||||
EndPos: 191,
|
||||
StartPos: 186,
|
||||
EndPos: 190,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
@@ -1642,8 +1686,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 187,
|
||||
EndPos: 191,
|
||||
StartPos: 186,
|
||||
EndPos: 190,
|
||||
},
|
||||
},
|
||||
Value: []byte("$bar"),
|
||||
@@ -1654,8 +1698,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 192,
|
||||
EndPos: 196,
|
||||
StartPos: 191,
|
||||
EndPos: 195,
|
||||
},
|
||||
},
|
||||
Const: &ast.NameName{
|
||||
@@ -1663,8 +1707,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 192,
|
||||
EndPos: 196,
|
||||
StartPos: 191,
|
||||
EndPos: 195,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1673,8 +1717,8 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 192,
|
||||
EndPos: 196,
|
||||
StartPos: 191,
|
||||
EndPos: 195,
|
||||
},
|
||||
},
|
||||
Value: []byte("null"),
|
||||
@@ -1688,19 +1732,17 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 198,
|
||||
EndPos: 210,
|
||||
StartPos: 197,
|
||||
EndPos: 209,
|
||||
},
|
||||
},
|
||||
Variadic: true,
|
||||
ByRef: true,
|
||||
Type: &ast.NameName{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 198,
|
||||
EndPos: 201,
|
||||
StartPos: 197,
|
||||
EndPos: 200,
|
||||
},
|
||||
},
|
||||
Parts: []ast.Vertex{
|
||||
@@ -1709,43 +1751,65 @@ func TestPhp7ParameterNode(t *testing.T) {
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 198,
|
||||
EndPos: 201,
|
||||
StartPos: 197,
|
||||
EndPos: 200,
|
||||
},
|
||||
},
|
||||
Value: []byte("baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Var: &ast.Reference{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 206,
|
||||
EndPos: 210,
|
||||
StartPos: 201,
|
||||
EndPos: 209,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Var: &ast.Variadic{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 206,
|
||||
EndPos: 210,
|
||||
StartPos: 202,
|
||||
EndPos: 209,
|
||||
},
|
||||
},
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 205,
|
||||
EndPos: 209,
|
||||
},
|
||||
},
|
||||
VarName: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
StartLine: 5,
|
||||
EndLine: 5,
|
||||
StartPos: 205,
|
||||
EndPos: 209,
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
Value: []byte("$baz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Stmts: []ast.Vertex{},
|
||||
Stmts: []ast.Vertex{
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
lexer := scanner.NewLexer([]byte(src), "7.4", false, nil)
|
||||
php7parser := php7.NewParser(lexer, nil)
|
||||
php7parser.Parse()
|
||||
@@ -7497,8 +7561,6 @@ func TestStmtFunction_ReturnVar(t *testing.T) {
|
||||
EndPos: 24,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Type: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
@@ -7541,8 +7603,6 @@ func TestStmtFunction_ReturnVar(t *testing.T) {
|
||||
EndPos: 37,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Type: &ast.Identifier{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
@@ -15290,8 +15350,6 @@ func TestExprClosure_Use(t *testing.T) {
|
||||
EndPos: 14,
|
||||
},
|
||||
},
|
||||
Variadic: false,
|
||||
ByRef: false,
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
@@ -15323,8 +15381,6 @@ func TestExprClosure_Use(t *testing.T) {
|
||||
EndPos: 18,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
@@ -15468,8 +15524,6 @@ func TestExprClosure_Use2(t *testing.T) {
|
||||
EndPos: 14,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
@@ -15501,8 +15555,6 @@ func TestExprClosure_Use2(t *testing.T) {
|
||||
EndPos: 18,
|
||||
},
|
||||
},
|
||||
ByRef: false,
|
||||
Variadic: false,
|
||||
Var: &ast.ExprVariable{
|
||||
Node: ast.Node{
|
||||
Position: &position.Position{
|
||||
|
||||
654
internal/php7/php7.go
generated
654
internal/php7/php7.go
generated
File diff suppressed because it is too large
Load Diff
@@ -2139,12 +2139,27 @@ parameter:
|
||||
optional_type is_reference is_variadic T_VARIABLE
|
||||
{
|
||||
identifier := &ast.Identifier{ast.Node{}, $4.Value}
|
||||
variable := &ast.ExprVariable{ast.Node{}, identifier}
|
||||
$$ = &ast.Parameter{ast.Node{}, $2 != nil, $3 != nil, $1, variable, nil}
|
||||
|
||||
// save position
|
||||
identifier.GetNode().Position = position.NewTokenPosition($4)
|
||||
|
||||
var variable ast.Vertex
|
||||
variable = &ast.ExprVariable{ast.Node{}, identifier}
|
||||
variable.GetNode().Position = position.NewTokenPosition($4)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.Start, $4.Tokens)
|
||||
|
||||
if $3 != nil {
|
||||
variable = &ast.Variadic{ast.Node{}, variable}
|
||||
variable.GetNode().Position = position.NewTokensPosition($3, $4)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.Start, $3.Tokens)
|
||||
}
|
||||
|
||||
if $2 != nil {
|
||||
variable = &ast.Reference{ast.Node{}, variable}
|
||||
variable.GetNode().Position = position.NewTokensPosition($2, $4)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.Start, $2.Tokens)
|
||||
}
|
||||
|
||||
$$ = &ast.Parameter{ast.Node{}, $1, variable, nil}
|
||||
|
||||
if $1 != nil {
|
||||
$$.GetNode().Position = position.NewNodeTokenPosition($1, $4)
|
||||
} else if $2 != nil {
|
||||
@@ -2155,41 +2170,33 @@ parameter:
|
||||
$$.GetNode().Position = position.NewTokenPosition($4)
|
||||
}
|
||||
|
||||
// save comments
|
||||
if $1 != nil {
|
||||
yylex.(*Parser).MoveFreeFloating($1, $$)
|
||||
}
|
||||
if $2 != nil {
|
||||
yylex.(*Parser).setFreeFloating($$, token.OptionalType, $2.Tokens)
|
||||
}
|
||||
if $3 != nil {
|
||||
yylex.(*Parser).setFreeFloating($$, token.Ampersand, $3.Tokens)
|
||||
}
|
||||
yylex.(*Parser).setFreeFloating($$, token.Variadic, $4.Tokens)
|
||||
|
||||
|
||||
// normalize
|
||||
if $3 == nil {
|
||||
yylex.(*Parser).setFreeFloatingTokens($$, token.Ampersand, $$.GetNode().Tokens[token.Variadic]); delete($$.GetNode().Tokens, token.Variadic)
|
||||
}
|
||||
if $2 == nil {
|
||||
yylex.(*Parser).setFreeFloatingTokens($$, token.OptionalType, $$.GetNode().Tokens[token.Ampersand]); delete($$.GetNode().Tokens, token.Ampersand)
|
||||
}
|
||||
if $1 == nil {
|
||||
yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $$.GetNode().Tokens[token.OptionalType]); delete($$.GetNode().Tokens, token.OptionalType)
|
||||
}
|
||||
|
||||
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
|
||||
}
|
||||
| optional_type is_reference is_variadic T_VARIABLE '=' expr
|
||||
{
|
||||
identifier := &ast.Identifier{ast.Node{}, $4.Value}
|
||||
variable := &ast.ExprVariable{ast.Node{}, identifier}
|
||||
$$ = &ast.Parameter{ast.Node{}, $2 != nil, $3 != nil, $1, variable, $6}
|
||||
|
||||
// save position
|
||||
identifier.GetNode().Position = position.NewTokenPosition($4)
|
||||
|
||||
var variable ast.Vertex
|
||||
variable = &ast.ExprVariable{ast.Node{}, identifier}
|
||||
variable.GetNode().Position = position.NewTokenPosition($4)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.Start, $4.Tokens)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.End, $5.Tokens)
|
||||
|
||||
if $3 != nil {
|
||||
variable = &ast.Variadic{ast.Node{}, variable}
|
||||
variable.GetNode().Position = position.NewTokensPosition($3, $4)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.Start, $3.Tokens)
|
||||
}
|
||||
|
||||
if $2 != nil {
|
||||
variable = &ast.Reference{ast.Node{}, variable}
|
||||
variable.GetNode().Position = position.NewTokensPosition($2, $4)
|
||||
yylex.(*Parser).setFreeFloating(variable, token.Start, $2.Tokens)
|
||||
}
|
||||
|
||||
$$ = &ast.Parameter{ast.Node{}, $1, variable, $6}
|
||||
|
||||
if $1 != nil {
|
||||
$$.GetNode().Position = position.NewNodesPosition($1, $6)
|
||||
} else if $2 != nil {
|
||||
@@ -2200,31 +2207,6 @@ parameter:
|
||||
$$.GetNode().Position = position.NewTokenNodePosition($4, $6)
|
||||
}
|
||||
|
||||
// save comments
|
||||
if $1 != nil {
|
||||
yylex.(*Parser).MoveFreeFloating($1, $$)
|
||||
}
|
||||
if $2 != nil {
|
||||
yylex.(*Parser).setFreeFloating($$, token.OptionalType, $2.Tokens)
|
||||
}
|
||||
if $3 != nil {
|
||||
yylex.(*Parser).setFreeFloating($$, token.Ampersand, $3.Tokens)
|
||||
}
|
||||
yylex.(*Parser).setFreeFloating($$, token.Variadic, $4.Tokens)
|
||||
yylex.(*Parser).setFreeFloating($$, token.Var, $5.Tokens)
|
||||
|
||||
|
||||
// normalize
|
||||
if $3 == nil {
|
||||
yylex.(*Parser).setFreeFloatingTokens($$, token.Ampersand, $$.GetNode().Tokens[token.Variadic]); delete($$.GetNode().Tokens, token.Variadic)
|
||||
}
|
||||
if $2 == nil {
|
||||
yylex.(*Parser).setFreeFloatingTokens($$, token.OptionalType, $$.GetNode().Tokens[token.Ampersand]); delete($$.GetNode().Tokens, token.Ampersand)
|
||||
}
|
||||
if $1 == nil {
|
||||
yylex.(*Parser).setFreeFloatingTokens($$, token.Start, $$.GetNode().Tokens[token.OptionalType]); delete($$.GetNode().Tokens, token.OptionalType)
|
||||
}
|
||||
|
||||
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
|
||||
}
|
||||
;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
350
internal/php7/test.php
Normal file
350
internal/php7/test.php
Normal file
@@ -0,0 +1,350 @@
|
||||
<?
|
||||
foo($a, ...$b);
|
||||
$foo($a, ...$b);
|
||||
$foo->bar($a, ...$b);
|
||||
foo::bar($a, ...$b);
|
||||
$foo::bar($a, ...$b);
|
||||
new foo($a, ...$b);
|
||||
/** anonymous class */
|
||||
new class ($a, ...$b) {};
|
||||
new class {};
|
||||
new $foo;
|
||||
new $foo[1];
|
||||
new $foo{$bar};
|
||||
new $foo->bar;
|
||||
new $foo::$bar;
|
||||
new static::$bar;
|
||||
|
||||
function foo(?bar $bar=null, baz &...$baz) {}
|
||||
class foo {public function foo(?bar $bar=null, baz &...$baz) {}}
|
||||
function(?bar $bar=null, baz &...$baz) {};
|
||||
static function(?bar $bar=null, baz &...$baz) {};
|
||||
|
||||
1234567890123456789;
|
||||
12345678901234567890;
|
||||
0.;
|
||||
0b0111111111111111111111111111111111111111111111111111111111111111;
|
||||
0b1111111111111111111111111111111111111111111111111111111111111111;
|
||||
0x007111111111111111;
|
||||
0x8111111111111111;
|
||||
__CLASS__;
|
||||
__DIR__;
|
||||
__FILE__;
|
||||
__FUNCTION__;
|
||||
__LINE__;
|
||||
__NAMESPACE__;
|
||||
__METHOD__;
|
||||
__TRAIT__;
|
||||
|
||||
"test $var";
|
||||
"test $var[1]";
|
||||
"test $var[-1]";
|
||||
"test $var[1234567890123456789012345678901234567890]";
|
||||
"test $var[-1234567890123456789012345678901234567890]";
|
||||
"test $var[bar]";
|
||||
"test $var[$bar]";
|
||||
"$foo $bar";
|
||||
"test $foo->bar()";
|
||||
"test ${foo}";
|
||||
"test ${foo[0]}";
|
||||
"test ${$foo}";
|
||||
"test {$foo->bar()}";
|
||||
|
||||
if ($a) :
|
||||
endif;
|
||||
if ($a) :
|
||||
elseif ($b):
|
||||
endif;
|
||||
if ($a) :
|
||||
else:
|
||||
endif;
|
||||
if ($a) :
|
||||
elseif ($b):
|
||||
elseif ($c):
|
||||
else:
|
||||
endif;
|
||||
|
||||
while (1) { break; }
|
||||
while (1) { break 2; }
|
||||
while (1) : break(3); endwhile;
|
||||
class foo{ public const FOO = 1, BAR = 2; }
|
||||
class foo{ const FOO = 1, BAR = 2; }
|
||||
class foo{ function bar() {} }
|
||||
class foo{ public static function &bar() {} }
|
||||
class foo{ public static function &bar(): void {} }
|
||||
abstract class foo{ }
|
||||
final class foo extends bar { }
|
||||
final class foo implements bar { }
|
||||
final class foo implements bar, baz { }
|
||||
new class() extends foo implements bar, baz { };
|
||||
|
||||
const FOO = 1, BAR = 2;
|
||||
while (1) { continue; }
|
||||
while (1) { continue 2; }
|
||||
while (1) { continue(3); }
|
||||
declare(ticks=1);
|
||||
declare(ticks=1) {}
|
||||
declare(ticks=1): enddeclare;
|
||||
do {} while(1);
|
||||
echo $a, 1;
|
||||
echo($a);
|
||||
for($i = 0; $i < 10; $i++, $i++) {}
|
||||
for(; $i < 10; $i++, $i++) : endfor;
|
||||
foreach ($a as $v) {}
|
||||
foreach ($a as $v) : endforeach;
|
||||
foreach ($a as $k => $v) {}
|
||||
foreach ($a as $k => &$v) {}
|
||||
foreach ($a as $k => list($v)) {}
|
||||
foreach ($a as $k => [$v]) {}
|
||||
function foo() {}
|
||||
function foo() {return;}
|
||||
function &foo() {return 1;}
|
||||
function &foo(): void {}
|
||||
global $a, $b;
|
||||
a:
|
||||
goto a;
|
||||
if ($a) {}
|
||||
if ($a) {} elseif ($b) {}
|
||||
if ($a) {} else {}
|
||||
if ($a) {} elseif ($b) {} elseif ($c) {} else {}
|
||||
if ($a) {} elseif ($b) {} else if ($c) {} else {}
|
||||
?> <div></div> <?
|
||||
interface Foo {}
|
||||
interface Foo extends Bar {}
|
||||
interface Foo extends Bar, Baz {}
|
||||
namespace Foo;
|
||||
namespace Foo {}
|
||||
namespace {}
|
||||
class foo {var $a;}
|
||||
class foo {public static $a, $b = 1;}
|
||||
static $a, $b = 1;
|
||||
|
||||
switch (1) :
|
||||
case 1:
|
||||
default:
|
||||
case 2:
|
||||
endswitch;
|
||||
|
||||
switch (1) :;
|
||||
case 1;
|
||||
case 2;
|
||||
endswitch;
|
||||
|
||||
switch (1) {
|
||||
case 1: break;
|
||||
case 2: break;
|
||||
}
|
||||
|
||||
switch (1) {;
|
||||
case 1; break;
|
||||
case 2; break;
|
||||
}
|
||||
|
||||
throw $e;
|
||||
|
||||
trait Foo {}
|
||||
class Foo { use Bar; }
|
||||
class Foo { use Bar, Baz {} }
|
||||
class Foo { use Bar, Baz { one as include; } }
|
||||
class Foo { use Bar, Baz { one as public; } }
|
||||
class Foo { use Bar, Baz { one as public two; } }
|
||||
class Foo { use Bar, Baz { Bar::one insteadof Baz, Quux; Baz::one as two; } }
|
||||
|
||||
try {}
|
||||
try {} catch (Exception $e) {}
|
||||
try {} catch (Exception|RuntimeException $e) {}
|
||||
try {} catch (Exception $e) {} catch (RuntimeException $e) {}
|
||||
try {} catch (Exception $e) {} finally {}
|
||||
|
||||
unset($a, $b,);
|
||||
|
||||
use Foo;
|
||||
use \Foo;
|
||||
use \Foo as Bar;
|
||||
use Foo, Bar;
|
||||
use Foo, Bar as Baz;
|
||||
use function Foo, \Bar;
|
||||
use function Foo as foo, \Bar as bar;
|
||||
use const Foo, \Bar;
|
||||
use const Foo as foo, \Bar as bar;
|
||||
|
||||
use \Foo\{Bar, Baz};
|
||||
use Foo\{Bar, Baz as quux};
|
||||
use function Foo\{Bar, Baz};
|
||||
use const \Foo\{Bar, Baz};
|
||||
use Foo\{const Bar, function Baz};
|
||||
|
||||
$a[1];
|
||||
$a[1][2];
|
||||
array();
|
||||
array(1);
|
||||
array(1=>1, &$b,);
|
||||
~$a;
|
||||
!$a;
|
||||
|
||||
Foo::Bar;
|
||||
$foo::Bar;
|
||||
clone($a);
|
||||
clone $a;
|
||||
function(){};
|
||||
function($a, $b) use ($c, &$d) {};
|
||||
function(): void {};
|
||||
foo;
|
||||
namespace\foo;
|
||||
\foo;
|
||||
|
||||
empty($a);
|
||||
@$a;
|
||||
eval($a);
|
||||
exit;
|
||||
exit($a);
|
||||
die;
|
||||
die($a);
|
||||
foo();
|
||||
namespace\foo();
|
||||
\foo();
|
||||
$foo();
|
||||
|
||||
$a--;
|
||||
$a++;
|
||||
--$a;
|
||||
++$a;
|
||||
|
||||
include $a;
|
||||
include_once $a;
|
||||
require $a;
|
||||
require_once $a;
|
||||
|
||||
$a instanceof Foo;
|
||||
$a instanceof namespace\Foo;
|
||||
$a instanceof \Foo;
|
||||
|
||||
isset($a, $b);
|
||||
list($a) = $b;
|
||||
list($a[]) = $b;
|
||||
list(list($a)) = $b;
|
||||
|
||||
$a->foo();
|
||||
new Foo();
|
||||
new namespace\Foo();
|
||||
new \Foo();
|
||||
new class ($a, ...$b) {};
|
||||
print($a);
|
||||
$a->foo;
|
||||
`cmd $a`;
|
||||
`cmd`;
|
||||
``;
|
||||
[];
|
||||
[1];
|
||||
[1=>1, &$b,];
|
||||
|
||||
[$a] = $b;
|
||||
[$a[]] = $b;
|
||||
[list($a)] = $b;
|
||||
Foo::bar();
|
||||
namespace\Foo::bar();
|
||||
\Foo::bar();
|
||||
Foo::$bar;
|
||||
$foo::$bar;
|
||||
namespace\Foo::$bar;
|
||||
\Foo::$bar;
|
||||
$a ? $b : $c;
|
||||
$a ? : $c;
|
||||
$a ? $b ? $c : $d : $e;
|
||||
$a ? $b : $c ? $d : $e;
|
||||
-$a;
|
||||
+$a;
|
||||
$$a;
|
||||
yield;
|
||||
yield $a;
|
||||
yield $a => $b;
|
||||
yield from $a;
|
||||
|
||||
(array)$a;
|
||||
(boolean)$a;
|
||||
(bool)$a;
|
||||
(double)$a;
|
||||
(float)$a;
|
||||
(integer)$a;
|
||||
(int)$a;
|
||||
(object)$a;
|
||||
(string)$a;
|
||||
(unset)$a;
|
||||
|
||||
$a & $b;
|
||||
$a | $b;
|
||||
$a ^ $b;
|
||||
$a && $b;
|
||||
$a || $b;
|
||||
$a ?? $b;
|
||||
$a . $b;
|
||||
$a / $b;
|
||||
$a == $b;
|
||||
$a >= $b;
|
||||
$a > $b;
|
||||
$a === $b;
|
||||
$a and $b;
|
||||
$a or $b;
|
||||
$a xor $b;
|
||||
$a - $b;
|
||||
$a % $b;
|
||||
$a * $b;
|
||||
$a != $b;
|
||||
$a !== $b;
|
||||
$a + $b;
|
||||
$a ** $b;
|
||||
$a << $b;
|
||||
$a >> $b;
|
||||
$a <= $b;
|
||||
$a < $b;
|
||||
$a <=> $b;
|
||||
|
||||
$a =& $b;
|
||||
$a = $b;
|
||||
$a &= $b;
|
||||
$a |= $b;
|
||||
$a ^= $b;
|
||||
$a .= $b;
|
||||
$a /= $b;
|
||||
$a -= $b;
|
||||
$a %= $b;
|
||||
$a *= $b;
|
||||
$a += $b;
|
||||
$a **= $b;
|
||||
$a <<= $b;
|
||||
$a >>= $b;
|
||||
|
||||
class foo {public function class() {} }
|
||||
\foo\bar();
|
||||
|
||||
function foo(&$a, ...$b) {
|
||||
|
||||
function bar() {}
|
||||
class Baz {}
|
||||
trait Quux{}
|
||||
interface Quuux {}
|
||||
}
|
||||
|
||||
function foo(&$a = 1, ...$b = 1, $c = 1) {}
|
||||
function foo(array $a, callable $b) {}
|
||||
abstract final class foo { abstract protected static function bar(); final private function baz() {} }
|
||||
|
||||
(new Foo)->bar;
|
||||
(new Foo)();
|
||||
[$foo][0]();
|
||||
foo[1]();
|
||||
"foo"();
|
||||
[1]{$foo}();
|
||||
${foo()};
|
||||
|
||||
Foo::$bar();
|
||||
Foo::{$bar[0]}();
|
||||
|
||||
$foo->$bar;
|
||||
$foo->{$bar[0]};
|
||||
|
||||
[1=>&$a, 2=>list($b)];
|
||||
|
||||
__halt_compiler();
|
||||
|
||||
parsing process must be terminated
|
||||
Reference in New Issue
Block a user