From b1e9f5e167716f79940418517ae61065c7532fe8 Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Thu, 3 Dec 2020 21:42:16 +0200 Subject: [PATCH] [refactoring] update ast structure of "ExprMethodCall" and "ExprPropertyFetch" nodes --- internal/php5/parser_test.go | 2 + internal/php5/php5.go | Bin 278293 -> 279591 bytes internal/php5/php5.y | 176 ++++++++++++++++++++++------------ internal/php7/php7.go | Bin 230024 -> 229807 bytes internal/php7/php7.y | 91 +++++++++--------- pkg/ast/node.go | 14 ++- pkg/ast/traverser/dfs.go | 10 +- pkg/printer/pretty_printer.go | 2 +- pkg/printer/printer.go | 6 +- 9 files changed, 182 insertions(+), 119 deletions(-) diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index 0eb1d67..a2b90ea 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -17236,6 +17236,8 @@ func TestExprPrint(t *testing.T) { assert.DeepEqual(t, expected, actual) } +// TODO add test for `echo $a->b["c"]()->d["e"]();` + func TestExprPropertyFetch(t *testing.T) { src := `foo;` diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 850176840611132505326f0705771b3163ac2778..040152df5ef97c2523d9bcc8f0a116856255b177 100644 GIT binary patch delta 5658 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 diff --git a/internal/php7/php7.y b/internal/php7/php7.y index 2e1cdb4..ca0a1c2 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -4274,14 +4274,17 @@ callable_variable: } | dereferencable T_OBJECT_OPERATOR property_name argument_list { - $$ = &ast.ExprMethodCall{ast.Node{}, $1, $3, $4.(*ast.ArgumentList)} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $4) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Var, $2.SkippedTokens) + $$ = &ast.ExprMethodCall{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $4), + }, + Var: $1, + ObjectOperatorTkn: $2, + Method: $3, + OpenParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + Arguments: $4.(*ast.ArgumentList).Arguments, + CloseParenthesisTkn: $4.(*ast.ArgumentList).CloseParenthesisTkn, + } } | function_call { @@ -4300,14 +4303,14 @@ variable: } | dereferencable T_OBJECT_OPERATOR property_name { - $$ = &ast.ExprPropertyFetch{ast.Node{}, $1, $3} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $3) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Var, $2.SkippedTokens) + $$ = &ast.ExprPropertyFetch{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $3), + }, + Var: $1, + ObjectOperatorTkn: $2, + Property: $3, + } } ; @@ -4409,14 +4412,14 @@ new_variable: } | new_variable T_OBJECT_OPERATOR property_name { - $$ = &ast.ExprPropertyFetch{ast.Node{}, $1, $3} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $3) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Var, $2.SkippedTokens) + $$ = &ast.ExprPropertyFetch{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $3), + }, + Var: $1, + ObjectOperatorTkn: $2, + Property: $3, + } } | class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable { @@ -4714,29 +4717,31 @@ encaps_var: } | T_VARIABLE T_OBJECT_OPERATOR T_STRING { - identifier := &ast.Identifier{ + $$ = &ast.ExprPropertyFetch{ Node: ast.Node{ - Position: position.NewTokenPosition($1), + Position: position.NewTokensPosition($1, $3), }, - IdentifierTkn: $1, - Value: $1.Value, - } - variable := &ast.ExprVariable{ast.Node{}, identifier} - fetch := &ast.Identifier{ - Node: ast.Node{ - Position: position.NewTokenPosition($3), + Var: &ast.ExprVariable{ + Node: ast.Node{ + Position: position.NewTokenPosition($1), + }, + VarName: &ast.Identifier{ + Node: ast.Node{ + Position: position.NewTokenPosition($1), + }, + IdentifierTkn: $1, + Value: $1.Value, + }, + }, + ObjectOperatorTkn: $2, + Property: &ast.Identifier{ + Node: ast.Node{ + Position: position.NewTokenPosition($3), + }, + IdentifierTkn: $3, + Value: $3.Value, }, - IdentifierTkn: $3, - Value: $3.Value, } - $$ = &ast.ExprPropertyFetch{ast.Node{}, variable, fetch} - - // save position - variable.GetNode().Position = position.NewTokenPosition($1) - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Var, $2.SkippedTokens) } | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 54ae3de..9f90db7 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -1215,9 +1215,12 @@ func (n *ExprList) Accept(v NodeVisitor) { // ExprMethodCall node type ExprMethodCall struct { Node - Var Vertex - Method Vertex - ArgumentList *ArgumentList + Var Vertex + ObjectOperatorTkn *token.Token + Method Vertex + OpenParenthesisTkn *token.Token + Arguments []Vertex + CloseParenthesisTkn *token.Token } func (n *ExprMethodCall) Accept(v NodeVisitor) { @@ -1288,8 +1291,9 @@ func (n *ExprPrint) Accept(v NodeVisitor) { // ExprPropertyFetch node type ExprPropertyFetch struct { Node - Var Vertex - Property Vertex + Var Vertex + ObjectOperatorTkn *token.Token + Property Vertex } func (n *ExprPropertyFetch) Accept(v NodeVisitor) { diff --git a/pkg/ast/traverser/dfs.go b/pkg/ast/traverser/dfs.go index 95f2d4a..fecf672 100644 --- a/pkg/ast/traverser/dfs.go +++ b/pkg/ast/traverser/dfs.go @@ -1396,10 +1396,12 @@ func (t *DFS) Traverse(n ast.Vertex) { t.Traverse(nn.Method) t.visitor.Leave("Method", true) } - if nn.ArgumentList != nil { - t.visitor.Enter("ArgumentList", true) - t.Traverse(nn.ArgumentList) - t.visitor.Leave("ArgumentList", true) + if nn.Arguments != nil { + t.visitor.Enter("Arguments", false) + for _, c := range nn.Arguments { + t.Traverse(c) + } + t.visitor.Leave("Arguments", false) } case *ast.ExprNew: if nn == nil { diff --git a/pkg/printer/pretty_printer.go b/pkg/printer/pretty_printer.go index 79782fe..ef01e44 100644 --- a/pkg/printer/pretty_printer.go +++ b/pkg/printer/pretty_printer.go @@ -1133,7 +1133,7 @@ func (p *PrettyPrinter) printExprMethodCall(n ast.Vertex) { io.WriteString(p.w, "->") p.Print(nn.Method) io.WriteString(p.w, "(") - p.joinPrint(", ", nn.ArgumentList.Arguments) + p.joinPrint(", ", nn.Arguments) io.WriteString(p.w, ")") } diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index dfbe5f1..8791841 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -1695,9 +1695,9 @@ func (p *Printer) printExprMethodCall(n ast.Vertex) { p.write([]byte("->")) p.Print(nn.Method) - p.printFreeFloatingOrDefault(nn.ArgumentList, token.Start, "(") - p.joinPrint(",", nn.ArgumentList.Arguments) - p.printFreeFloatingOrDefault(nn.ArgumentList, token.End, ")") + p.printToken(nn.OpenParenthesisTkn, "(") + p.joinPrint(",", nn.Arguments) + p.printToken(nn.CloseParenthesisTkn, ")") p.printFreeFloating(nn, token.End) }