From 45e959056b126e2d57be3e90dfbb66b0783a3a9b Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Thu, 3 Dec 2020 22:04:59 +0200 Subject: [PATCH] [refactoring] update ast structure of "PostDec", "PostInc", "PreDec", "PreInc" and "New" nodes --- internal/php5/php5.go | Bin 279591 -> 279808 bytes internal/php5/php5.y | 105 ++++++++++++++++++++-------------- internal/php7/php7.go | Bin 229807 -> 228447 bytes internal/php7/php7.y | 96 +++++++++++++++++-------------- pkg/ast/node.go | 19 ++++-- pkg/ast/traverser/dfs.go | 10 ++-- pkg/printer/pretty_printer.go | 4 +- pkg/printer/printer.go | 8 +-- 8 files changed, 140 insertions(+), 102 deletions(-) diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 040152df5ef97c2523d9bcc8f0a116856255b177..5cc24595fa7d880d35b6fcd5a228215c7bd7aab9 100644 GIT binary patch delta 5896 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 agT7KX4DCk+&J9R02b=M^17NGabo~dtv3TVG delta 5807 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 diff --git a/internal/php5/php5.y b/internal/php5/php5.y index 1502664..bcdf386 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -3123,17 +3123,25 @@ instance_call: new_expr: T_NEW class_name_reference ctor_arguments { - if $3 != nil { - $$ = &ast.ExprNew{ast.Node{}, $2, $3.(*ast.ArgumentList)} - $$.GetNode().Position = position.NewTokenNodePosition($1, $3) + $$ = &ast.ExprNew{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($1, $3), + }, + NewTkn: $1, + Class: $2, + OpenParenthesisTkn: $3.(*ast.ArgumentList).OpenParenthesisTkn, + Arguments: $3.(*ast.ArgumentList).Arguments, + CloseParenthesisTkn: $3.(*ast.ArgumentList).OpenParenthesisTkn, + } } else { - $$ = &ast.ExprNew{ast.Node{}, $2, nil} - $$.GetNode().Position = position.NewTokenNodePosition($1, $2) + $$ = &ast.ExprNew{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($1, $2), + }, + Class: $2, + } } - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) } ; @@ -3195,12 +3203,27 @@ expr_without_variable: | variable '=' '&' T_NEW class_name_reference ctor_arguments { var _new *ast.ExprNew - - if $6 != nil { - _new = &ast.ExprNew{ast.Node{}, $5, $6.(*ast.ArgumentList)} + if $3 != nil { + _new = &ast.ExprNew{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($4, $6), + }, + NewTkn: $4, + Class: $5, + OpenParenthesisTkn: $6.(*ast.ArgumentList).OpenParenthesisTkn, + Arguments: $6.(*ast.ArgumentList).Arguments, + CloseParenthesisTkn: $6.(*ast.ArgumentList).OpenParenthesisTkn, + } } else { - _new = &ast.ExprNew{ast.Node{}, $5, nil} + _new = &ast.ExprNew{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($4, $5), + }, + NewTkn: $4, + Class: $5, + } } + $$ = &ast.ExprAssignReference{ast.Node{}, $1, _new} // save position @@ -3360,45 +3383,43 @@ expr_without_variable: } | rw_variable T_INC { - $$ = &ast.ExprPostInc{ast.Node{}, $1} - - // save position - $$.GetNode().Position = position.NewNodeTokenPosition($1, $2) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Var, $2.SkippedTokens) + $$ = &ast.ExprPostInc{ + Node: ast.Node{ + Position: position.NewNodeTokenPosition($1, $2), + }, + Var: $1, + IncTkn: $2, + } } | T_INC rw_variable { - $$ = &ast.ExprPreInc{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $2) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ExprPreInc{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($1, $2), + }, + IncTkn: $1, + Var: $2, + } } | rw_variable T_DEC { - $$ = &ast.ExprPostDec{ast.Node{}, $1} - - // save position - $$.GetNode().Position = position.NewNodeTokenPosition($1, $2) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Var, $2.SkippedTokens) + $$ = &ast.ExprPostDec{ + Node: ast.Node{ + Position: position.NewNodeTokenPosition($1, $2), + }, + Var: $1, + DecTkn: $2, + } } | T_DEC rw_variable { - $$ = &ast.ExprPreDec{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $2) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ExprPreDec{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($1, $2), + }, + DecTkn: $1, + Var: $2, + } } | expr T_BOOLEAN_OR expr { diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 39792017fb1d95617ea04fc61f3f68030c014552..cfb8eb3a80060c65557adbcd379bee9d626ca2fe 100644 GIT binary patch delta 8321 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 delta 9304 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