create TraitAdaptationList node
This commit is contained in:
		
							parent
							
								
									8fc4c60bfe
								
							
						
					
					
						commit
						f8d9d6d7c2
					
				
							
								
								
									
										42
									
								
								node/stmt/n_trait_adaptation_list.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								node/stmt/n_trait_adaptation_list.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | |||||||
|  | package stmt | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"github.com/z7zmey/php-parser/node" | ||||||
|  | 	"github.com/z7zmey/php-parser/walker" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // TraitAdaptationList node | ||||||
|  | type TraitAdaptationList struct { | ||||||
|  | 	Adaptations []node.Node | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewTraitAdaptationList node constructor | ||||||
|  | func NewTraitAdaptationList(Adaptations []node.Node) *TraitAdaptationList { | ||||||
|  | 	return &TraitAdaptationList{ | ||||||
|  | 		Adaptations, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Attributes returns node attributes as map | ||||||
|  | func (n *TraitAdaptationList) Attributes() map[string]interface{} { | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Walk traverses nodes | ||||||
|  | // Walk is invoked recursively until v.EnterNode returns true | ||||||
|  | func (n *TraitAdaptationList) Walk(v walker.Visitor) { | ||||||
|  | 	if v.EnterNode(n) == false { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if n.Adaptations != nil { | ||||||
|  | 		vv := v.GetChildrenVisitor("Adaptations") | ||||||
|  | 		for _, nn := range n.Adaptations { | ||||||
|  | 			if nn != nil { | ||||||
|  | 				nn.Walk(vv) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	v.LeaveNode(n) | ||||||
|  | } | ||||||
| @ -7,15 +7,15 @@ import ( | |||||||
| 
 | 
 | ||||||
| // TraitUse node | // TraitUse node | ||||||
| type TraitUse struct { | type TraitUse struct { | ||||||
| 	Traits      []node.Node | 	Traits              []node.Node | ||||||
| 	Adaptations []node.Node | 	TraitAdaptationList *TraitAdaptationList | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewTraitUse node constructor | // NewTraitUse node constructor | ||||||
| func NewTraitUse(Traits []node.Node, Adaptations []node.Node) *TraitUse { | func NewTraitUse(Traits []node.Node, InnerAdaptationList *TraitAdaptationList) *TraitUse { | ||||||
| 	return &TraitUse{ | 	return &TraitUse{ | ||||||
| 		Traits, | 		Traits, | ||||||
| 		Adaptations, | 		InnerAdaptationList, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -40,13 +40,9 @@ func (n *TraitUse) Walk(v walker.Visitor) { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if n.Adaptations != nil { | 	if n.TraitAdaptationList != nil { | ||||||
| 		vv := v.GetChildrenVisitor("Adaptations") | 		vv := v.GetChildrenVisitor("TraitAdaptationList") | ||||||
| 		for _, nn := range n.Adaptations { | 		n.TraitAdaptationList.Walk(vv) | ||||||
| 			if nn != nil { |  | ||||||
| 				nn.Walk(vv) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	v.LeaveNode(n) | 	v.LeaveNode(n) | ||||||
|  | |||||||
| @ -2,9 +2,10 @@ package stmt_test | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"github.com/z7zmey/php-parser/node/name" |  | ||||||
| 	"testing" | 	"testing" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/z7zmey/php-parser/node/name" | ||||||
|  | 
 | ||||||
| 	"github.com/z7zmey/php-parser/node" | 	"github.com/z7zmey/php-parser/node" | ||||||
| 	"github.com/z7zmey/php-parser/node/stmt" | 	"github.com/z7zmey/php-parser/node/stmt" | ||||||
| 	"github.com/z7zmey/php-parser/php5" | 	"github.com/z7zmey/php-parser/php5" | ||||||
| @ -106,6 +107,7 @@ func TestTraitsUseEmptyAdaptations(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
|  | 						TraitAdaptationList: &stmt.TraitAdaptationList{}, | ||||||
| 					}, | 					}, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| @ -145,12 +147,14 @@ func TestTraitsUseModifier(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 						Adaptations: []node.Node{ | 						TraitAdaptationList: &stmt.TraitAdaptationList{ | ||||||
| 							&stmt.TraitUseAlias{ | 							Adaptations: []node.Node{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 								&stmt.TraitUseAlias{ | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Ref: &stmt.TraitMethodRef{ | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
|  | 									}, | ||||||
|  | 									Modifier: &node.Identifier{Value: "public"}, | ||||||
| 								}, | 								}, | ||||||
| 								Modifier: &node.Identifier{Value: "public"}, |  | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
| @ -192,13 +196,15 @@ func TestTraitsUseAliasModifier(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 						Adaptations: []node.Node{ | 						TraitAdaptationList: &stmt.TraitAdaptationList{ | ||||||
| 							&stmt.TraitUseAlias{ | 							Adaptations: []node.Node{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 								&stmt.TraitUseAlias{ | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Ref: &stmt.TraitMethodRef{ | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
|  | 									}, | ||||||
|  | 									Modifier: &node.Identifier{Value: "public"}, | ||||||
|  | 									Alias:    &node.Identifier{Value: "two"}, | ||||||
| 								}, | 								}, | ||||||
| 								Modifier: &node.Identifier{Value: "public"}, |  | ||||||
| 								Alias:    &node.Identifier{Value: "two"}, |  | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
| @ -240,39 +246,41 @@ func TestTraitsUseAdaptions(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 						Adaptations: []node.Node{ | 						TraitAdaptationList: &stmt.TraitAdaptationList{ | ||||||
| 							&stmt.TraitUsePrecedence{ | 							Adaptations: []node.Node{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 								&stmt.TraitUsePrecedence{ | ||||||
| 									Trait: &name.Name{ | 									Ref: &stmt.TraitMethodRef{ | ||||||
| 										Parts: []node.Node{ | 										Trait: &name.Name{ | ||||||
| 											&name.NamePart{Value: "Bar"}, | 											Parts: []node.Node{ | ||||||
|  | 												&name.NamePart{Value: "Bar"}, | ||||||
|  | 											}, | ||||||
| 										}, | 										}, | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
| 									}, | 									}, | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Insteadof: []node.Node{ | ||||||
| 								}, | 										&name.Name{ | ||||||
| 								Insteadof: []node.Node{ | 											Parts: []node.Node{ | ||||||
| 									&name.Name{ | 												&name.NamePart{Value: "Baz"}, | ||||||
| 										Parts: []node.Node{ | 											}, | ||||||
| 											&name.NamePart{Value: "Baz"}, |  | ||||||
| 										}, | 										}, | ||||||
| 									}, | 										&name.Name{ | ||||||
| 									&name.Name{ | 											Parts: []node.Node{ | ||||||
| 										Parts: []node.Node{ | 												&name.NamePart{Value: "Quux"}, | ||||||
| 											&name.NamePart{Value: "Quux"}, | 											}, | ||||||
| 										}, | 										}, | ||||||
| 									}, | 									}, | ||||||
| 								}, | 								}, | ||||||
| 							}, | 								&stmt.TraitUseAlias{ | ||||||
| 							&stmt.TraitUseAlias{ | 									Ref: &stmt.TraitMethodRef{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 										Trait: &name.Name{ | ||||||
| 									Trait: &name.Name{ | 											Parts: []node.Node{ | ||||||
| 										Parts: []node.Node{ | 												&name.NamePart{Value: "Baz"}, | ||||||
| 											&name.NamePart{Value: "Baz"}, | 											}, | ||||||
| 										}, | 										}, | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
| 									}, | 									}, | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Alias: &node.Identifier{Value: "two"}, | ||||||
| 								}, | 								}, | ||||||
| 								Alias: &node.Identifier{Value: "two"}, |  | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
|  | |||||||
| @ -92,10 +92,10 @@ var nodesToTest = []struct { | |||||||
| 			PhpDocComment: "/** */", | 			PhpDocComment: "/** */", | ||||||
| 			ClassName:     &node.Identifier{}, | 			ClassName:     &node.Identifier{}, | ||||||
| 			Modifiers:     []node.Node{&stmt.Expression{}}, | 			Modifiers:     []node.Node{&stmt.Expression{}}, | ||||||
| 			ArgumentList: &node.ArgumentList{}, | 			ArgumentList:  &node.ArgumentList{}, | ||||||
| 			Extends:    &node.Identifier{}, | 			Extends:       &node.Identifier{}, | ||||||
| 			Implements: []node.Node{&stmt.Expression{}}, | 			Implements:    []node.Node{&stmt.Expression{}}, | ||||||
| 			Stmts:      []node.Node{&stmt.Expression{}}, | 			Stmts:         []node.Node{&stmt.Expression{}}, | ||||||
| 		}, | 		}, | ||||||
| 		[]string{"ClassName", "Modifiers", "ArgumentList", "Extends", "Implements", "Stmts"}, | 		[]string{"ClassName", "Modifiers", "ArgumentList", "Extends", "Implements", "Stmts"}, | ||||||
| 		map[string]interface{}{"PhpDocComment": "/** */"}, | 		map[string]interface{}{"PhpDocComment": "/** */"}, | ||||||
| @ -408,10 +408,10 @@ var nodesToTest = []struct { | |||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		&stmt.TraitUse{ | 		&stmt.TraitUse{ | ||||||
| 			Traits:      []node.Node{&stmt.Expression{}}, | 			Traits:              []node.Node{&stmt.Expression{}}, | ||||||
| 			Adaptations: []node.Node{&stmt.Expression{}}, | 			TraitAdaptationList: &stmt.TraitAdaptationList{}, | ||||||
| 		}, | 		}, | ||||||
| 		[]string{"Traits", "Adaptations"}, | 		[]string{"Traits", "TraitAdaptationList"}, | ||||||
| 		map[string]interface{}{}, | 		map[string]interface{}{}, | ||||||
| 	}, | 	}, | ||||||
| 	{ | 	{ | ||||||
| @ -479,6 +479,13 @@ var nodesToTest = []struct { | |||||||
| 		[]string{"Stmts"}, | 		[]string{"Stmts"}, | ||||||
| 		map[string]interface{}{}, | 		map[string]interface{}{}, | ||||||
| 	}, | 	}, | ||||||
|  | 	{ | ||||||
|  | 		&stmt.TraitAdaptationList{ | ||||||
|  | 			Adaptations: []node.Node{&stmt.TraitUsePrecedence{}}, | ||||||
|  | 		}, | ||||||
|  | 		[]string{"Adaptations"}, | ||||||
|  | 		map[string]interface{}{}, | ||||||
|  | 	}, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type visitorMock struct { | type visitorMock struct { | ||||||
|  | |||||||
							
								
								
									
										1284
									
								
								php5/php5.go
									
									
									
									
									
								
							
							
						
						
									
										1284
									
								
								php5/php5.go
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										27
									
								
								php5/php5.y
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								php5/php5.y
									
									
									
									
									
								
							| @ -243,6 +243,7 @@ import ( | |||||||
| %type <node> trait_method_reference_fully_qualified trait_method_reference trait_modifiers member_modifier method | %type <node> trait_method_reference_fully_qualified trait_method_reference trait_modifiers member_modifier method | ||||||
| %type <node> static_scalar_value static_operation | %type <node> static_scalar_value static_operation | ||||||
| %type <node> ctor_arguments function_call_parameter_list | %type <node> ctor_arguments function_call_parameter_list | ||||||
|  | %type <node> trait_adaptations | ||||||
| 
 | 
 | ||||||
| %type <list> top_statement_list namespace_name use_declarations use_function_declarations use_const_declarations | %type <list> top_statement_list namespace_name use_declarations use_function_declarations use_const_declarations | ||||||
| %type <list> inner_statement_list global_var_list static_var_list encaps_list isset_variables non_empty_array_pair_list | %type <list> inner_statement_list global_var_list static_var_list encaps_list isset_variables non_empty_array_pair_list | ||||||
| @ -259,7 +260,7 @@ import ( | |||||||
| 
 | 
 | ||||||
| %type <simpleIndirectReference> simple_indirect_reference | %type <simpleIndirectReference> simple_indirect_reference | ||||||
| %type <foreachVariable> foreach_variable foreach_optional_arg | %type <foreachVariable> foreach_variable foreach_optional_arg | ||||||
| %type <nodesWithEndToken> switch_case_list method_body trait_adaptations | %type <nodesWithEndToken> switch_case_list method_body | ||||||
| %type <boolWithToken> is_reference is_variadic | %type <boolWithToken> is_reference is_variadic | ||||||
| %type <altSyntaxNode> while_statement for_statement foreach_statement | %type <altSyntaxNode> while_statement for_statement foreach_statement | ||||||
| 
 | 
 | ||||||
| @ -1550,8 +1551,16 @@ class_statement: | |||||||
| trait_use_statement: | trait_use_statement: | ||||||
|         T_USE trait_list trait_adaptations |         T_USE trait_list trait_adaptations | ||||||
|             { |             { | ||||||
|                 $$ = stmt.NewTraitUse($2, $3.nodes) |                 var adaptationList *stmt.TraitAdaptationList | ||||||
|                 yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokensPosition($1, $3.endToken)) |                 switch n := $3.(type) { | ||||||
|  |                 case *stmt.TraitAdaptationList: | ||||||
|  |                     adaptationList = n | ||||||
|  |                 default: | ||||||
|  |                     adaptationList = nil | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 $$ = stmt.NewTraitUse($2, adaptationList) | ||||||
|  |                 yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokenNodePosition($1, $3)) | ||||||
|                 yylex.(*Parser).comments.AddComments($$, $1.Comments()) |                 yylex.(*Parser).comments.AddComments($$, $1.Comments()) | ||||||
|             } |             } | ||||||
| ; | ; | ||||||
| @ -1565,9 +1574,17 @@ trait_list: | |||||||
| 
 | 
 | ||||||
| trait_adaptations: | trait_adaptations: | ||||||
|         ';' |         ';' | ||||||
|             { $$ = &nodesWithEndToken{nil, $1} } |             { | ||||||
|  |                 $$ = stmt.NewNop() | ||||||
|  | 
 | ||||||
|  |                 yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokenPosition($1)) | ||||||
|  |             } | ||||||
|     |   '{' trait_adaptation_list '}' |     |   '{' trait_adaptation_list '}' | ||||||
|             { $$ = &nodesWithEndToken{$2, $3} } |             { | ||||||
|  |                 $$ = stmt.NewTraitAdaptationList($2) | ||||||
|  | 
 | ||||||
|  |                 yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokensPosition($1, $3)) | ||||||
|  |             } | ||||||
| ; | ; | ||||||
| 
 | 
 | ||||||
| trait_adaptation_list: | trait_adaptation_list: | ||||||
|  | |||||||
| @ -1455,6 +1455,7 @@ func TestPhp5(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
|  | 						TraitAdaptationList: &stmt.TraitAdaptationList{}, | ||||||
| 					}, | 					}, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| @ -1475,12 +1476,14 @@ func TestPhp5(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 						Adaptations: []node.Node{ | 						TraitAdaptationList: &stmt.TraitAdaptationList{ | ||||||
| 							&stmt.TraitUseAlias{ | 							Adaptations: []node.Node{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 								&stmt.TraitUseAlias{ | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Ref: &stmt.TraitMethodRef{ | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
|  | 									}, | ||||||
|  | 									Modifier: &node.Identifier{Value: "public"}, | ||||||
| 								}, | 								}, | ||||||
| 								Modifier: &node.Identifier{Value: "public"}, |  | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
| @ -1503,13 +1506,15 @@ func TestPhp5(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 						Adaptations: []node.Node{ | 						TraitAdaptationList: &stmt.TraitAdaptationList{ | ||||||
| 							&stmt.TraitUseAlias{ | 							Adaptations: []node.Node{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 								&stmt.TraitUseAlias{ | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Ref: &stmt.TraitMethodRef{ | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
|  | 									}, | ||||||
|  | 									Modifier: &node.Identifier{Value: "public"}, | ||||||
|  | 									Alias:    &node.Identifier{Value: "two"}, | ||||||
| 								}, | 								}, | ||||||
| 								Modifier: &node.Identifier{Value: "public"}, |  | ||||||
| 								Alias:    &node.Identifier{Value: "two"}, |  | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
| @ -1532,39 +1537,41 @@ func TestPhp5(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 						Adaptations: []node.Node{ | 						TraitAdaptationList: &stmt.TraitAdaptationList{ | ||||||
| 							&stmt.TraitUsePrecedence{ | 							Adaptations: []node.Node{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 								&stmt.TraitUsePrecedence{ | ||||||
| 									Trait: &name.Name{ | 									Ref: &stmt.TraitMethodRef{ | ||||||
| 										Parts: []node.Node{ | 										Trait: &name.Name{ | ||||||
| 											&name.NamePart{Value: "Bar"}, | 											Parts: []node.Node{ | ||||||
|  | 												&name.NamePart{Value: "Bar"}, | ||||||
|  | 											}, | ||||||
| 										}, | 										}, | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
| 									}, | 									}, | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Insteadof: []node.Node{ | ||||||
| 								}, | 										&name.Name{ | ||||||
| 								Insteadof: []node.Node{ | 											Parts: []node.Node{ | ||||||
| 									&name.Name{ | 												&name.NamePart{Value: "Baz"}, | ||||||
| 										Parts: []node.Node{ | 											}, | ||||||
| 											&name.NamePart{Value: "Baz"}, |  | ||||||
| 										}, | 										}, | ||||||
| 									}, | 										&name.Name{ | ||||||
| 									&name.Name{ | 											Parts: []node.Node{ | ||||||
| 										Parts: []node.Node{ | 												&name.NamePart{Value: "Quux"}, | ||||||
| 											&name.NamePart{Value: "Quux"}, | 											}, | ||||||
| 										}, | 										}, | ||||||
| 									}, | 									}, | ||||||
| 								}, | 								}, | ||||||
| 							}, | 								&stmt.TraitUseAlias{ | ||||||
| 							&stmt.TraitUseAlias{ | 									Ref: &stmt.TraitMethodRef{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 										Trait: &name.Name{ | ||||||
| 									Trait: &name.Name{ | 											Parts: []node.Node{ | ||||||
| 										Parts: []node.Node{ | 												&name.NamePart{Value: "Baz"}, | ||||||
| 											&name.NamePart{Value: "Baz"}, | 											}, | ||||||
| 										}, | 										}, | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
| 									}, | 									}, | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Alias: &node.Identifier{Value: "two"}, | ||||||
| 								}, | 								}, | ||||||
| 								Alias: &node.Identifier{Value: "two"}, |  | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
|  | |||||||
							
								
								
									
										1058
									
								
								php7/php7.go
									
									
									
									
									
								
							
							
						
						
									
										1058
									
								
								php7/php7.go
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										47
									
								
								php7/php7.y
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								php7/php7.y
									
									
									
									
									
								
							| @ -264,12 +264,13 @@ import ( | |||||||
| %type <node> isset_variable type return_type type_expr | %type <node> isset_variable type return_type type_expr | ||||||
| %type <node> class_modifier | %type <node> class_modifier | ||||||
| %type <node> argument_list ctor_arguments | %type <node> argument_list ctor_arguments | ||||||
|  | %type <node> trait_adaptations | ||||||
| 
 | 
 | ||||||
| %type <node> member_modifier | %type <node> member_modifier | ||||||
| %type <node> use_type | %type <node> use_type | ||||||
| %type <foreachVariable> foreach_variable | %type <foreachVariable> foreach_variable | ||||||
| 
 | 
 | ||||||
| %type <nodesWithEndToken> method_body switch_case_list trait_adaptations | %type <nodesWithEndToken> method_body switch_case_list | ||||||
| 
 | 
 | ||||||
| %type <list> encaps_list backticks_expr namespace_name catch_name_list catch_list class_const_list | %type <list> encaps_list backticks_expr namespace_name catch_name_list catch_list class_const_list | ||||||
| %type <list> const_list echo_expr_list for_exprs non_empty_for_exprs global_var_list | %type <list> const_list echo_expr_list for_exprs non_empty_for_exprs global_var_list | ||||||
| @ -1864,10 +1865,20 @@ class_statement: | |||||||
|             } |             } | ||||||
|     |   T_USE name_list trait_adaptations |     |   T_USE name_list trait_adaptations | ||||||
|             { |             { | ||||||
|                 $$ = stmt.NewTraitUse($2, $3.nodes) |                 var adaptationList *stmt.TraitAdaptationList | ||||||
|  | 
 | ||||||
|  |                 switch n := $3.(type) { | ||||||
|  |                 case *stmt.TraitAdaptationList: | ||||||
|  |                     adaptationList = n | ||||||
|  |                 default: | ||||||
|  |                     adaptationList = nil | ||||||
|  |                     yylex.(*Parser).comments.AddFromChildNode($$, $3) | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 $$ = stmt.NewTraitUse($2, adaptationList) | ||||||
| 
 | 
 | ||||||
|                 // save position |                 // save position | ||||||
|                 yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokensPosition($1, $3.endToken)) |                 yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokenNodePosition($1, $3)) | ||||||
| 
 | 
 | ||||||
|                 // save comments |                 // save comments | ||||||
|                 yylex.(*Parser).comments.AddFromToken($$, $1, comment.UseToken) |                 yylex.(*Parser).comments.AddFromToken($$, $1, comment.UseToken) | ||||||
| @ -1906,11 +1917,35 @@ name_list: | |||||||
| 
 | 
 | ||||||
| trait_adaptations: | trait_adaptations: | ||||||
|         ';' |         ';' | ||||||
|             { $$ = &nodesWithEndToken{nil, $1} } |             { | ||||||
|  |                 $$ = stmt.NewNop() | ||||||
|  | 
 | ||||||
|  |                 yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokenPosition($1)) | ||||||
|  | 
 | ||||||
|  |                 // save comments | ||||||
|  |                 yylex.(*Parser).comments.AddFromToken($$, $1, comment.SemiColonToken) | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|     |   '{' '}' |     |   '{' '}' | ||||||
|             { $$ = &nodesWithEndToken{nil, $2} } |             { | ||||||
|  |                 $$ = stmt.NewTraitAdaptationList(nil) | ||||||
|  | 
 | ||||||
|  |                 yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokensPosition($1, $2)) | ||||||
|  | 
 | ||||||
|  |                 // save comments | ||||||
|  |                 yylex.(*Parser).comments.AddFromToken($$, $1, comment.OpenCurlyBracesToken) | ||||||
|  |                 yylex.(*Parser).comments.AddFromToken($$, $2, comment.CloseCurlyBracesToken) | ||||||
|  |             } | ||||||
|     |   '{' trait_adaptation_list '}' |     |   '{' trait_adaptation_list '}' | ||||||
|             { $$ = &nodesWithEndToken{$2, $3} } |             { | ||||||
|  |                 $$ = stmt.NewTraitAdaptationList($2) | ||||||
|  | 
 | ||||||
|  |                 yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokensPosition($1, $3)) | ||||||
|  | 
 | ||||||
|  |                 // save comments | ||||||
|  |                 yylex.(*Parser).comments.AddFromToken($$, $1, comment.OpenCurlyBracesToken) | ||||||
|  |                 yylex.(*Parser).comments.AddFromToken($$, $3, comment.CloseCurlyBracesToken) | ||||||
|  |             } | ||||||
| ; | ; | ||||||
| 
 | 
 | ||||||
| trait_adaptation_list: | trait_adaptation_list: | ||||||
|  | |||||||
| @ -1482,6 +1482,7 @@ func TestPhp7(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
|  | 						TraitAdaptationList: &stmt.TraitAdaptationList{}, | ||||||
| 					}, | 					}, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| @ -1502,12 +1503,14 @@ func TestPhp7(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 						Adaptations: []node.Node{ | 						TraitAdaptationList: &stmt.TraitAdaptationList{ | ||||||
| 							&stmt.TraitUseAlias{ | 							Adaptations: []node.Node{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 								&stmt.TraitUseAlias{ | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Ref: &stmt.TraitMethodRef{ | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
|  | 									}, | ||||||
|  | 									Alias: &node.Identifier{Value: "include"}, | ||||||
| 								}, | 								}, | ||||||
| 								Alias: &node.Identifier{Value: "include"}, |  | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
| @ -1530,12 +1533,14 @@ func TestPhp7(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 						Adaptations: []node.Node{ | 						TraitAdaptationList: &stmt.TraitAdaptationList{ | ||||||
| 							&stmt.TraitUseAlias{ | 							Adaptations: []node.Node{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 								&stmt.TraitUseAlias{ | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Ref: &stmt.TraitMethodRef{ | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
|  | 									}, | ||||||
|  | 									Modifier: &node.Identifier{Value: "public"}, | ||||||
| 								}, | 								}, | ||||||
| 								Modifier: &node.Identifier{Value: "public"}, |  | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
| @ -1558,13 +1563,15 @@ func TestPhp7(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 						Adaptations: []node.Node{ | 						TraitAdaptationList: &stmt.TraitAdaptationList{ | ||||||
| 							&stmt.TraitUseAlias{ | 							Adaptations: []node.Node{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 								&stmt.TraitUseAlias{ | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Ref: &stmt.TraitMethodRef{ | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
|  | 									}, | ||||||
|  | 									Modifier: &node.Identifier{Value: "public"}, | ||||||
|  | 									Alias:    &node.Identifier{Value: "two"}, | ||||||
| 								}, | 								}, | ||||||
| 								Modifier: &node.Identifier{Value: "public"}, |  | ||||||
| 								Alias:    &node.Identifier{Value: "two"}, |  | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
| @ -1587,39 +1594,41 @@ func TestPhp7(t *testing.T) { | |||||||
| 								}, | 								}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 						Adaptations: []node.Node{ | 						TraitAdaptationList: &stmt.TraitAdaptationList{ | ||||||
| 							&stmt.TraitUsePrecedence{ | 							Adaptations: []node.Node{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 								&stmt.TraitUsePrecedence{ | ||||||
| 									Trait: &name.Name{ | 									Ref: &stmt.TraitMethodRef{ | ||||||
| 										Parts: []node.Node{ | 										Trait: &name.Name{ | ||||||
| 											&name.NamePart{Value: "Bar"}, | 											Parts: []node.Node{ | ||||||
|  | 												&name.NamePart{Value: "Bar"}, | ||||||
|  | 											}, | ||||||
| 										}, | 										}, | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
| 									}, | 									}, | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Insteadof: []node.Node{ | ||||||
| 								}, | 										&name.Name{ | ||||||
| 								Insteadof: []node.Node{ | 											Parts: []node.Node{ | ||||||
| 									&name.Name{ | 												&name.NamePart{Value: "Baz"}, | ||||||
| 										Parts: []node.Node{ | 											}, | ||||||
| 											&name.NamePart{Value: "Baz"}, |  | ||||||
| 										}, | 										}, | ||||||
| 									}, | 										&name.Name{ | ||||||
| 									&name.Name{ | 											Parts: []node.Node{ | ||||||
| 										Parts: []node.Node{ | 												&name.NamePart{Value: "Quux"}, | ||||||
| 											&name.NamePart{Value: "Quux"}, | 											}, | ||||||
| 										}, | 										}, | ||||||
| 									}, | 									}, | ||||||
| 								}, | 								}, | ||||||
| 							}, | 								&stmt.TraitUseAlias{ | ||||||
| 							&stmt.TraitUseAlias{ | 									Ref: &stmt.TraitMethodRef{ | ||||||
| 								Ref: &stmt.TraitMethodRef{ | 										Trait: &name.Name{ | ||||||
| 									Trait: &name.Name{ | 											Parts: []node.Node{ | ||||||
| 										Parts: []node.Node{ | 												&name.NamePart{Value: "Baz"}, | ||||||
| 											&name.NamePart{Value: "Baz"}, | 											}, | ||||||
| 										}, | 										}, | ||||||
|  | 										Method: &node.Identifier{Value: "one"}, | ||||||
| 									}, | 									}, | ||||||
| 									Method: &node.Identifier{Value: "one"}, | 									Alias: &node.Identifier{Value: "two"}, | ||||||
| 								}, | 								}, | ||||||
| 								Alias: &node.Identifier{Value: "two"}, |  | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
|  | |||||||
| @ -2066,9 +2066,10 @@ func (p *Printer) printStmtTraitUse(n node.Node) { | |||||||
| 	io.WriteString(p.w, "use ") | 	io.WriteString(p.w, "use ") | ||||||
| 	p.joinPrint(", ", nn.Traits) | 	p.joinPrint(", ", nn.Traits) | ||||||
| 
 | 
 | ||||||
| 	if nn.Adaptations != nil { | 	if nn.TraitAdaptationList != nil { | ||||||
|  | 		adaptations := nn.TraitAdaptationList.Adaptations | ||||||
| 		io.WriteString(p.w, " {\n") | 		io.WriteString(p.w, " {\n") | ||||||
| 		p.printNodes(nn.Adaptations) | 		p.printNodes(adaptations) | ||||||
| 		io.WriteString(p.w, "\n") | 		io.WriteString(p.w, "\n") | ||||||
| 		p.printIndent() | 		p.printIndent() | ||||||
| 		io.WriteString(p.w, "}") | 		io.WriteString(p.w, "}") | ||||||
|  | |||||||
| @ -3789,13 +3789,15 @@ func TestPrintStmtTraitAdaptations(t *testing.T) { | |||||||
| 					&name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, | 					&name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, | ||||||
| 					&name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, | 					&name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, | ||||||
| 				}, | 				}, | ||||||
| 				Adaptations: []node.Node{ | 				TraitAdaptationList: &stmt.TraitAdaptationList{ | ||||||
| 					&stmt.TraitUseAlias{ | 					Adaptations: []node.Node{ | ||||||
| 						Ref: &stmt.TraitMethodRef{ | 						&stmt.TraitUseAlias{ | ||||||
| 							Trait:  &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, | 							Ref: &stmt.TraitMethodRef{ | ||||||
| 							Method: &node.Identifier{Value: "a"}, | 								Trait:  &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, | ||||||
|  | 								Method: &node.Identifier{Value: "a"}, | ||||||
|  | 							}, | ||||||
|  | 							Alias: &node.Identifier{Value: "b"}, | ||||||
| 						}, | 						}, | ||||||
| 						Alias: &node.Identifier{Value: "b"}, |  | ||||||
| 					}, | 					}, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
|  | |||||||
| @ -152,7 +152,7 @@ func (nsr *NamespaceResolver) EnterNode(w walker.Walkable) bool { | |||||||
| 			nsr.ResolveName(t, "") | 			nsr.ResolveName(t, "") | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		for _, a := range n.Adaptations { | 		for _, a := range n.TraitAdaptationList.Adaptations { | ||||||
| 			switch aa := a.(type) { | 			switch aa := a.(type) { | ||||||
| 			case *stmt.TraitUsePrecedence: | 			case *stmt.TraitUsePrecedence: | ||||||
| 				refTrait := aa.Ref.(*stmt.TraitMethodRef).Trait | 				refTrait := aa.Ref.(*stmt.TraitMethodRef).Trait | ||||||
|  | |||||||
| @ -43,8 +43,8 @@ func TestResolveStaticCall(t *testing.T) { | |||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			&expr.StaticCall{ | 			&expr.StaticCall{ | ||||||
| 				Class: nameBC, | 				Class:        nameBC, | ||||||
| 				Call:  &node.Identifier{Value: "foo"}, | 				Call:         &node.Identifier{Value: "foo"}, | ||||||
| 				ArgumentList: &node.ArgumentList{}, | 				ArgumentList: &node.ArgumentList{}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| @ -134,7 +134,7 @@ func TestResolveNew(t *testing.T) { | |||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			&expr.New{ | 			&expr.New{ | ||||||
| 				Class: nameBC, | 				Class:        nameBC, | ||||||
| 				ArgumentList: &node.ArgumentList{}, | 				ArgumentList: &node.ArgumentList{}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| @ -242,7 +242,7 @@ func TestResolveFunctionCall(t *testing.T) { | |||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			&expr.FunctionCall{ | 			&expr.FunctionCall{ | ||||||
| 				Function: nameB, | 				Function:     nameB, | ||||||
| 				ArgumentList: &node.ArgumentList{}, | 				ArgumentList: &node.ArgumentList{}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| @ -323,11 +323,11 @@ func TestResolveGroupUse(t *testing.T) { | |||||||
| 				Constant: nameC, | 				Constant: nameC, | ||||||
| 			}, | 			}, | ||||||
| 			&expr.FunctionCall{ | 			&expr.FunctionCall{ | ||||||
| 				Function: nameF, | 				Function:     nameF, | ||||||
| 				ArgumentList: &node.ArgumentList{}, | 				ArgumentList: &node.ArgumentList{}, | ||||||
| 			}, | 			}, | ||||||
| 			&expr.FunctionCall{ | 			&expr.FunctionCall{ | ||||||
| 				Function: nameE, | 				Function:     nameE, | ||||||
| 				ArgumentList: &node.ArgumentList{}, | 				ArgumentList: &node.ArgumentList{}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| @ -368,20 +368,22 @@ func TestResolveTraitUse(t *testing.T) { | |||||||
| 					nameB, | 					nameB, | ||||||
| 					relativeNameB, | 					relativeNameB, | ||||||
| 				}, | 				}, | ||||||
| 				Adaptations: []node.Node{ | 				TraitAdaptationList: &stmt.TraitAdaptationList{ | ||||||
| 					&stmt.TraitUsePrecedence{ | 					Adaptations: []node.Node{ | ||||||
| 						Ref: &stmt.TraitMethodRef{ | 						&stmt.TraitUsePrecedence{ | ||||||
| 							Trait:  fullyQualifiedNameB, | 							Ref: &stmt.TraitMethodRef{ | ||||||
| 							Method: &node.Identifier{Value: "foo"}, | 								Trait:  fullyQualifiedNameB, | ||||||
|  | 								Method: &node.Identifier{Value: "foo"}, | ||||||
|  | 							}, | ||||||
|  | 							Insteadof: []node.Node{fullyQualifiedNameBC}, | ||||||
| 						}, | 						}, | ||||||
| 						Insteadof: []node.Node{fullyQualifiedNameBC}, | 						&stmt.TraitUseAlias{ | ||||||
| 					}, | 							Ref: &stmt.TraitMethodRef{ | ||||||
| 					&stmt.TraitUseAlias{ | 								Trait:  relativeNameBC, | ||||||
| 						Ref: &stmt.TraitMethodRef{ | 								Method: &node.Identifier{Value: "foo"}, | ||||||
| 							Trait:  relativeNameBC, | 							}, | ||||||
| 							Method: &node.Identifier{Value: "foo"}, | 							Alias: &node.Identifier{Value: "bar"}, | ||||||
| 						}, | 						}, | ||||||
| 						Alias: &node.Identifier{Value: "bar"}, |  | ||||||
| 					}, | 					}, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| @ -658,8 +660,8 @@ func TestResolveNamespaces(t *testing.T) { | |||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			&expr.StaticCall{ | 			&expr.StaticCall{ | ||||||
| 				Class: nameFG, | 				Class:        nameFG, | ||||||
| 				Call:  &node.Identifier{Value: "foo"}, | 				Call:         &node.Identifier{Value: "foo"}, | ||||||
| 				ArgumentList: &node.ArgumentList{}, | 				ArgumentList: &node.ArgumentList{}, | ||||||
| 			}, | 			}, | ||||||
| 			&stmt.Namespace{ | 			&stmt.Namespace{ | ||||||
| @ -676,13 +678,13 @@ func TestResolveNamespaces(t *testing.T) { | |||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
| 					&expr.StaticCall{ | 					&expr.StaticCall{ | ||||||
| 						Class:     relativeNameCE, | 						Class:        relativeNameCE, | ||||||
| 						Call:      &node.Identifier{Value: "foo"}, | 						Call:         &node.Identifier{Value: "foo"}, | ||||||
| 						ArgumentList: &node.ArgumentList{}, | 						ArgumentList: &node.ArgumentList{}, | ||||||
| 					}, | 					}, | ||||||
| 					&expr.StaticCall{ | 					&expr.StaticCall{ | ||||||
| 						Class:     nameCF, | 						Class:        nameCF, | ||||||
| 						Call:      &node.Identifier{Value: "foo"}, | 						Call:         &node.Identifier{Value: "foo"}, | ||||||
| 						ArgumentList: &node.ArgumentList{}, | 						ArgumentList: &node.ArgumentList{}, | ||||||
| 					}, | 					}, | ||||||
| 				}, | 				}, | ||||||
| @ -708,8 +710,8 @@ func TestResolveStaticCallDinamicClassName(t *testing.T) { | |||||||
| 	ast := &stmt.StmtList{ | 	ast := &stmt.StmtList{ | ||||||
| 		Stmts: []node.Node{ | 		Stmts: []node.Node{ | ||||||
| 			&expr.StaticCall{ | 			&expr.StaticCall{ | ||||||
| 				Class: &expr.Variable{VarName: &node.Identifier{Value: "foo"}}, | 				Class:        &expr.Variable{VarName: &node.Identifier{Value: "foo"}}, | ||||||
| 				Call:  &node.Identifier{Value: "foo"}, | 				Call:         &node.Identifier{Value: "foo"}, | ||||||
| 				ArgumentList: &node.ArgumentList{}, | 				ArgumentList: &node.ArgumentList{}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user