From 3f12ada3114cd2a1477d8e7573709a33bc1176ad Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Wed, 9 Sep 2020 22:53:51 +0300 Subject: [PATCH] [refactoring] update ast structure of "Static", "Global" and "StaticVar" nodes --- internal/php5/php5.go | Bin 291414 -> 291575 bytes internal/php5/php5.y | 110 +++++++++++++++--------- internal/php7/php7.go | Bin 244258 -> 243341 bytes internal/php7/php7.y | 78 +++++++++-------- pkg/ast/node.go | 15 +++- pkg/ast/visitor/filter_tokens.go | 16 ++++ pkg/printer/printer.go | 74 ++++++++-------- pkg/printer/printer_parsed_php5_test.go | 9 +- pkg/printer/printer_parsed_php7_test.go | 6 +- pkg/printer/printer_test.go | 4 +- 10 files changed, 185 insertions(+), 127 deletions(-) diff --git a/internal/php5/php5.go b/internal/php5/php5.go index d7d7936f765403286ef4cce4244492efe9713623..8f172745feeccc6f547808e220c2b98adb0ae9c5 100644 GIT binary patch delta 10634 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 DRyj(P delta 10508 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 B?z{j1 diff --git a/internal/php5/php5.y b/internal/php5/php5.y index be091ce..a912b40 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -239,7 +239,7 @@ import ( %type optional_class_type parameter class_entry_type class_statement class_constant_declaration %type trait_use_statement function_call_parameter trait_adaptation_statement trait_precedence trait_alias %type trait_method_reference_fully_qualified trait_method_reference trait_modifiers member_modifier method -%type static_scalar_value static_operation +%type static_scalar_value static_operation static_var_list global_var_list %type ctor_arguments function_call_parameter_list %type trait_adaptations %type switch_case_list @@ -253,7 +253,7 @@ import ( %type lexical_vars %type top_statement_list namespace_name use_declarations use_function_declarations use_const_declarations -%type inner_statement_list global_var_list static_var_list encaps_list isset_variables non_empty_array_pair_list +%type inner_statement_list encaps_list isset_variables non_empty_array_pair_list %type array_pair_list assignment_list lexical_var_list elseif_list new_elseif_list non_empty_for_expr %type for_expr case_list echo_expr_list unset_variables declare_list catch_statement additional_catches %type non_empty_additional_catches parameter_list non_empty_parameter_list class_statement_list @@ -1036,27 +1036,21 @@ unticked_statement: } | T_GLOBAL global_var_list ';' { - $$ = &ast.StmtGlobal{ast.Node{}, $2} + $2.(*ast.StmtGlobal).GlobalTkn = $1 + $2.(*ast.StmtGlobal).SemiColonTkn = $3 + $2.(*ast.StmtGlobal).SeparatorTkns = append($2.(*ast.StmtGlobal).SeparatorTkns, nil) + $2.(*ast.StmtGlobal).Node.Position = position.NewTokensPosition($1, $3) - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.VarList, $3.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) + $$ = $2 } | T_STATIC static_var_list ';' { - $$ = &ast.StmtStatic{ast.Node{}, $2} + $2.(*ast.StmtStatic).StaticTkn = $1 + $2.(*ast.StmtStatic).SemiColonTkn = $3 + $2.(*ast.StmtStatic).SeparatorTkns = append($2.(*ast.StmtStatic).SeparatorTkns, nil) + $2.(*ast.StmtStatic).Node.Position = position.NewTokensPosition($1, $3) - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.VarList, $3.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) + $$ = $2 } | T_ECHO echo_expr_list ';' { @@ -2218,14 +2212,16 @@ function_call_parameter: global_var_list: global_var_list ',' global_var { - $$ = append($1, $3) + $1.(*ast.StmtGlobal).Vars = append($1.(*ast.StmtGlobal).Vars, $3) + $1.(*ast.StmtGlobal).SeparatorTkns = append($1.(*ast.StmtGlobal).SeparatorTkns, $2) - // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) + $$ = $1 } | global_var { - $$ = []ast.Vertex{$1} + $$ = &ast.StmtGlobal{ + Vars: []ast.Vertex{$1}, + } } ; @@ -2273,65 +2269,95 @@ static_var_list: { identifier := &ast.Identifier{ast.Node{}, $3.Value} variable := &ast.ExprVariable{ast.Node{}, identifier} - staticVar := &ast.StmtStaticVar{ast.Node{}, variable, nil} - $$ = append($1, staticVar) + + $1.(*ast.StmtStatic).Vars = append($1.(*ast.StmtStatic).Vars, &ast.StmtStaticVar{ + Node: ast.Node{ + Position: position.NewTokenPosition($3), + }, + Var: variable, + }) + $1.(*ast.StmtStatic).SeparatorTkns = append($1.(*ast.StmtStatic).SeparatorTkns, $2) + + $$ = $1 // save position identifier.GetNode().Position = position.NewTokenPosition($3) variable.GetNode().Position = position.NewTokenPosition($3) - staticVar.GetNode().Position = position.NewTokenPosition($3) // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating(staticVar, token.Start, $3.SkippedTokens) + yylex.(*Parser).setFreeFloating(variable, token.Start, $3.SkippedTokens) } | static_var_list ',' T_VARIABLE '=' static_scalar { identifier := &ast.Identifier{ast.Node{}, $3.Value} variable := &ast.ExprVariable{ast.Node{}, identifier} - staticVar := &ast.StmtStaticVar{ast.Node{}, variable, $5} - $$ = append($1, staticVar) + + $1.(*ast.StmtStatic).Vars = append($1.(*ast.StmtStatic).Vars, &ast.StmtStaticVar{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($3, $5), + }, + Var: variable, + EqualTkn: $4, + Expr: $5, + }) + $1.(*ast.StmtStatic).SeparatorTkns = append($1.(*ast.StmtStatic).SeparatorTkns, $2) + + $$ = $1 // save position identifier.GetNode().Position = position.NewTokenPosition($3) variable.GetNode().Position = position.NewTokenPosition($3) - staticVar.GetNode().Position = position.NewTokenNodePosition($3, $5) // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating(staticVar, token.Start, $3.SkippedTokens) - yylex.(*Parser).setFreeFloating(staticVar, token.Var, $4.SkippedTokens) + yylex.(*Parser).setFreeFloating(variable, token.Start, $3.SkippedTokens) } | T_VARIABLE { identifier := &ast.Identifier{ast.Node{}, $1.Value} variable := &ast.ExprVariable{ast.Node{}, identifier} - staticVar := &ast.StmtStaticVar{ast.Node{}, variable, nil} - $$ = []ast.Vertex{staticVar} + + $$ = &ast.StmtStatic{ + Vars: []ast.Vertex{ + &ast.StmtStaticVar{ + Node: ast.Node{ + Position: position.NewTokenPosition($1), + }, + Var: variable, + }, + }, + } // save position identifier.GetNode().Position = position.NewTokenPosition($1) variable.GetNode().Position = position.NewTokenPosition($1) - staticVar.GetNode().Position = position.NewTokenPosition($1) // save comments - yylex.(*Parser).setFreeFloating(staticVar, token.Start, $1.SkippedTokens) + yylex.(*Parser).setFreeFloating(variable, token.Start, $1.SkippedTokens) } | T_VARIABLE '=' static_scalar { identifier := &ast.Identifier{ast.Node{}, $1.Value} variable := &ast.ExprVariable{ast.Node{}, identifier} - staticVar := &ast.StmtStaticVar{ast.Node{}, variable, $3} - $$ = []ast.Vertex{staticVar} + + $$ = &ast.StmtStatic{ + Vars: []ast.Vertex{ + &ast.StmtStaticVar{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($1, $3), + }, + Var: variable, + EqualTkn: $2, + Expr: $3, + }, + }, + } // save position identifier.GetNode().Position = position.NewTokenPosition($1) variable.GetNode().Position = position.NewTokenPosition($1) - staticVar.GetNode().Position = position.NewTokenNodePosition($1, $3) // save comments - yylex.(*Parser).setFreeFloating(staticVar, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating(staticVar, token.Var, $2.SkippedTokens) + yylex.(*Parser).setFreeFloating(variable, token.Start, $1.SkippedTokens) } ; diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 7ce01b9fe68ae02018ccf855e505cf9f3707a36c..e26b9a2073fb49ece3b1bbcde0a46629e8ef4809 100644 GIT binary patch delta 12945 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 LuvF5d4UYFeCoI&8 diff --git a/internal/php7/php7.y b/internal/php7/php7.y index 45741de..a095f9a 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -241,8 +241,8 @@ import ( %type const_decl inner_statement %type expr optional_expr %type declare_statement finally_statement unset_variable variable -%type parameter optional_type argument expr_without_variable global_var -%type static_var class_statement trait_adaptation trait_precedence trait_alias +%type parameter optional_type argument expr_without_variable global_var_list global_var +%type static_var_list static_var class_statement trait_adaptation trait_precedence trait_alias %type absolute_trait_method_reference trait_method_reference property echo_expr %type new_expr anonymous_class class_name class_name_reference simple_variable %type internal_functions_in_yacc @@ -275,8 +275,8 @@ import ( %type encaps_list backticks_expr namespace_name catch_name_list catch_list class_const_list -%type const_list echo_expr_list for_exprs non_empty_for_exprs global_var_list -%type unprefixed_use_declarations inline_use_declarations property_list static_var_list +%type const_list echo_expr_list for_exprs non_empty_for_exprs +%type unprefixed_use_declarations inline_use_declarations property_list %type case_list trait_adaptation_list unset_variables %type use_declarations lexical_var_list isset_variables non_empty_array_pair_list %type array_pair_list non_empty_argument_list top_statement_list @@ -952,27 +952,21 @@ statement: } | T_GLOBAL global_var_list ';' { - $$ = &ast.StmtGlobal{ast.Node{}, $2} + $2.(*ast.StmtGlobal).GlobalTkn = $1 + $2.(*ast.StmtGlobal).SemiColonTkn = $3 + $2.(*ast.StmtGlobal).SeparatorTkns = append($2.(*ast.StmtGlobal).SeparatorTkns, nil) + $2.(*ast.StmtGlobal).Node.Position = position.NewTokensPosition($1, $3) - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.VarList, $3.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) + $$ = $2 } | T_STATIC static_var_list ';' { - $$ = &ast.StmtStatic{ast.Node{}, $2} + $2.(*ast.StmtStatic).StaticTkn = $1 + $2.(*ast.StmtStatic).SemiColonTkn = $3 + $2.(*ast.StmtStatic).SeparatorTkns = append($2.(*ast.StmtStatic).SeparatorTkns, nil) + $2.(*ast.StmtStatic).Node.Position = position.NewTokensPosition($1, $3) - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.VarList, $3.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) + $$ = $2 } | T_ECHO echo_expr_list ';' { @@ -2063,14 +2057,16 @@ argument: global_var_list: global_var_list ',' global_var { - $$ = append($1, $3) + $1.(*ast.StmtGlobal).Vars = append($1.(*ast.StmtGlobal).Vars, $3) + $1.(*ast.StmtGlobal).SeparatorTkns = append($1.(*ast.StmtGlobal).SeparatorTkns, $2) - // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) + $$ = $1 } | global_var { - $$ = []ast.Vertex{$1} + $$ = &ast.StmtGlobal{ + Vars: []ast.Vertex{$1}, + } } ; @@ -2084,14 +2080,16 @@ global_var: static_var_list: static_var_list ',' static_var { - $$ = append($1, $3) + $1.(*ast.StmtStatic).Vars = append($1.(*ast.StmtStatic).Vars, $3) + $1.(*ast.StmtStatic).SeparatorTkns = append($1.(*ast.StmtStatic).SeparatorTkns, $2) - // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) + $$ = $1 } | static_var { - $$ = []ast.Vertex{$1} + $$ = &ast.StmtStatic{ + Vars: []ast.Vertex{$1}, + } } ; @@ -2100,30 +2098,40 @@ static_var: { identifier := &ast.Identifier{ast.Node{}, $1.Value} variable := &ast.ExprVariable{ast.Node{}, identifier} - $$ = &ast.StmtStaticVar{ast.Node{}, variable, nil} + + $$ = &ast.StmtStaticVar{ + Node: ast.Node{ + Position: position.NewTokenPosition($1), + }, + Var: variable, + } // save position identifier.GetNode().Position = position.NewTokenPosition($1) variable.GetNode().Position = position.NewTokenPosition($1) - $$.GetNode().Position = position.NewTokenPosition($1) // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + yylex.(*Parser).setFreeFloating(variable, token.Start, $1.SkippedTokens) } | T_VARIABLE '=' expr { identifier := &ast.Identifier{ast.Node{}, $1.Value} variable := &ast.ExprVariable{ast.Node{}, identifier} - $$ = &ast.StmtStaticVar{ast.Node{}, variable, $3} + $$ = &ast.StmtStaticVar{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($1, $3), + }, + Var: variable, + EqualTkn: $2, + Expr: $3, + } // save position identifier.GetNode().Position = position.NewTokenPosition($1) variable.GetNode().Position = position.NewTokenPosition($1) - $$.GetNode().Position = position.NewTokenNodePosition($1, $3) // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Var, $2.SkippedTokens) + yylex.(*Parser).setFreeFloating(variable, token.Start, $1.SkippedTokens) } ; diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 1bed711..1aa3120 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -476,7 +476,10 @@ func (n *StmtFunction) Accept(v NodeVisitor) { // StmtGlobal node type StmtGlobal struct { Node - Vars []Vertex + GlobalTkn *token.Token + Vars []Vertex + SeparatorTkns []*token.Token + SemiColonTkn *token.Token } func (n *StmtGlobal) Accept(v NodeVisitor) { @@ -630,7 +633,10 @@ func (n *StmtReturn) Accept(v NodeVisitor) { // StmtStatic node type StmtStatic struct { Node - Vars []Vertex + StaticTkn *token.Token + Vars []Vertex + SeparatorTkns []*token.Token + SemiColonTkn *token.Token } func (n *StmtStatic) Accept(v NodeVisitor) { @@ -640,8 +646,9 @@ func (n *StmtStatic) Accept(v NodeVisitor) { // StmtStaticVar node type StmtStaticVar struct { Node - Var Vertex - Expr Vertex + Var Vertex + EqualTkn *token.Token + Expr Vertex } func (n *StmtStaticVar) Accept(v NodeVisitor) { diff --git a/pkg/ast/visitor/filter_tokens.go b/pkg/ast/visitor/filter_tokens.go index 91f6ddd..c0f9ef5 100644 --- a/pkg/ast/visitor/filter_tokens.go +++ b/pkg/ast/visitor/filter_tokens.go @@ -178,3 +178,19 @@ func (v *FilterTokens) StmtReturn(n *ast.StmtReturn) { n.ReturnTkn = nil n.SemiColonTkn = nil } + +func (v *FilterTokens) StmtGlobal(n *ast.StmtGlobal) { + n.GlobalTkn = nil + n.SeparatorTkns = nil + n.SemiColonTkn = nil +} + +func (v *FilterTokens) StmtStatic(n *ast.StmtStatic) { + n.StaticTkn = nil + n.SeparatorTkns = nil + n.SemiColonTkn = nil +} + +func (v *FilterTokens) StmtStaticVar(n *ast.StmtStaticVar) { + n.EqualTkn = nil +} diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index 469a837..e7da279 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -65,6 +65,26 @@ func (p *Printer) joinPrintRefactored(glue string, nn []ast.Vertex) { } } +func (p *Printer) printSeparatedList(nodeList []ast.Vertex, separatorList []*token.Token, def string) { + var separators []*token.Token + + if cap(separatorList) >= len(nodeList) { + separators = separatorList[:len(nodeList)] + } else { + separators = make([]*token.Token, len(nodeList)) + copy(separators, separatorList) + } + + for k, n := range nodeList { + p.Print(n) + if k < len(nodeList)-1 { + p.printToken(separators[k], def) + } else { + p.printToken(separators[k], "") + } + } +} + func (p *Printer) printNodes(nn []ast.Vertex) { for _, n := range nn { p.Print(n) @@ -2476,20 +2496,11 @@ func (p *Printer) printStmtFunction(n ast.Vertex) { p.printFreeFloating(nn, token.End) } -func (p *Printer) printStmtGlobal(n ast.Vertex) { - nn := n.(*ast.StmtGlobal) - p.printFreeFloating(nn, token.Start) - - io.WriteString(p.w, "global") - p.joinPrint(",", nn.Vars) - p.printFreeFloating(nn, token.VarList) - - p.printFreeFloating(nn, token.SemiColon) - if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, token.End) +func (p *Printer) printStmtGlobal(n *ast.StmtGlobal) { + p.printToken(n.GlobalTkn, "global") + p.bufStart = " " + p.printSeparatedList(n.Vars, n.SeparatorTkns, ",") + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtGoto(n ast.Vertex) { @@ -2701,35 +2712,20 @@ func (p *Printer) printStmtReturn(n *ast.StmtReturn) { p.printToken(n.SemiColonTkn, ";") } -func (p *Printer) printStmtStaticVar(n ast.Vertex) { - nn := n.(*ast.StmtStaticVar) - p.printFreeFloating(nn, token.Start) +func (p *Printer) printStmtStaticVar(n *ast.StmtStaticVar) { + p.Print(n.Var) - p.Print(nn.Var) - - if nn.Expr != nil { - p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "=") - p.Print(nn.Expr) + if n.Expr != nil { + p.printToken(n.EqualTkn, "=") + p.Print(n.Expr) } - - p.printFreeFloating(nn, token.End) } -func (p *Printer) printStmtStatic(n ast.Vertex) { - nn := n.(*ast.StmtStatic) - p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "static") - - p.joinPrint(",", nn.Vars) - p.printFreeFloating(nn, token.VarList) - - p.printFreeFloating(nn, token.SemiColon) - if n.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, token.End) +func (p *Printer) printStmtStatic(n *ast.StmtStatic) { + p.printToken(n.StaticTkn, "static") + p.bufStart = " " + p.printSeparatedList(n.Vars, n.SeparatorTkns, ",") + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtStmtList(n *ast.StmtStmtList) { diff --git a/pkg/printer/printer_parsed_php5_test.go b/pkg/printer/printer_parsed_php5_test.go index d5b2c0b..8a2ee8d 100644 --- a/pkg/printer/printer_parsed_php5_test.go +++ b/pkg/printer/printer_parsed_php5_test.go @@ -1036,7 +1036,8 @@ func TestParseAndPrintPhp5Function(t *testing.T) { } func TestParseAndPrintPhp5Global(t *testing.T) { - src := `