create ClassExtends ClassImplements InterfaceExtends nodes
This commit is contained in:
1289
php5/php5.go
1289
php5/php5.go
File diff suppressed because it is too large
Load Diff
44
php5/php5.y
44
php5/php5.y
@@ -19,11 +19,15 @@ import (
|
||||
%}
|
||||
|
||||
%union{
|
||||
node node.Node
|
||||
token *scanner.Token
|
||||
list []node.Node
|
||||
foreachVariable foreachVariable
|
||||
node node.Node
|
||||
token *scanner.Token
|
||||
list []node.Node
|
||||
foreachVariable foreachVariable
|
||||
simpleIndirectReference simpleIndirectReference
|
||||
|
||||
ClassExtends *stmt.ClassExtends
|
||||
ClassImplements *stmt.ClassImplements
|
||||
InterfaceExtends *stmt.InterfaceExtends
|
||||
}
|
||||
|
||||
%type <token> $unk
|
||||
@@ -235,7 +239,7 @@ import (
|
||||
%type <node> exit_expr yield_expr function_declaration_statement class_declaration_statement constant_declaration
|
||||
%type <node> else_single new_else_single unset_variable declare_statement
|
||||
%type <node> finally_statement additional_catch unticked_function_declaration_statement unticked_class_declaration_statement
|
||||
%type <node> optional_class_type parameter class_entry_type extends_from class_statement class_constant_declaration
|
||||
%type <node> optional_class_type parameter class_entry_type class_statement class_constant_declaration
|
||||
%type <node> trait_use_statement function_call_parameter trait_adaptation_statement trait_precedence trait_alias
|
||||
%type <node> trait_method_reference_fully_qualified trait_method_reference trait_modifiers member_modifier method
|
||||
%type <node> static_scalar_value static_operation
|
||||
@@ -244,13 +248,16 @@ import (
|
||||
%type <node> switch_case_list
|
||||
%type <node> method_body
|
||||
%type <node> foreach_statement for_statement while_statement
|
||||
%type <ClassExtends> extends_from
|
||||
%type <ClassImplements> implements_list
|
||||
%type <InterfaceExtends> interface_extends_list
|
||||
|
||||
%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> array_pair_list assignment_list lexical_var_list lexical_vars elseif_list new_elseif_list non_empty_for_expr
|
||||
%type <list> for_expr case_list echo_expr_list unset_variables declare_list catch_statement additional_catches
|
||||
%type <list> non_empty_additional_catches parameter_list non_empty_parameter_list class_statement_list implements_list
|
||||
%type <list> class_statement_list variable_modifiers method_modifiers class_variable_declaration interface_extends_list
|
||||
%type <list> non_empty_additional_catches parameter_list non_empty_parameter_list class_statement_list
|
||||
%type <list> class_statement_list variable_modifiers method_modifiers class_variable_declaration
|
||||
%type <list> interface_list non_empty_function_call_parameter_list trait_list trait_adaptation_list non_empty_trait_adaptation_list
|
||||
%type <list> trait_reference_list non_empty_member_modifiers backticks_expr static_array_pair_list non_empty_static_array_pair_list
|
||||
|
||||
@@ -912,7 +919,7 @@ catch_statement:
|
||||
variable := expr.NewVariable(identifier)
|
||||
yylex.(*Parser).positions.AddPosition(variable, yylex.(*Parser).positionBuilder.NewTokenPosition($4))
|
||||
yylex.(*Parser).comments.AddComments(variable, $4.Comments())
|
||||
|
||||
|
||||
catch := stmt.NewCatch([]node.Node{$3}, variable, $7)
|
||||
yylex.(*Parser).positions.AddPosition(catch, yylex.(*Parser).positionBuilder.NewTokensPosition($1, $8))
|
||||
yylex.(*Parser).comments.AddComments(catch, $1.Comments())
|
||||
@@ -1085,7 +1092,12 @@ extends_from:
|
||||
/* empty */
|
||||
{ $$ = nil }
|
||||
| T_EXTENDS fully_qualified_class_name
|
||||
{ $$ = $2 }
|
||||
{
|
||||
$$ = stmt.NewClassExtends($2);
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokenNodePosition($1, $2))
|
||||
}
|
||||
;
|
||||
|
||||
interface_entry:
|
||||
@@ -1097,14 +1109,24 @@ interface_extends_list:
|
||||
/* empty */
|
||||
{ $$ = nil }
|
||||
| T_EXTENDS interface_list
|
||||
{ $$ = $2 }
|
||||
{
|
||||
$$ = stmt.NewInterfaceExtends($2);
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokenNodeListPosition($1, $2))
|
||||
}
|
||||
;
|
||||
|
||||
implements_list:
|
||||
/* empty */
|
||||
{ $$ = nil }
|
||||
| T_IMPLEMENTS interface_list
|
||||
{ $$ = $2 }
|
||||
{
|
||||
$$ = stmt.NewClassImplements($2);
|
||||
|
||||
// save position
|
||||
yylex.(*Parser).positions.AddPosition($$, yylex.(*Parser).positionBuilder.NewTokenNodeListPosition($1, $2))
|
||||
}
|
||||
;
|
||||
|
||||
interface_list:
|
||||
|
||||
@@ -852,20 +852,8 @@ func TestPhp5(t *testing.T) {
|
||||
Modifiers: []node.Node{
|
||||
&node.Identifier{Value: "final"},
|
||||
},
|
||||
Extends: &name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "bar"},
|
||||
},
|
||||
},
|
||||
Stmts: []node.Node{},
|
||||
},
|
||||
&stmt.Class{
|
||||
ClassName: &node.Identifier{Value: "foo"},
|
||||
Modifiers: []node.Node{
|
||||
&node.Identifier{Value: "final"},
|
||||
},
|
||||
Implements: []node.Node{
|
||||
&name.Name{
|
||||
Extends: &stmt.ClassExtends{
|
||||
ClassName: &name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "bar"},
|
||||
},
|
||||
@@ -878,15 +866,33 @@ func TestPhp5(t *testing.T) {
|
||||
Modifiers: []node.Node{
|
||||
&node.Identifier{Value: "final"},
|
||||
},
|
||||
Implements: []node.Node{
|
||||
&name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "bar"},
|
||||
Implements: &stmt.ClassImplements{
|
||||
InterfaceNames: []node.Node{
|
||||
&name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "bar"},
|
||||
},
|
||||
},
|
||||
},
|
||||
&name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "baz"},
|
||||
},
|
||||
Stmts: []node.Node{},
|
||||
},
|
||||
&stmt.Class{
|
||||
ClassName: &node.Identifier{Value: "foo"},
|
||||
Modifiers: []node.Node{
|
||||
&node.Identifier{Value: "final"},
|
||||
},
|
||||
Implements: &stmt.ClassImplements{
|
||||
InterfaceNames: []node.Node{
|
||||
&name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "bar"},
|
||||
},
|
||||
},
|
||||
&name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "baz"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -1236,10 +1242,12 @@ func TestPhp5(t *testing.T) {
|
||||
&stmt.Interface{
|
||||
PhpDocComment: "",
|
||||
InterfaceName: &node.Identifier{Value: "Foo"},
|
||||
Extends: []node.Node{
|
||||
&name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "Bar"},
|
||||
Extends: &stmt.InterfaceExtends{
|
||||
InterfaceNames: []node.Node{
|
||||
&name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "Bar"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -1248,15 +1256,17 @@ func TestPhp5(t *testing.T) {
|
||||
&stmt.Interface{
|
||||
PhpDocComment: "",
|
||||
InterfaceName: &node.Identifier{Value: "Foo"},
|
||||
Extends: []node.Node{
|
||||
&name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "Bar"},
|
||||
Extends: &stmt.InterfaceExtends{
|
||||
InterfaceNames: []node.Node{
|
||||
&name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "Bar"},
|
||||
},
|
||||
},
|
||||
},
|
||||
&name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "Baz"},
|
||||
&name.Name{
|
||||
Parts: []node.Node{
|
||||
&name.NamePart{Value: "Baz"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user