[refactoring] parameters: new node structure
This commit is contained in:
		
							parent
							
								
									b5e29fc9f5
								
							
						
					
					
						commit
						ce18c23597
					
				| @ -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 | ||||
| @ -20,6 +20,8 @@ type Visitor interface { | ||||
| type NodeVisitor interface { | ||||
| 	Root(n *Root) | ||||
| 	Nullable(n *Nullable) | ||||
| 	Reference(n *Reference) | ||||
| 	Variadic(n *Variadic) | ||||
| 	Parameter(n *Parameter) | ||||
| 	Identifier(n *Identifier) | ||||
| 	ArgumentList(n *ArgumentList) | ||||
|  | ||||
| @ -36,11 +36,29 @@ func (n *Nullable) Accept(v NodeVisitor) { | ||||
| 	v.Nullable(n) | ||||
| } | ||||
| 
 | ||||
| // Reference node | ||||
| type Reference struct { | ||||
| 	Node | ||||
| 	Var Vertex | ||||
| } | ||||
| 
 | ||||
| func (n *Reference) Accept(v NodeVisitor) { | ||||
| 	v.Reference(n) | ||||
| } | ||||
| 
 | ||||
| // Variadic node | ||||
| type Variadic struct { | ||||
| 	Node | ||||
| 	Var Vertex | ||||
| } | ||||
| 
 | ||||
| func (n *Variadic) Accept(v NodeVisitor) { | ||||
| 	v.Variadic(n) | ||||
| } | ||||
| 
 | ||||
| // Parameter node | ||||
| type Parameter struct { | ||||
| 	Node | ||||
| 	ByRef        bool | ||||
| 	Variadic     bool | ||||
| 	Type         Vertex | ||||
| 	Var          Vertex | ||||
| 	DefaultValue Vertex | ||||
|  | ||||
| @ -40,6 +40,30 @@ func (t *DFS) Traverse(n ast.Vertex) { | ||||
| 			t.Traverse(nn.Expr) | ||||
| 			t.visitor.Leave("Expr", true) | ||||
| 		} | ||||
| 	case *ast.Reference: | ||||
| 		if nn == nil { | ||||
| 			return | ||||
| 		} | ||||
| 		if !t.visitor.EnterNode(nn) { | ||||
| 			return | ||||
| 		} | ||||
| 		if nn.Var != nil { | ||||
| 			t.visitor.Enter("Var", true) | ||||
| 			t.Traverse(nn.Var) | ||||
| 			t.visitor.Leave("Var", true) | ||||
| 		} | ||||
| 	case *ast.Variadic: | ||||
| 		if nn == nil { | ||||
| 			return | ||||
| 		} | ||||
| 		if !t.visitor.EnterNode(nn) { | ||||
| 			return | ||||
| 		} | ||||
| 		if nn.Var != nil { | ||||
| 			t.visitor.Enter("Var", true) | ||||
| 			t.Traverse(nn.Var) | ||||
| 			t.visitor.Leave("Var", true) | ||||
| 		} | ||||
| 	case *ast.Parameter: | ||||
| 		if nn == nil { | ||||
| 			return | ||||
|  | ||||
| @ -33,10 +33,18 @@ func (v *Dump) print(str string) { | ||||
| } | ||||
| 
 | ||||
| func (v *Dump) printIndent(indentDepth int) { | ||||
| 	if indentDepth < 0 { | ||||
| 		indentDepth = 0 | ||||
| 	} | ||||
| 
 | ||||
| 	v.print(strings.Repeat("\t", indentDepth)) | ||||
| } | ||||
| 
 | ||||
| func (v *Dump) printIndentIfNotSingle(indentDepth int) { | ||||
| 	if indentDepth < 0 { | ||||
| 		indentDepth = 0 | ||||
| 	} | ||||
| 
 | ||||
| 	if !v.stack[v.depth-1].singleNode { | ||||
| 		v.print(strings.Repeat("\t", indentDepth)) | ||||
| 	} | ||||
| @ -173,20 +181,22 @@ func (v *Dump) Nullable(n *ast.Nullable) { | ||||
| 	v.printNode(n.GetNode()) | ||||
| } | ||||
| 
 | ||||
| func (v *Dump) Reference(n *ast.Reference) { | ||||
| 	v.printIndentIfNotSingle(v.indent - 1) | ||||
| 	v.print("&ast.Reference{\n") | ||||
| 	v.printNode(n.GetNode()) | ||||
| } | ||||
| 
 | ||||
| func (v *Dump) Variadic(n *ast.Variadic) { | ||||
| 	v.printIndentIfNotSingle(v.indent - 1) | ||||
| 	v.print("&ast.Variadic{\n") | ||||
| 	v.printNode(n.GetNode()) | ||||
| } | ||||
| 
 | ||||
| func (v *Dump) Parameter(n *ast.Parameter) { | ||||
| 	v.printIndent(v.indent - 1) | ||||
| 	v.print("&ast.Parameter{\n") | ||||
| 	v.printNode(n.GetNode()) | ||||
| 
 | ||||
| 	if n.ByRef { | ||||
| 		v.printIndent(v.indent) | ||||
| 		v.print("ByRef: true,\n") | ||||
| 	} | ||||
| 
 | ||||
| 	if n.Variadic { | ||||
| 		v.printIndent(v.indent) | ||||
| 		v.print("Variadic: true,\n") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (v *Dump) Identifier(n *ast.Identifier) { | ||||
|  | ||||
| @ -30,8 +30,7 @@ func ExampleDump() { | ||||
| 		Stmts: []ast.Vertex{ | ||||
| 			&ast.Identifier{}, | ||||
| 			&ast.Parameter{ | ||||
| 				Variadic: true, | ||||
| 				Var:      &ast.ExprVariable{}, | ||||
| 				Var: &ast.ExprVariable{}, | ||||
| 			}, | ||||
| 			&ast.StmtInlineHtml{ | ||||
| 				Value: []byte("foo"), | ||||
| @ -64,7 +63,6 @@ func ExampleDump() { | ||||
| 	//			Value: []byte(""), | ||||
| 	//		}, | ||||
| 	//		&ast.Parameter{ | ||||
| 	//			Variadic: true, | ||||
| 	//			Var: &ast.ExprVariable{ | ||||
| 	//			}, | ||||
| 	//		}, | ||||
|  | ||||
| @ -502,10 +502,8 @@ func TestResolveFunctionName(t *testing.T) { | ||||
| 		FunctionName: &ast.Identifier{Value: []byte("A")}, | ||||
| 		Params: []ast.Vertex{ | ||||
| 			&ast.Parameter{ | ||||
| 				ByRef:    false, | ||||
| 				Variadic: false, | ||||
| 				Type:     nameAB, | ||||
| 				Var:      &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, | ||||
| 				Type: nameAB, | ||||
| 				Var:  &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		ReturnType: &ast.Nullable{Expr: nameBC}, | ||||
| @ -540,10 +538,8 @@ func TestResolveMethodName(t *testing.T) { | ||||
| 		MethodName: &ast.Identifier{Value: []byte("A")}, | ||||
| 		Params: []ast.Vertex{ | ||||
| 			&ast.Parameter{ | ||||
| 				ByRef:    false, | ||||
| 				Variadic: false, | ||||
| 				Type:     nameAB, | ||||
| 				Var:      &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, | ||||
| 				Type: nameAB, | ||||
| 				Var:  &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		ReturnType: &ast.Nullable{Expr: nameBC}, | ||||
| @ -573,10 +569,8 @@ func TestResolveClosureName(t *testing.T) { | ||||
| 		Static:     false, | ||||
| 		Params: []ast.Vertex{ | ||||
| 			&ast.Parameter{ | ||||
| 				ByRef:    false, | ||||
| 				Variadic: false, | ||||
| 				Type:     nameAB, | ||||
| 				Var:      &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, | ||||
| 				Type: nameAB, | ||||
| 				Var:  &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		ClosureUse: nil, | ||||
|  | ||||
| @ -30,6 +30,14 @@ func (v *Null) Nullable(_ *ast.Nullable) { | ||||
| 	// do nothing | ||||
| } | ||||
| 
 | ||||
| func (v *Null) Reference(_ *ast.Reference) { | ||||
| 	// do nothing | ||||
| } | ||||
| 
 | ||||
| func (v *Null) Variadic(_ *ast.Variadic) { | ||||
| 	// do nothing | ||||
| } | ||||
| 
 | ||||
| func (v *Null) Parameter(_ *ast.Parameter) { | ||||
| 	// do nothing | ||||
| } | ||||
|  | ||||
| @ -64,6 +64,10 @@ func (p *PrettyPrinter) printNode(n ast.Vertex) { | ||||
| 		p.printNodeRoot(n) | ||||
| 	case *ast.Identifier: | ||||
| 		p.printNodeIdentifier(n) | ||||
| 	case *ast.Reference: | ||||
| 		p.printNodeReference(n) | ||||
| 	case *ast.Variadic: | ||||
| 		p.printNodeVariadic(n) | ||||
| 	case *ast.Parameter: | ||||
| 		p.printNodeParameter(n) | ||||
| 	case *ast.Nullable: | ||||
| @ -434,6 +438,20 @@ func (p *PrettyPrinter) printNodeIdentifier(n ast.Vertex) { | ||||
| 	io.WriteString(p.w, v) | ||||
| } | ||||
| 
 | ||||
| func (p *PrettyPrinter) printNodeReference(n ast.Vertex) { | ||||
| 	nn := n.(*ast.Reference) | ||||
| 
 | ||||
| 	io.WriteString(p.w, "&") | ||||
| 	p.Print(nn.Var) | ||||
| } | ||||
| 
 | ||||
| func (p *PrettyPrinter) printNodeVariadic(n ast.Vertex) { | ||||
| 	nn := n.(*ast.Variadic) | ||||
| 
 | ||||
| 	io.WriteString(p.w, "...") | ||||
| 	p.Print(nn.Var) | ||||
| } | ||||
| 
 | ||||
| func (p *PrettyPrinter) printNodeParameter(n ast.Vertex) { | ||||
| 	nn := n.(*ast.Parameter) | ||||
| 
 | ||||
| @ -442,14 +460,6 @@ func (p *PrettyPrinter) printNodeParameter(n ast.Vertex) { | ||||
| 		io.WriteString(p.w, " ") | ||||
| 	} | ||||
| 
 | ||||
| 	if nn.ByRef { | ||||
| 		io.WriteString(p.w, "&") | ||||
| 	} | ||||
| 
 | ||||
| 	if nn.Variadic { | ||||
| 		io.WriteString(p.w, "...") | ||||
| 	} | ||||
| 
 | ||||
| 	p.Print(nn.Var) | ||||
| 
 | ||||
| 	if nn.DefaultValue != nil { | ||||
|  | ||||
| @ -119,10 +119,14 @@ func TestPrintParameter(t *testing.T) { | ||||
| 
 | ||||
| 	p := printer.NewPrettyPrinter(o, "    ") | ||||
| 	p.Print(&ast.Parameter{ | ||||
| 		ByRef:        false, | ||||
| 		Variadic:     true, | ||||
| 		Type:         &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, | ||||
| 		Var:          &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, | ||||
| 		Type: &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, | ||||
| 		Var: &ast.Variadic{ | ||||
| 			Var: &ast.ExprVariable{ | ||||
| 				VarName: &ast.Identifier{ | ||||
| 					Value: []byte("var"), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		DefaultValue: &ast.ScalarString{Value: []byte("'default'")}, | ||||
| 	}) | ||||
| 
 | ||||
| @ -140,10 +144,8 @@ func TestPrintNullable(t *testing.T) { | ||||
| 	p := printer.NewPrettyPrinter(o, "    ") | ||||
| 	p.Print(&ast.Nullable{ | ||||
| 		Expr: &ast.Parameter{ | ||||
| 			ByRef:        false, | ||||
| 			Variadic:     true, | ||||
| 			Type:         &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, | ||||
| 			Var:          &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, | ||||
| 			Var:          &ast.Variadic{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}}, | ||||
| 			DefaultValue: &ast.ScalarString{Value: []byte("'default'")}, | ||||
| 		}, | ||||
| 	}) | ||||
| @ -1389,9 +1391,7 @@ func TestPrintExprClosure(t *testing.T) { | ||||
| 				ReturnsRef: true, | ||||
| 				Params: []ast.Vertex{ | ||||
| 					&ast.Parameter{ | ||||
| 						ByRef:    true, | ||||
| 						Variadic: false, | ||||
| 						Var:      &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, | ||||
| 						Var: &ast.Reference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}}, | ||||
| 					}, | ||||
| 				}, | ||||
| 				ClosureUse: &ast.ExprClosureUse{ | ||||
| @ -2446,14 +2446,12 @@ func TestPrintStmtClassMethod(t *testing.T) { | ||||
| 		MethodName: &ast.Identifier{Value: []byte("foo")}, | ||||
| 		Params: []ast.Vertex{ | ||||
| 			&ast.Parameter{ | ||||
| 				ByRef:        true, | ||||
| 				Type:         &ast.Nullable{Expr: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("int")}}}}, | ||||
| 				Var:          &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, | ||||
| 				Var:          &ast.Reference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}}, | ||||
| 				DefaultValue: &ast.ExprConstFetch{Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}}, | ||||
| 			}, | ||||
| 			&ast.Parameter{ | ||||
| 				Variadic: true, | ||||
| 				Var:      &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, | ||||
| 				Var: &ast.Variadic{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		ReturnType: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("void")}}}, | ||||
| @ -2484,14 +2482,12 @@ func TestPrintStmtAbstractClassMethod(t *testing.T) { | ||||
| 		MethodName: &ast.Identifier{Value: []byte("foo")}, | ||||
| 		Params: []ast.Vertex{ | ||||
| 			&ast.Parameter{ | ||||
| 				ByRef:        true, | ||||
| 				Type:         &ast.Nullable{Expr: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("int")}}}}, | ||||
| 				Var:          &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, | ||||
| 				Var:          &ast.Reference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}}, | ||||
| 				DefaultValue: &ast.ExprConstFetch{Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}}, | ||||
| 			}, | ||||
| 			&ast.Parameter{ | ||||
| 				Variadic: true, | ||||
| 				Var:      &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, | ||||
| 				Var: &ast.Variadic{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		ReturnType: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("void")}}}, | ||||
| @ -3197,9 +3193,7 @@ func TestPrintStmtFunction(t *testing.T) { | ||||
| 				FunctionName: &ast.Identifier{Value: []byte("foo")}, | ||||
| 				Params: []ast.Vertex{ | ||||
| 					&ast.Parameter{ | ||||
| 						ByRef:    true, | ||||
| 						Variadic: false, | ||||
| 						Var:      &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, | ||||
| 						Var: &ast.Reference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}}, | ||||
| 					}, | ||||
| 				}, | ||||
| 				ReturnType: &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, | ||||
|  | ||||
| @ -79,6 +79,10 @@ func (p *Printer) printNode(n ast.Vertex) { | ||||
| 		p.printNodeRoot(n) | ||||
| 	case *ast.Identifier: | ||||
| 		p.printNodeIdentifier(n) | ||||
| 	case *ast.Reference: | ||||
| 		p.printNodeReference(n) | ||||
| 	case *ast.Variadic: | ||||
| 		p.printNodeVariadic(n) | ||||
| 	case *ast.Parameter: | ||||
| 		p.printNodeParameter(n) | ||||
| 	case *ast.Nullable: | ||||
| @ -444,6 +448,26 @@ func (p *Printer) printNodeIdentifier(n ast.Vertex) { | ||||
| 	p.printFreeFloating(nn, token.End) | ||||
| } | ||||
| 
 | ||||
| func (p *Printer) printNodeReference(n ast.Vertex) { | ||||
| 	nn := n.(*ast.Reference) | ||||
| 	p.printFreeFloating(nn, token.Start) | ||||
| 
 | ||||
| 	io.WriteString(p.w, "&") | ||||
| 	p.Print(nn.Var) | ||||
| 
 | ||||
| 	p.printFreeFloating(nn, token.End) | ||||
| } | ||||
| 
 | ||||
| func (p *Printer) printNodeVariadic(n ast.Vertex) { | ||||
| 	nn := n.(*ast.Variadic) | ||||
| 	p.printFreeFloating(nn, token.Start) | ||||
| 
 | ||||
| 	io.WriteString(p.w, "...") | ||||
| 	p.Print(nn.Var) | ||||
| 
 | ||||
| 	p.printFreeFloating(nn, token.End) | ||||
| } | ||||
| 
 | ||||
| func (p *Printer) printNodeParameter(n ast.Vertex) { | ||||
| 	nn := n.(*ast.Parameter) | ||||
| 	p.printFreeFloating(nn, token.Start) | ||||
| @ -451,22 +475,10 @@ func (p *Printer) printNodeParameter(n ast.Vertex) { | ||||
| 	if nn.Type != nil { | ||||
| 		p.Print(nn.Type) | ||||
| 	} | ||||
| 	p.printFreeFloating(nn, token.OptionalType) | ||||
| 
 | ||||
| 	if nn.ByRef { | ||||
| 		io.WriteString(p.w, "&") | ||||
| 	} | ||||
| 	p.printFreeFloating(nn, token.Ampersand) | ||||
| 
 | ||||
| 	if nn.Variadic { | ||||
| 		io.WriteString(p.w, "...") | ||||
| 	} | ||||
| 	p.printFreeFloating(nn, token.Variadic) | ||||
| 
 | ||||
| 	p.Print(nn.Var) | ||||
| 
 | ||||
| 	if nn.DefaultValue != nil { | ||||
| 		p.printFreeFloating(nn, token.Var) | ||||
| 		io.WriteString(p.w, "=") | ||||
| 		p.Print(nn.DefaultValue) | ||||
| 	} | ||||
|  | ||||
| @ -107,6 +107,18 @@ func TestParseAndPrintIdentifier(t *testing.T) { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestParseAndPrintParameterTMP(t *testing.T) { | ||||
| 
 | ||||
| 	src := `<?php | ||||
| 	function foo ( foo & ... $foo = null ) {}` | ||||
| 
 | ||||
| 	actual := print(parse(src)) | ||||
| 
 | ||||
| 	if src != actual { | ||||
| 		t.Errorf("\nexpected: %s\ngot: %s\n", src, actual) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestParseAndPrintParameter(t *testing.T) { | ||||
| 
 | ||||
| 	src := `<?php | ||||
|  | ||||
| @ -141,8 +141,6 @@ func TestPrinterPrintParameter(t *testing.T) { | ||||
| 
 | ||||
| 	p := printer.NewPrinter(o) | ||||
| 	p.Print(&ast.Parameter{ | ||||
| 		ByRef:    false, | ||||
| 		Variadic: true, | ||||
| 		Type: &ast.NameFullyQualified{ | ||||
| 			Parts: []ast.Vertex{ | ||||
| 				&ast.NameNamePart{ | ||||
| @ -150,8 +148,10 @@ func TestPrinterPrintParameter(t *testing.T) { | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		Var: &ast.ExprVariable{ | ||||
| 			VarName: &ast.Identifier{Value: []byte("$var")}, | ||||
| 		Var: &ast.Variadic{ | ||||
| 			Var: &ast.ExprVariable{ | ||||
| 				VarName: &ast.Identifier{Value: []byte("$var")}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		DefaultValue: &ast.ScalarString{ | ||||
| 			Value: []byte("'default'"), | ||||
| @ -172,8 +172,6 @@ func TestPrinterPrintNullable(t *testing.T) { | ||||
| 	p := printer.NewPrinter(o) | ||||
| 	p.Print(&ast.Nullable{ | ||||
| 		Expr: &ast.Parameter{ | ||||
| 			ByRef:    true, | ||||
| 			Variadic: false, | ||||
| 			Type: &ast.NameFullyQualified{ | ||||
| 				Parts: []ast.Vertex{ | ||||
| 					&ast.NameNamePart{ | ||||
| @ -181,8 +179,10 @@ func TestPrinterPrintNullable(t *testing.T) { | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 			Var: &ast.ExprVariable{ | ||||
| 				VarName: &ast.Identifier{Value: []byte("$var")}, | ||||
| 			Var: &ast.Reference{ | ||||
| 				Var: &ast.ExprVariable{ | ||||
| 					VarName: &ast.Identifier{Value: []byte("$var")}, | ||||
| 				}, | ||||
| 			}, | ||||
| 			DefaultValue: &ast.ScalarString{ | ||||
| 				Value: []byte("'default'"), | ||||
| @ -1703,10 +1703,10 @@ func TestPrinterPrintExprClosure(t *testing.T) { | ||||
| 		ReturnsRef: true, | ||||
| 		Params: []ast.Vertex{ | ||||
| 			&ast.Parameter{ | ||||
| 				ByRef:    true, | ||||
| 				Variadic: false, | ||||
| 				Var: &ast.ExprVariable{ | ||||
| 					VarName: &ast.Identifier{Value: []byte("$var")}, | ||||
| 				Var: &ast.Reference{ | ||||
| 					Var: &ast.ExprVariable{ | ||||
| 						VarName: &ast.Identifier{Value: []byte("$var")}, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| @ -1748,10 +1748,10 @@ func TestPrinterPrintExprArrowFunction(t *testing.T) { | ||||
| 			ReturnsRef: true, | ||||
| 			Params: []ast.Vertex{ | ||||
| 				&ast.Parameter{ | ||||
| 					ByRef:    true, | ||||
| 					Variadic: false, | ||||
| 					Var: &ast.ExprVariable{ | ||||
| 						VarName: &ast.Identifier{Value: []byte("$var")}, | ||||
| 					Var: &ast.Reference{ | ||||
| 						Var: &ast.ExprVariable{ | ||||
| 							VarName: &ast.Identifier{Value: []byte("$var")}, | ||||
| 						}, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| @ -2925,17 +2925,19 @@ func TestPrinterPrintStmtClassMethod(t *testing.T) { | ||||
| 		MethodName: &ast.Identifier{Value: []byte("foo")}, | ||||
| 		Params: []ast.Vertex{ | ||||
| 			&ast.Parameter{ | ||||
| 				ByRef: true, | ||||
| 				Type:  &ast.Nullable{Expr: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("int")}}}}, | ||||
| 				Var: &ast.ExprVariable{ | ||||
| 					VarName: &ast.Identifier{Value: []byte("$a")}, | ||||
| 				Var: &ast.Reference{ | ||||
| 					Var: &ast.ExprVariable{ | ||||
| 						VarName: &ast.Identifier{Value: []byte("$a")}, | ||||
| 					}, | ||||
| 				}, | ||||
| 				DefaultValue: &ast.ExprConstFetch{Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}}, | ||||
| 			}, | ||||
| 			&ast.Parameter{ | ||||
| 				Variadic: true, | ||||
| 				Var: &ast.ExprVariable{ | ||||
| 					VarName: &ast.Identifier{Value: []byte("$b")}, | ||||
| 				Var: &ast.Variadic{ | ||||
| 					Var: &ast.ExprVariable{ | ||||
| 						VarName: &ast.Identifier{Value: []byte("$b")}, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| @ -2972,17 +2974,19 @@ func TestPrinterPrintStmtAbstractClassMethod(t *testing.T) { | ||||
| 		MethodName: &ast.Identifier{Value: []byte("foo")}, | ||||
| 		Params: []ast.Vertex{ | ||||
| 			&ast.Parameter{ | ||||
| 				ByRef: true, | ||||
| 				Type:  &ast.Nullable{Expr: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("int")}}}}, | ||||
| 				Var: &ast.ExprVariable{ | ||||
| 					VarName: &ast.Identifier{Value: []byte("$a")}, | ||||
| 				Var: &ast.Reference{ | ||||
| 					Var: &ast.ExprVariable{ | ||||
| 						VarName: &ast.Identifier{Value: []byte("$a")}, | ||||
| 					}, | ||||
| 				}, | ||||
| 				DefaultValue: &ast.ExprConstFetch{Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}}, | ||||
| 			}, | ||||
| 			&ast.Parameter{ | ||||
| 				Variadic: true, | ||||
| 				Var: &ast.ExprVariable{ | ||||
| 					VarName: &ast.Identifier{Value: []byte("$b")}, | ||||
| 				Var: &ast.Variadic{ | ||||
| 					Var: &ast.ExprVariable{ | ||||
| 						VarName: &ast.Identifier{Value: []byte("$b")}, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| @ -3607,10 +3611,10 @@ func TestPrinterPrintStmtFunction(t *testing.T) { | ||||
| 		FunctionName: &ast.Identifier{Value: []byte("foo")}, | ||||
| 		Params: []ast.Vertex{ | ||||
| 			&ast.Parameter{ | ||||
| 				ByRef:    true, | ||||
| 				Variadic: false, | ||||
| 				Var: &ast.ExprVariable{ | ||||
| 					VarName: &ast.Identifier{Value: []byte("$var")}, | ||||
| 				Var: &ast.Reference{ | ||||
| 					Var: &ast.ExprVariable{ | ||||
| 						VarName: &ast.Identifier{Value: []byte("$var")}, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user