From 2d240e9475f4cf3061eb9f93d9abdbd1dd2a9c28 Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Tue, 1 Dec 2020 11:12:56 +0200 Subject: [PATCH] [refactoring] update ast structure of "ClosureUse", "ConstFetch", "Empty" and "ErrorSuppress" nodes --- internal/php5/php5.go | Bin 279588 -> 278207 bytes internal/php5/php5.y | 293 +++++++++++++++++++++--------------------- internal/php7/php7.go | Bin 229978 -> 229440 bytes internal/php7/php7.y | 80 ++++++------ pkg/ast/node.go | 14 +- 5 files changed, 194 insertions(+), 193 deletions(-) diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 400b6321ab4933a50290f567732a20071c11e3c0..f22f3388817b3244709fc02c5000a8c71a482f22 100644 GIT binary patch delta 5809 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 O8~a%ef}R{?dH)I1-mxnH diff --git a/internal/php5/php5.y b/internal/php5/php5.y index e06b9ac..d38e937 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -239,7 +239,7 @@ import ( %type static_scalar_value static_operation static_var_list global_var_list %type ctor_arguments function_call_parameter_list echo_expr_list class_variable_declaration %type trait_adaptations unset_variables declare_list non_empty_array_pair_list array_pair_list -%type switch_case_list non_empty_function_call_parameter_list assignment_list +%type switch_case_list non_empty_function_call_parameter_list assignment_list lexical_var_list %type method_body trait_reference_list static_array_pair_list non_empty_static_array_pair_list %type foreach_statement for_statement while_statement %type foreach_variable foreach_optional_arg @@ -250,7 +250,7 @@ import ( %type top_statement_list namespace_name use_declarations use_function_declarations use_const_declarations %type inner_statement_list encaps_list isset_variables -%type lexical_var_list elseif_list new_elseif_list non_empty_for_expr +%type elseif_list new_elseif_list non_empty_for_expr %type for_expr case_list catch_statement additional_catches %type non_empty_additional_catches parameter_list non_empty_parameter_list class_statement_list %type class_statement_list variable_modifiers method_modifiers @@ -3890,13 +3890,13 @@ expr_without_variable: } | '@' expr { - $$ = &ast.ExprErrorSuppress{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $2) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ExprErrorSuppress{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($1, $2), + }, + AtTkn: $1, + Expr: $2, + } } | scalar { @@ -4121,98 +4121,107 @@ lexical_vars: } | T_USE '(' lexical_var_list ')' { - $$ = &ast.ExprClosureUse{ast.Node{}, $3} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $4) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Use, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.LexicalVarList, $4.SkippedTokens) + $$ = &ast.ExprClosureUse{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $4), + }, + UseTkn: $1, + OpenParenthesisTkn: $2, + Uses: $3.(*ast.ParserSeparatedList).Items, + SeparatorTkns: $3.(*ast.ParserSeparatedList).SeparatorTkns, + CloseParenthesisTkn: $4, + } } ; lexical_var_list: lexical_var_list ',' T_VARIABLE { - identifier := &ast.Identifier{ + variable := &ast.ExprVariable{ Node: ast.Node{ Position: position.NewTokenPosition($3), }, - IdentifierTkn: $3, - Value: $3.Value, + VarName: &ast.Identifier{ + Node: ast.Node{ + Position: position.NewTokenPosition($3), + }, + IdentifierTkn: $3, + Value: $3.Value, + }, } - variable := &ast.ExprVariable{ast.Node{}, identifier} - $$ = append($1, variable) - // save position - variable.GetNode().Position = position.NewTokenPosition($3) + $1.(*ast.ParserSeparatedList).SeparatorTkns = append($1.(*ast.ParserSeparatedList).SeparatorTkns, $2) + $1.(*ast.ParserSeparatedList).Items = append($1.(*ast.ParserSeparatedList).Items, variable) - // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating(variable, token.Start, $3.SkippedTokens) + $$ = $1 } | lexical_var_list ',' '&' T_VARIABLE { - identifier := &ast.Identifier{ + reference := &ast.ExprReference{ Node: ast.Node{ - Position: position.NewTokenPosition($4), + Position: position.NewTokensPosition($3, $4), + }, + Var: &ast.ExprVariable{ + Node: ast.Node{ + Position: position.NewTokenPosition($4), + }, + VarName: &ast.Identifier{ + Node: ast.Node{ + Position: position.NewTokenPosition($4), + }, + IdentifierTkn: $4, + Value: $4.Value, + }, }, - IdentifierTkn: $4, - Value: $4.Value, } - variable := &ast.ExprVariable{ast.Node{}, identifier} - reference := &ast.ExprReference{ast.Node{}, variable} - $$ = append($1, reference) - // save position - variable.GetNode().Position = position.NewTokenPosition($4) - reference.GetNode().Position = position.NewTokensPosition($3, $4) + $1.(*ast.ParserSeparatedList).SeparatorTkns = append($1.(*ast.ParserSeparatedList).SeparatorTkns, $2) + $1.(*ast.ParserSeparatedList).Items = append($1.(*ast.ParserSeparatedList).Items, reference) - // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating(reference, token.Start, $3.SkippedTokens) - yylex.(*Parser).setFreeFloating(variable, token.Start, $4.SkippedTokens) + $$ = $1 } | T_VARIABLE { - identifier := &ast.Identifier{ - Node: ast.Node{ - Position: position.NewTokenPosition($1), + $$ = &ast.ParserSeparatedList{ + Items: []ast.Vertex{ + &ast.ExprVariable{ + Node: ast.Node{ + Position: position.NewTokenPosition($1), + }, + VarName: &ast.Identifier{ + Node: ast.Node{ + Position: position.NewTokenPosition($1), + }, + IdentifierTkn: $1, + Value: $1.Value, + }, + }, }, - IdentifierTkn: $1, - Value: $1.Value, } - variable := &ast.ExprVariable{ast.Node{}, identifier} - $$ = []ast.Vertex{variable} - - // save position - variable.GetNode().Position = position.NewTokenPosition($1) - - // save comments - yylex.(*Parser).setFreeFloating(variable, token.Start, $1.SkippedTokens) } | '&' T_VARIABLE { - identifier := &ast.Identifier{ - Node: ast.Node{ - Position: position.NewTokenPosition($2), + $$ = &ast.ParserSeparatedList{ + Items: []ast.Vertex{ + &ast.ExprReference{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $2), + }, + Var: &ast.ExprVariable{ + Node: ast.Node{ + Position: position.NewTokenPosition($2), + }, + VarName: &ast.Identifier{ + Node: ast.Node{ + Position: position.NewTokenPosition($2), + }, + IdentifierTkn: $2, + Value: $2.Value, + }, + }, + }, }, - IdentifierTkn: $2, - Value: $2.Value, } - variable := &ast.ExprVariable{ast.Node{}, identifier} - reference := &ast.ExprReference{ast.Node{}, variable} - $$ = []ast.Vertex{reference} - - // save position - variable.GetNode().Position = position.NewTokenPosition($2) - reference.GetNode().Position = position.NewTokensPosition($1, $2) - - // save comments - yylex.(*Parser).setFreeFloating(reference, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating(variable, token.Start, $2.SkippedTokens) } ; @@ -4700,45 +4709,48 @@ static_scalar_value: } | namespace_name { - name := &ast.NameName{ - Node: ast.Node{ + $$ = &ast.ExprConstFetch{ + Node: ast.Node{ Position: position.NewNodeListPosition($1), }, - Parts: $1, + Const: &ast.NameName{ + Node: ast.Node{ + Position: position.NewNodeListPosition($1), + }, + Parts: $1, + }, } - $$ = &ast.ExprConstFetch{ast.Node{}, name} - - // save position - $$.GetNode().Position = position.NewNodePosition(name) } | T_NAMESPACE T_NS_SEPARATOR namespace_name { - name := &ast.NameRelative{ - Node: ast.Node{ + $$ = &ast.ExprConstFetch{ + Node: ast.Node{ Position: position.NewTokenNodeListPosition($1, $3), }, - NsTkn: $1, - NsSeparatorTkn: $2, - Parts: $3, + Const: &ast.NameRelative{ + Node: ast.Node{ + Position: position.NewTokenNodeListPosition($1, $3), + }, + NsTkn: $1, + NsSeparatorTkn: $2, + Parts: $3, + }, } - $$ = &ast.ExprConstFetch{ast.Node{}, name} - - // save position - $$.GetNode().Position = position.NewTokenNodeListPosition($1, $3) } | T_NS_SEPARATOR namespace_name { - name := &ast.NameFullyQualified{ - Node: ast.Node{ + $$ = &ast.ExprConstFetch{ + Node: ast.Node{ Position: position.NewTokenNodeListPosition($1, $2), }, - NsSeparatorTkn: $1, - Parts: $2, + Const: &ast.NameFullyQualified{ + Node: ast.Node{ + Position: position.NewTokenNodeListPosition($1, $2), + }, + NsSeparatorTkn: $1, + Parts: $2, + }, } - $$ = &ast.ExprConstFetch{ast.Node{}, name} - - // save position - $$.GetNode().Position = position.NewTokenNodeListPosition($1, $2) } | T_ARRAY '(' static_array_pair_list ')' { @@ -5155,45 +5167,48 @@ general_constant: } | namespace_name { - name := &ast.NameName{ - Node: ast.Node{ + $$ = &ast.ExprConstFetch{ + Node: ast.Node{ Position: position.NewNodeListPosition($1), }, - Parts: $1, + Const: &ast.NameName{ + Node: ast.Node{ + Position: position.NewNodeListPosition($1), + }, + Parts: $1, + }, } - $$ = &ast.ExprConstFetch{ast.Node{}, name} - - // save position - $$.GetNode().Position = position.NewNodePosition(name) } | T_NAMESPACE T_NS_SEPARATOR namespace_name { - name := &ast.NameRelative{ - Node: ast.Node{ + $$ = &ast.ExprConstFetch{ + Node: ast.Node{ Position: position.NewTokenNodeListPosition($1, $3), }, - NsTkn: $1, - NsSeparatorTkn: $2, - Parts: $3, + Const: &ast.NameRelative{ + Node: ast.Node{ + Position: position.NewTokenNodeListPosition($1, $3), + }, + NsTkn: $1, + NsSeparatorTkn: $2, + Parts: $3, + }, } - $$ = &ast.ExprConstFetch{ast.Node{}, name} - - // save position - $$.GetNode().Position = position.NewNodePosition(name) } | T_NS_SEPARATOR namespace_name { - name := &ast.NameFullyQualified{ - Node: ast.Node{ + $$ = &ast.ExprConstFetch{ + Node: ast.Node{ Position: position.NewTokenNodeListPosition($1, $2), }, - NsSeparatorTkn: $1, - Parts: $2, + Const: &ast.NameFullyQualified{ + Node: ast.Node{ + Position: position.NewTokenNodeListPosition($1, $2), + }, + NsSeparatorTkn: $1, + Parts: $2, + }, } - $$ = &ast.ExprConstFetch{ast.Node{}, name} - - // save position - $$.GetNode().Position = position.NewNodePosition(name) } ; @@ -6316,43 +6331,27 @@ internal_functions_in_yacc: } | T_EMPTY '(' variable ')' { - exprBrackets := &ast.ParserBrackets{ + $$ = &ast.ExprEmpty{ Node: ast.Node{ - Position: position.NewTokensPosition($2, $4), + Position: position.NewTokensPosition($1, $4), }, - OpenBracketTkn: $2, - Child: $3, - CloseBracketTkn: $4, + EmptyTkn: $1, + OpenParenthesisTkn: $2, + Expr: $3, + CloseParenthesisTkn: $4, } - $$ = &ast.ExprEmpty{ast.Node{}, exprBrackets} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $4) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.SkippedTokens) - yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $4.SkippedTokens) } | T_EMPTY '(' expr ')' { - exprBrackets := &ast.ParserBrackets{ + $$ = &ast.ExprEmpty{ Node: ast.Node{ - Position: position.NewTokensPosition($2, $4), + Position: position.NewTokensPosition($1, $4), }, - OpenBracketTkn: $2, - Child: $3, - CloseBracketTkn: $4, + EmptyTkn: $1, + OpenParenthesisTkn: $2, + Expr: $3, + CloseParenthesisTkn: $4, } - $$ = &ast.ExprEmpty{ast.Node{}, exprBrackets} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $4) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.SkippedTokens) - yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $4.SkippedTokens) } | T_INCLUDE expr { diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 387a16334850235098a4fd2b51ca2f4a6243ed3c..c397bc814103acf0b0fc9db803b1ad29b7147dc6 100644 GIT binary patch delta 4022 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 diff --git a/internal/php7/php7.y b/internal/php7/php7.y index 7b12137..9c95662 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -248,7 +248,7 @@ import ( %type callable_expr callable_variable static_member new_variable %type encaps_var encaps_var_offset echo_expr_list catch_name_list name_list %type if_stmt const_list non_empty_argument_list property_list -%type alt_if_stmt +%type alt_if_stmt lexical_var_list %type if_stmt_without_else %type class_const_decl %type alt_if_stmt_without_else @@ -276,7 +276,7 @@ import ( %type for_exprs non_empty_for_exprs %type unprefixed_use_declarations inline_use_declarations %type case_list trait_adaptation_list -%type use_declarations lexical_var_list isset_variables +%type use_declarations isset_variables %type top_statement_list %type inner_statement_list parameter_list non_empty_parameter_list class_statement_list %type method_modifiers variable_modifiers @@ -3551,13 +3551,13 @@ expr_without_variable: } | '@' expr { - $$ = &ast.ExprErrorSuppress{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $2) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ExprErrorSuppress{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($1, $2), + }, + AtTkn: $1, + Expr: $2, + } } | scalar { @@ -3704,29 +3704,32 @@ lexical_vars: } | T_USE '(' lexical_var_list ')' { - $$ = &ast.ExprClosureUse{ast.Node{}, $3} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $4) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Use, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.LexicalVarList, $4.SkippedTokens) + $$ = &ast.ExprClosureUse{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $4), + }, + UseTkn: $1, + OpenParenthesisTkn: $2, + Uses: $3.(*ast.ParserSeparatedList).Items, + SeparatorTkns: $3.(*ast.ParserSeparatedList).SeparatorTkns, + CloseParenthesisTkn: $4, + } } ; lexical_var_list: lexical_var_list ',' lexical_var { - $$ = append($1, $3) + $1.(*ast.ParserSeparatedList).SeparatorTkns = append($1.(*ast.ParserSeparatedList).SeparatorTkns, $2) + $1.(*ast.ParserSeparatedList).Items = append($1.(*ast.ParserSeparatedList).Items, $3) - // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) + $$ = $1 } | lexical_var { - $$ = []ast.Vertex{$1} + $$ = &ast.ParserSeparatedList{ + Items: []ast.Vertex{$1}, + } } ; @@ -4102,13 +4105,12 @@ scalar: constant: name { - $$ = &ast.ExprConstFetch{ast.Node{}, $1} - - // save position - $$.GetNode().Position = position.NewNodePosition($1) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) + $$ = &ast.ExprConstFetch{ + Node: ast.Node{ + Position: position.NewNodePosition($1), + }, + Const: $1, + } } | class_name T_PAAMAYIM_NEKUDOTAYIM identifier { @@ -4898,23 +4900,15 @@ internal_functions_in_yacc: } | T_EMPTY '(' expr ')' { - exprBrackets := &ast.ParserBrackets{ + $$ = &ast.ExprEmpty{ Node: ast.Node{ - Position: position.NewTokensPosition($2, $4), + Position: position.NewTokensPosition($1, $4), }, - OpenBracketTkn: $2, - Child: $3, - CloseBracketTkn: $4, + EmptyTkn: $1, + OpenParenthesisTkn: $2, + Expr: $3, + CloseParenthesisTkn: $4, } - $$ = &ast.ExprEmpty{ast.Node{}, exprBrackets} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $4) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.SkippedTokens) - yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $4.SkippedTokens) } | T_INCLUDE expr { diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 31f5458..fb314cc 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -1066,7 +1066,11 @@ func (n *ExprClosure) Accept(v NodeVisitor) { // ExprClosureUse node type ExprClosureUse struct { Node - Uses []Vertex + UseTkn *token.Token + OpenParenthesisTkn *token.Token + Uses []Vertex + SeparatorTkns []*token.Token + CloseParenthesisTkn *token.Token } func (n *ExprClosureUse) Accept(v NodeVisitor) { @@ -1086,7 +1090,10 @@ func (n *ExprConstFetch) Accept(v NodeVisitor) { // ExprEmpty node type ExprEmpty struct { Node - Expr Vertex + EmptyTkn *token.Token + OpenParenthesisTkn *token.Token + Expr Vertex + CloseParenthesisTkn *token.Token } func (n *ExprEmpty) Accept(v NodeVisitor) { @@ -1096,7 +1103,8 @@ func (n *ExprEmpty) Accept(v NodeVisitor) { // ExprErrorSuppress node type ExprErrorSuppress struct { Node - Expr Vertex + AtTkn *token.Token + Expr Vertex } func (n *ExprErrorSuppress) Accept(v NodeVisitor) {