diff --git a/internal/php5/php5.go b/internal/php5/php5.go index c43d502..d7d7936 100644 Binary files a/internal/php5/php5.go and b/internal/php5/php5.go differ diff --git a/internal/php5/php5.y b/internal/php5/php5.y index 355007f..be091ce 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -992,39 +992,35 @@ unticked_statement: } | T_RETURN ';' { - $$ = &ast.StmtReturn{ast.Node{}, nil} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $2) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $2.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $2.SkippedTokens) + $$ = &ast.StmtReturn{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $2), + }, + ReturnTkn: $1, + SemiColonTkn: $2, + } } | T_RETURN expr_without_variable ';' { - $$ = &ast.StmtReturn{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $3.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) + $$ = &ast.StmtReturn{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + ReturnTkn: $1, + Expr: $2, + SemiColonTkn: $3, + } } | T_RETURN variable ';' { - $$ = &ast.StmtReturn{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $3.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) + $$ = &ast.StmtReturn{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + ReturnTkn: $1, + Expr: $2, + SemiColonTkn: $3, + } } | yield_expr ';' { diff --git a/internal/php7/php7.go b/internal/php7/php7.go index d34558c..7ce01b9 100644 Binary files a/internal/php7/php7.go and b/internal/php7/php7.go differ diff --git a/internal/php7/php7.y b/internal/php7/php7.y index d3cfde3..45741de 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -941,15 +941,14 @@ statement: } | T_RETURN optional_expr ';' { - $$ = &ast.StmtReturn{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $3.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) + $$ = &ast.StmtReturn{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + ReturnTkn: $1, + Expr: $2, + SemiColonTkn: $3, + } } | T_GLOBAL global_var_list ';' { diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 2ed7187..1bed711 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -618,7 +618,9 @@ func (n *StmtPropertyList) Accept(v NodeVisitor) { // StmtReturn node type StmtReturn struct { Node - Expr Vertex + ReturnTkn *token.Token + Expr Vertex + SemiColonTkn *token.Token } func (n *StmtReturn) Accept(v NodeVisitor) { diff --git a/pkg/ast/visitor/filter_tokens.go b/pkg/ast/visitor/filter_tokens.go index 4cc6a27..91f6ddd 100644 --- a/pkg/ast/visitor/filter_tokens.go +++ b/pkg/ast/visitor/filter_tokens.go @@ -173,3 +173,8 @@ func (v *FilterTokens) StmtContinue(n *ast.StmtContinue) { n.ContinueTkn = nil n.SemiColonTkn = nil } + +func (v *FilterTokens) StmtReturn(n *ast.StmtReturn) { + n.ReturnTkn = nil + n.SemiColonTkn = nil +} diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index 3380c90..469a837 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -2690,21 +2690,15 @@ func (p *Printer) printStmtProperty(n ast.Vertex) { p.printFreeFloating(nn, token.End) } -func (p *Printer) printStmtReturn(n ast.Vertex) { - nn := n.(*ast.StmtReturn) - p.printFreeFloating(nn, token.Start) +func (p *Printer) printStmtReturn(n *ast.StmtReturn) { + p.printToken(n.ReturnTkn, "return") - io.WriteString(p.w, "return") - p.bufStart = " " - p.Print(nn.Expr) - p.printFreeFloating(nn, token.Expr) - - p.printFreeFloating(nn, token.SemiColon) - if n.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + if n.Expr != nil { + p.bufStart = " " } + p.Print(n.Expr) - p.printFreeFloating(nn, token.End) + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtStaticVar(n ast.Vertex) {