diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 6527ca8..f819223 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 21c19ac..cdd7bc5 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -1167,15 +1167,14 @@ unticked_statement: } | T_THROW expr ';' { - $$ = &ast.StmtThrow{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.StmtThrow{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + ThrowTkn: $1, + Expr: $2, + SemiColonTkn: $3, + } } | T_GOTO T_STRING ';' { diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 5c94ada..f784230 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 a679f14..920dc76 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -1077,15 +1077,14 @@ statement: } | T_THROW expr ';' { - $$ = &ast.StmtThrow{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.StmtThrow{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + ThrowTkn: $1, + Expr: $2, + SemiColonTkn: $3, + } } | T_GOTO T_STRING ';' { diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 0479183..e459723 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -709,7 +709,9 @@ func (n *StmtSwitch) Accept(v NodeVisitor) { // StmtThrow node type StmtThrow struct { Node - Expr Vertex + ThrowTkn *token.Token + Expr Vertex + SemiColonTkn *token.Token } func (n *StmtThrow) Accept(v NodeVisitor) { diff --git a/pkg/ast/visitor/filter_tokens.go b/pkg/ast/visitor/filter_tokens.go index 83a3410..62f7700 100644 --- a/pkg/ast/visitor/filter_tokens.go +++ b/pkg/ast/visitor/filter_tokens.go @@ -260,3 +260,8 @@ func (v *FilterTokens) StmtFinally(n *ast.StmtFinally) { n.OpenCurlyBracketTkn = nil n.CloseCurlyBracketTkn = nil } + +func (v *FilterTokens) StmtThrow(n *ast.StmtThrow) { + n.ThrowTkn = nil + n.SemiColonTkn = nil +} diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index fab6102..0ade2a0 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -2674,23 +2674,11 @@ func (p *Printer) printStmtAltSwitch(n *ast.StmtSwitch) { p.printToken(n.SemiColonTkn, ";") } -func (p *Printer) printStmtThrow(n ast.Vertex) { - nn := n.(*ast.StmtThrow) - p.printFreeFloating(nn, token.Start) - - p.write([]byte("throw")) - if nn.Expr.GetNode().Tokens.IsEmpty() { - p.write([]byte(" ")) - } - p.Print(nn.Expr) - p.printFreeFloating(nn, token.Expr) - - p.printFreeFloating(nn, token.SemiColon) - if n.GetNode().Tokens.IsEmpty() { - p.write([]byte(";")) - } - - p.printFreeFloating(nn, token.End) +func (p *Printer) printStmtThrow(n *ast.StmtThrow) { + p.printToken(n.ThrowTkn, "throw") + p.bufStart = " " + p.Print(n.Expr) + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtTraitAdaptationList(n ast.Vertex) {