diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 86cad0f..c43d502 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 cab691e..355007f 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -950,51 +950,45 @@ unticked_statement: } | T_BREAK ';' { - $$ = &ast.StmtBreak{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.StmtBreak{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $2), + }, + BreakTkn: $1, + SemiColonTkn: $2, + } } | T_BREAK expr ';' { - $$ = &ast.StmtBreak{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.StmtBreak{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + BreakTkn: $1, + Expr: $2, + SemiColonTkn: $3, + } } | T_CONTINUE ';' { - $$ = &ast.StmtContinue{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.StmtContinue{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $2), + }, + ContinueTkn: $1, + SemiColonTkn: $2, + } } | T_CONTINUE expr ';' { - $$ = &ast.StmtContinue{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.StmtContinue{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + ContinueTkn: $1, + Expr: $2, + SemiColonTkn: $3, + } } | T_RETURN ';' { diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 90b1972..d34558c 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 9cf8c08..d3cfde3 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -919,27 +919,25 @@ statement: } | T_BREAK optional_expr ';' { - $$ = &ast.StmtBreak{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.StmtBreak{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + BreakTkn: $1, + Expr: $2, + SemiColonTkn: $3, + } } | T_CONTINUE optional_expr ';' { - $$ = &ast.StmtContinue{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.StmtContinue{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + ContinueTkn: $1, + Expr: $2, + SemiColonTkn: $3, + } } | T_RETURN optional_expr ';' { diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 26850a4..2ed7187 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -191,7 +191,9 @@ func (n *StmtAltForeach) Accept(v NodeVisitor) { // StmtBreak node type StmtBreak struct { Node - Expr Vertex + BreakTkn *token.Token + Expr Vertex + SemiColonTkn *token.Token } func (n *StmtBreak) Accept(v NodeVisitor) { @@ -314,7 +316,9 @@ func (n *StmtConstant) Accept(v NodeVisitor) { // StmtContinue node type StmtContinue struct { Node - Expr Vertex + ContinueTkn *token.Token + Expr Vertex + SemiColonTkn *token.Token } func (n *StmtContinue) Accept(v NodeVisitor) { diff --git a/pkg/ast/visitor/filter_tokens.go b/pkg/ast/visitor/filter_tokens.go index b59f05b..4cc6a27 100644 --- a/pkg/ast/visitor/filter_tokens.go +++ b/pkg/ast/visitor/filter_tokens.go @@ -163,3 +163,13 @@ func (v *FilterTokens) StmtDefault(n *ast.StmtDefault) { n.DefaultTkn = nil n.CaseSeparatorTkn = nil } + +func (v *FilterTokens) StmtBreak(n *ast.StmtBreak) { + n.BreakTkn = nil + n.SemiColonTkn = nil +} + +func (v *FilterTokens) StmtContinue(n *ast.StmtContinue) { + n.ContinueTkn = nil + n.SemiColonTkn = nil +} diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index 5064d70..3380c90 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -2017,25 +2017,15 @@ func (p *Printer) printStmtAltForeach(n ast.Vertex) { p.printFreeFloating(nn, token.End) } -func (p *Printer) printStmtBreak(n ast.Vertex) { - nn := n.(*ast.StmtBreak) - p.printFreeFloating(nn, token.Start) +func (p *Printer) printStmtBreak(n *ast.StmtBreak) { + p.printToken(n.BreakTkn, "break") - io.WriteString(p.w, "break") - if nn.Expr != nil { - if nn.Expr.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - } - p.printFreeFloating(nn, token.Expr) - - p.printFreeFloating(nn, token.SemiColon) - if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + if n.Expr != nil { + p.bufStart = " " } - p.printFreeFloating(nn, token.End) + p.Print(n.Expr) + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtCase(n *ast.StmtCase) { @@ -2202,26 +2192,15 @@ func (p *Printer) printStmtConstant(n *ast.StmtConstant) { p.printToken(n.CommaTkn, "") } -func (p *Printer) printStmtContinue(n ast.Vertex) { - nn := n.(*ast.StmtContinue) - p.printFreeFloating(nn, token.Start) +func (p *Printer) printStmtContinue(n *ast.StmtContinue) { + p.printToken(n.ContinueTkn, "continue") - io.WriteString(p.w, "continue") - - if nn.Expr != nil { - if nn.Expr.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - } - p.printFreeFloating(nn, token.Expr) - - p.printFreeFloating(nn, token.SemiColon) - if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + if n.Expr != nil { + p.bufStart = " " } - p.printFreeFloating(nn, token.End) + p.Print(n.Expr) + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtDeclare(n ast.Vertex) { diff --git a/pkg/printer/printer_parsed_php5_test.go b/pkg/printer/printer_parsed_php5_test.go index 2ea9ea4..d5b2c0b 100644 --- a/pkg/printer/printer_parsed_php5_test.go +++ b/pkg/printer/printer_parsed_php5_test.go @@ -837,7 +837,8 @@ func TestParseAndPrintPhp5AltWhile(t *testing.T) { } func TestParseAndPrintPhp5Break(t *testing.T) { - src := `