From 2d6ae3a9a27ef6d4dbcce80405d9a42a35cd639f Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Sun, 22 Nov 2020 14:26:24 +0200 Subject: [PATCH] [refactoring] update ast structure of "ClassMethod", "Function", "ArrowFunction" and "Closure" nodes --- internal/php5/php5.go | Bin 286340 -> 284993 bytes internal/php5/php5.y | 149 ++++++++++++--------------- internal/php7/php7.go | Bin 237795 -> 235322 bytes internal/php7/php7.y | 187 +++++++++++++++------------------- pkg/ast/node.go | 77 ++++++++++---- pkg/ast/visitor/dump.go | 30 ------ pkg/printer/pretty_printer.go | 8 +- pkg/printer/printer.go | 16 +-- 8 files changed, 211 insertions(+), 256 deletions(-) diff --git a/internal/php5/php5.go b/internal/php5/php5.go index d65f45df7538b6e51edc7b43bd7aa8dd6d797d46..ce30db867ccecb49004ea901c769fcd89258f458 100644 GIT binary patch delta 11956 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 RQ%cA&qm7XqhK@G^{|$+c@ALow delta 11174 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 0 { - yylex.(*Parser).MoveFreeFloating($1[0], $$) - yylex.(*Parser).setFreeFloating($$, token.ModifierList, $2.SkippedTokens) - } else { - yylex.(*Parser).setFreeFloating($$, token.Start, $2.SkippedTokens) + $$ = &ast.StmtClassMethod{ + Node: ast.Node{ + Position: pos, + }, + Modifiers: $1, + FunctionTkn: $2, + AmpersandTkn: $3, + MethodName: &ast.Identifier{ + Node: ast.Node{ + Position: position.NewTokenPosition($4), + }, + IdentifierTkn: $4, + Value: $4.Value, + }, + OpenParenthesisTkn: $5, + Params: $6, + CloseParenthesisTkn: $7, + Stmt: $8, } - if $3 == nil { - yylex.(*Parser).setFreeFloating($$, token.Function, $4.SkippedTokens) - } else { - yylex.(*Parser).setFreeFloating($$, token.Function, $3.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Ampersand, $4.SkippedTokens) - } - yylex.(*Parser).setFreeFloating($$, token.Name, $5.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.ParameterList, $7.SkippedTokens) } ; @@ -3907,51 +3900,37 @@ expr_without_variable: } | function is_reference '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' { - $$ = &ast.ExprClosure{ast.Node{}, $2 != nil, false, $4, $6, nil, $8} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $9) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - if $2 == nil { - yylex.(*Parser).setFreeFloating($$, token.Function, $3.SkippedTokens) - } else { - yylex.(*Parser).setFreeFloating($$, token.Function, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Ampersand, $3.SkippedTokens) - } - yylex.(*Parser).setFreeFloating($$, token.ParameterList, $5.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.LexicalVars, $7.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Stmts, $9.SkippedTokens) - - // normalize - if $6 == nil { - yylex.(*Parser).setFreeFloatingTokens($$, token.Params, $$.GetNode().Tokens[token.LexicalVars]); delete($$.GetNode().Tokens, token.LexicalVars) + $$ = &ast.ExprClosure{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $9), + }, + FunctionTkn: $1, + AmpersandTkn: $2, + OpenParenthesisTkn: $3, + Params: $4, + CloseParenthesisTkn: $5, + ClosureUse: $6, + OpenCurlyBracketTkn: $7, + Stmts: $8, + CloseCurlyBracketTkn: $9, } } | T_STATIC function is_reference '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' { - $$ = &ast.ExprClosure{ast.Node{}, $3 != nil, true, $5, $7, nil, $9} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $10) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Static, $2.SkippedTokens) - if $3 == nil { - yylex.(*Parser).setFreeFloating($$, token.Function, $4.SkippedTokens) - } else { - yylex.(*Parser).setFreeFloating($$, token.Function, $3.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Ampersand, $4.SkippedTokens) - } - yylex.(*Parser).setFreeFloating($$, token.ParameterList, $6.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.LexicalVars, $8.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Stmts, $10.SkippedTokens) - - // normalize - if $7 == nil { - yylex.(*Parser).setFreeFloatingTokens($$, token.Params, $$.GetNode().Tokens[token.LexicalVars]); delete($$.GetNode().Tokens, token.LexicalVars) + $$ = &ast.ExprClosure{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $10), + }, + StaticTkn: $1, + FunctionTkn: $2, + AmpersandTkn: $3, + OpenParenthesisTkn: $4, + Params: $5, + CloseParenthesisTkn: $6, + ClosureUse: $7, + OpenCurlyBracketTkn: $8, + Stmts: $9, + CloseCurlyBracketTkn: $10, } } ; diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 0a0e9afa09a9715af2877ad3a04d7d129e32be74..5d03f1b9af6664a5da7847bcfbbc5672a9808abc 100644 GIT binary patch delta 7163 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 I{VMx^0H%H}6aWAK delta 7104 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 0 { - yylex.(*Parser).MoveFreeFloating($1[0], $$) - yylex.(*Parser).setFreeFloating($$, token.ModifierList, $2.SkippedTokens) - } else { - yylex.(*Parser).setFreeFloating($$, token.Start, $2.SkippedTokens) + $$ = &ast.StmtClassMethod{ + Node: ast.Node{ + Position: pos, + }, + Modifiers: $1, + FunctionTkn: $2, + AmpersandTkn: $3, + MethodName: &ast.Identifier{ + Node: ast.Node{ + Position: position.NewTokenPosition($4), + }, + IdentifierTkn: $4, + Value: $4.Value, + }, + OpenParenthesisTkn: $6, + Params: $7, + CloseParenthesisTkn: $8, + ColonTkn: $9.(*ast.ReturnType).ColonTkn, + ReturnType: $9.(*ast.ReturnType).Type, + Stmt: $10, } - if $3 == nil { - yylex.(*Parser).setFreeFloating($$, token.Function, $4.SkippedTokens) - } else { - yylex.(*Parser).setFreeFloating($$, token.Function, $3.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Ampersand, $4.SkippedTokens) - } - yylex.(*Parser).setFreeFloating($$, token.ParameterList, $8.SkippedTokens) } ; @@ -3624,74 +3616,55 @@ expr_without_variable: } | T_STATIC inline_function { - $$ = $2; - - switch n := $$.(type) { + switch n := $2.(type) { case *ast.ExprClosure : - n.Static = true; + n.Position = position.NewTokenNodePosition($1, $2) + n.StaticTkn = $1; case *ast.ExprArrowFunction : - n.Static = true; + n.Position = position.NewTokenNodePosition($1, $2) + n.StaticTkn = $1; }; - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $2) - - // save comments - yylex.(*Parser).setFreeFloatingTokens($$, token.Static, $$.GetNode().Tokens[token.Start]); delete($$.GetNode().Tokens, token.Start) - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens); + $$ = $2 } ; inline_function: T_FUNCTION returns_ref backup_doc_comment '(' parameter_list ')' lexical_vars return_type '{' inner_statement_list '}' { - $$ = &ast.ExprClosure{ast.Node{}, $2 != nil, false, $5, $7, $8, $10} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $11) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - if $2 == nil { - yylex.(*Parser).setFreeFloating($$, token.Function, $4.SkippedTokens) - } else { - yylex.(*Parser).setFreeFloating($$, token.Function, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Ampersand, $4.SkippedTokens) - } - yylex.(*Parser).setFreeFloating($$, token.ParameterList, $6.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.ReturnType, $9.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Stmts, $11.SkippedTokens) - - // normalize - if $8 == nil { - yylex.(*Parser).setFreeFloatingTokens($$, token.LexicalVars, $$.GetNode().Tokens[token.ReturnType]); delete($$.GetNode().Tokens, token.ReturnType) - } - if $7 == nil { - yylex.(*Parser).setFreeFloatingTokens($$, token.Params, $$.GetNode().Tokens[token.LexicalVarList]); delete($$.GetNode().Tokens, token.LexicalVarList) + $$ = &ast.ExprClosure{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $11), + }, + FunctionTkn: $1, + AmpersandTkn: $2, + OpenParenthesisTkn: $4, + Params: $5, + CloseParenthesisTkn: $6, + ClosureUse: $7, + ColonTkn: $8.(*ast.ReturnType).ColonTkn, + ReturnType: $8.(*ast.ReturnType).Type, + OpenCurlyBracketTkn: $9, + Stmts: $10, + CloseCurlyBracketTkn: $11, } } | T_FN returns_ref '(' parameter_list ')' return_type backup_doc_comment T_DOUBLE_ARROW expr { - $$ = &ast.ExprArrowFunction{ast.Node{}, $2 != nil, false, $4, $6, $9} - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $9) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - if $2 == nil { - yylex.(*Parser).setFreeFloating($$, token.Function, $3.SkippedTokens) - } else { - yylex.(*Parser).setFreeFloating($$, token.Function, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Ampersand, $3.SkippedTokens) - }; - yylex.(*Parser).setFreeFloating($$, token.ParameterList, $5.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.ReturnType, $8.SkippedTokens) - - // normalize - if $6 == nil { - yylex.(*Parser).setFreeFloatingTokens($$, token.Params, $$.GetNode().Tokens[token.ReturnType]); delete($$.GetNode().Tokens, token.ReturnType) - }; + $$ = &ast.ExprArrowFunction{ + Node: ast.Node{ + Position: position.NewTokenNodePosition($1, $9), + }, + FnTkn: $1, + AmpersandTkn: $2, + OpenParenthesisTkn: $3, + Params: $4, + CloseParenthesisTkn: $5, + ColonTkn: $6.(*ast.ReturnType).ColonTkn, + ReturnType: $6.(*ast.ReturnType).Type, + DoubleArrowTkn: $8, + Expr: $9, + } } ; diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 3c64e3d..fb50e7f 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -292,12 +292,16 @@ func (n *StmtClassImplements) Accept(v NodeVisitor) { // StmtClassMethod node type StmtClassMethod struct { Node - ReturnsRef bool - MethodName Vertex - Modifiers []Vertex - Params []Vertex - ReturnType Vertex - Stmt Vertex + Modifiers []Vertex + FunctionTkn *token.Token + AmpersandTkn *token.Token + MethodName Vertex + OpenParenthesisTkn *token.Token + Params []Vertex + CloseParenthesisTkn *token.Token + ColonTkn *token.Token + ReturnType Vertex + Stmt Vertex } func (n *StmtClassMethod) Accept(v NodeVisitor) { @@ -501,11 +505,17 @@ func (n *StmtForeach) Accept(v NodeVisitor) { // StmtFunction node type StmtFunction struct { Node - ReturnsRef bool - FunctionName Vertex - Params []Vertex - ReturnType Vertex - Stmts []Vertex + FunctionTkn *token.Token + AmpersandTkn *token.Token + FunctionName Vertex + OpenParenthesisTkn *token.Token + Params []Vertex + CloseParenthesisTkn *token.Token + ColonTkn *token.Token + ReturnType Vertex + OpenCurlyBracketTkn *token.Token + Stmts []Vertex + CloseCurlyBracketTkn *token.Token } func (n *StmtFunction) Accept(v NodeVisitor) { @@ -951,11 +961,16 @@ func (n *ExprArrayItem) Accept(v NodeVisitor) { // ExprArrowFunction node type ExprArrowFunction struct { Node - ReturnsRef bool - Static bool - Params []Vertex - ReturnType Vertex - Expr Vertex + StaticTkn *token.Token + FnTkn *token.Token + AmpersandTkn *token.Token + OpenParenthesisTkn *token.Token + Params []Vertex + CloseParenthesisTkn *token.Token + ColonTkn *token.Token + ReturnType Vertex + DoubleArrowTkn *token.Token + Expr Vertex } func (n *ExprArrowFunction) Accept(v NodeVisitor) { @@ -1006,12 +1021,18 @@ func (n *ExprClone) Accept(v NodeVisitor) { // ExprClosure node type ExprClosure struct { Node - ReturnsRef bool - Static bool - Params []Vertex - ClosureUse *ExprClosureUse - ReturnType Vertex - Stmts []Vertex + StaticTkn *token.Token + FunctionTkn *token.Token + AmpersandTkn *token.Token + OpenParenthesisTkn *token.Token + Params []Vertex + CloseParenthesisTkn *token.Token + ClosureUse *ExprClosureUse + ColonTkn *token.Token + ReturnType Vertex + OpenCurlyBracketTkn *token.Token + Stmts []Vertex + CloseCurlyBracketTkn *token.Token } func (n *ExprClosure) Accept(v NodeVisitor) { @@ -1947,6 +1968,8 @@ func (n *NameNamePart) Accept(v NodeVisitor) { v.NameNamePart(n) } +// TODO: move to private section + type ParserBrackets struct { Node OpenBracketTkn *token.Token @@ -1967,3 +1990,13 @@ type ParserSeparatedList struct { func (n *ParserSeparatedList) Accept(v NodeVisitor) { v.ParserSeparatedList(n) } + +type ReturnType struct { + Node + ColonTkn *token.Token + Type Vertex +} + +func (n *ReturnType) Accept(v NodeVisitor) { + // do nothing +} diff --git a/pkg/ast/visitor/dump.go b/pkg/ast/visitor/dump.go index 15c3226..6586d8c 100644 --- a/pkg/ast/visitor/dump.go +++ b/pkg/ast/visitor/dump.go @@ -288,11 +288,6 @@ func (v *Dump) StmtClassMethod(n *ast.StmtClassMethod) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.StmtClassMethod{\n") v.printNode(n.GetNode()) - - if n.ReturnsRef { - v.printIndent(v.indent) - v.print("ReturnsRef: true,\n") - } } func (v *Dump) StmtConstList(n *ast.StmtConstList) { @@ -397,11 +392,6 @@ func (v *Dump) StmtFunction(n *ast.StmtFunction) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.StmtFunction{\n") v.printNode(n.GetNode()) - - if n.ReturnsRef { - v.printIndent(v.indent) - v.print("ReturnsRef: true,\n") - } } func (v *Dump) StmtGlobal(n *ast.StmtGlobal) { @@ -641,16 +631,6 @@ func (v *Dump) ExprArrowFunction(n *ast.ExprArrowFunction) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.ExprArrowFunction{\n") v.printNode(n.GetNode()) - - if n.ReturnsRef { - v.printIndent(v.indent) - v.print("ReturnsRef: true,\n") - } - - if n.Static { - v.printIndent(v.indent) - v.print("Static: true,\n") - } } func (v *Dump) ExprBitwiseNot(n *ast.ExprBitwiseNot) { @@ -681,16 +661,6 @@ func (v *Dump) ExprClosure(n *ast.ExprClosure) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.ExprClosure{\n") v.printNode(n.GetNode()) - - if n.ReturnsRef { - v.printIndent(v.indent) - v.print("ReturnsRef: true,\n") - } - - if n.Static { - v.printIndent(v.indent) - v.print("Static: true,\n") - } } func (v *Dump) ExprClosureUse(n *ast.ExprClosureUse) { diff --git a/pkg/printer/pretty_printer.go b/pkg/printer/pretty_printer.go index 65c4cf6..fdd297f 100644 --- a/pkg/printer/pretty_printer.go +++ b/pkg/printer/pretty_printer.go @@ -1015,13 +1015,13 @@ func (p *PrettyPrinter) printExprClosureUse(n ast.Vertex) { func (p *PrettyPrinter) printExprClosure(n ast.Vertex) { nn := n.(*ast.ExprClosure) - if nn.Static { + if nn.StaticTkn != nil { io.WriteString(p.w, "static ") } io.WriteString(p.w, "function ") - if nn.ReturnsRef { + if nn.AmpersandTkn != nil { io.WriteString(p.w, "&") } @@ -1432,7 +1432,7 @@ func (p *PrettyPrinter) printStmtClassMethod(n ast.Vertex) { } io.WriteString(p.w, "function ") - if nn.ReturnsRef { + if nn.AmpersandTkn != nil { io.WriteString(p.w, "&") } @@ -1785,7 +1785,7 @@ func (p *PrettyPrinter) printStmtFunction(n ast.Vertex) { io.WriteString(p.w, "function ") - if nn.ReturnsRef { + if nn.AmpersandTkn != nil { io.WriteString(p.w, "&") } diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index 5848f39..ea131e5 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -1405,18 +1405,18 @@ func (p *Printer) printExprArrowFunction(n ast.Vertex) { nn := n.(*ast.ExprArrowFunction) p.printFreeFloating(nn, token.Start) - if nn.Static { + if nn.StaticTkn != nil { p.write([]byte("static")) } p.printFreeFloating(nn, token.Static) - if nn.Static && n.GetNode().Tokens.IsEmpty() { + if nn.StaticTkn != nil && n.GetNode().Tokens.IsEmpty() { p.write([]byte(" ")) } p.write([]byte("fn")) p.printFreeFloating(nn, token.Function) - if nn.ReturnsRef { + if nn.AmpersandTkn != nil { p.write([]byte("&")) } p.printFreeFloating(nn, token.Ampersand) @@ -1496,18 +1496,18 @@ func (p *Printer) printExprClosure(n ast.Vertex) { nn := n.(*ast.ExprClosure) p.printFreeFloating(nn, token.Start) - if nn.Static { + if nn.StaticTkn != nil { p.write([]byte("static")) } p.printFreeFloating(nn, token.Static) - if nn.Static && n.GetNode().Tokens.IsEmpty() { + if nn.StaticTkn != nil && n.GetNode().Tokens.IsEmpty() { p.write([]byte(" ")) } p.write([]byte("function")) p.printFreeFloating(nn, token.Function) - if nn.ReturnsRef { + if nn.AmpersandTkn != nil { p.write([]byte("&")) } p.printFreeFloating(nn, token.Ampersand) @@ -2040,7 +2040,7 @@ func (p *Printer) printStmtClassMethod(n ast.Vertex) { p.write([]byte("function")) p.printFreeFloating(nn, token.Function) - if nn.ReturnsRef { + if nn.AmpersandTkn != nil { if nn.GetNode().Tokens.IsEmpty() { p.write([]byte(" ")) } @@ -2384,7 +2384,7 @@ func (p *Printer) printStmtFunction(n ast.Vertex) { p.write([]byte("function")) p.printFreeFloating(nn, token.Function) - if nn.ReturnsRef { + if nn.AmpersandTkn != nil { if nn.GetNode().Tokens.IsEmpty() { p.write([]byte(" ")) }