From 3b85f5e82bd5bc7f79ae0a5af63927404788c235 Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Fri, 4 Sep 2020 10:33:47 +0300 Subject: [PATCH] [refactoring] update ast structure of "While" node --- internal/php5/parser_test.go | 3 +- internal/php5/php5.go | Bin 295688 -> 294441 bytes internal/php5/php5.y | 52 ++++++++--------- internal/php5/php5_test.go | 3 +- internal/php7/parser_test.go | 3 +- internal/php7/php7.go | Bin 248339 -> 247565 bytes internal/php7/php7.y | 63 ++++++++------------ internal/php7/php7_test.go | 3 +- pkg/ast/ast.go | 1 - pkg/ast/node.go | 22 +++---- pkg/ast/traverser/dfs.go | 17 ------ pkg/ast/visitor/dump.go | 11 ++-- pkg/ast/visitor/filter_parser_nodes.go | 20 ------- pkg/ast/visitor/filter_tokens.go | 9 +++ pkg/ast/visitor/null.go | 4 -- pkg/printer/pretty_printer.go | 37 ++++++------ pkg/printer/pretty_printer_test.go | 15 ++--- pkg/printer/printer.go | 73 ++++++++---------------- pkg/printer/printer_parsed_php5_test.go | 6 +- pkg/printer/printer_parsed_php7_test.go | 6 +- pkg/printer/printer_test.go | 5 +- 21 files changed, 140 insertions(+), 213 deletions(-) diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index 0a8d776..725f642 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -12762,7 +12762,7 @@ func TestStmtBreak(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltWhile{ + &ast.StmtWhile{ Node: ast.Node{ Position: &position.Position{ StartLine: 1, @@ -12771,6 +12771,7 @@ func TestStmtBreak(t *testing.T) { EndPos: 34, }, }, + Alt: true, Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 953db897e00983ea3c13adb39882cde84a6f7924..d6165d2f5ef985667abdf25adcdc4703ba3b0032 100644 GIT binary patch delta 11777 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 SGa~WFLkgV5>DWC^;C}#;MYK-< delta 13166 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 diff --git a/internal/php5/php5.y b/internal/php5/php5.y index 38a0d87..b760bdc 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -901,20 +901,13 @@ unticked_statement: } | T_WHILE parenthesis_expr while_statement { - switch n := $3.(type) { - case *ast.StmtWhile : - n.Cond = $2 - case *ast.StmtAltWhile : - n.Cond = $2 - } + $3.(*ast.StmtWhile).WhileTkn = $1 + $3.(*ast.StmtWhile).OpenParenthesisTkn = $2.(*ast.ParserBrackets).OpenBracketTkn + $3.(*ast.StmtWhile).Cond = $2.(*ast.ParserBrackets).Child + $3.(*ast.StmtWhile).CloseParenthesisTkn = $2.(*ast.ParserBrackets).CloseBracketTkn + $3.(*ast.StmtWhile).Node.Position = position.NewTokenNodePosition($1, $3) $$ = $3 - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) } | T_DO statement T_WHILE parenthesis_expr ';' { @@ -1914,29 +1907,30 @@ case_separator: while_statement: statement { - $$ = &ast.StmtWhile{ast.Node{}, nil, $1} - - // save position - $$.GetNode().Position = position.NewNodePosition($1) + $$ = &ast.StmtWhile{ + Node: ast.Node{ + Position: position.NewNodePosition($1), + }, + Stmt: $1, + } } | ':' inner_statement_list T_ENDWHILE ';' { - stmtList := &ast.StmtStmtList{ + $$ = &ast.StmtWhile{ Node: ast.Node{ - Position: position.NewNodeListPosition($2), + Position: position.NewTokensPosition($1, $4), }, - Stmts: $2, + Alt: true, + ColonTkn: $1, + Stmt: &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Stmts: $2, + }, + EndWhileTkn: $3, + SemiColonTkn: $4, } - $$ = &ast.StmtAltWhile{ast.Node{}, nil, stmtList} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $4) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Cond, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Stmts, $3.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.AltEnd, $4.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $4.SkippedTokens) } ; diff --git a/internal/php5/php5_test.go b/internal/php5/php5_test.go index 535f8c7..de9eb19 100644 --- a/internal/php5/php5_test.go +++ b/internal/php5/php5_test.go @@ -3049,7 +3049,7 @@ func TestPhp5(t *testing.T) { }, }, }, - &ast.StmtAltWhile{ + &ast.StmtWhile{ Node: ast.Node{ Position: &position.Position{ StartLine: 57, @@ -3058,6 +3058,7 @@ func TestPhp5(t *testing.T) { EndPos: 1046, }, }, + Alt: true, Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ diff --git a/internal/php7/parser_test.go b/internal/php7/parser_test.go index 67ce06a..8421ca1 100644 --- a/internal/php7/parser_test.go +++ b/internal/php7/parser_test.go @@ -14441,7 +14441,7 @@ func TestStmtBreak(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltWhile{ + &ast.StmtWhile{ Node: ast.Node{ Position: &position.Position{ StartLine: 1, @@ -14450,6 +14450,7 @@ func TestStmtBreak(t *testing.T) { EndPos: 34, }, }, + Alt: true, Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ diff --git a/internal/php7/php7.go b/internal/php7/php7.go index e1a071b4f334091cc5d69e6fdde6b58a82c756eb..323095b1e3952e9d51a3edff425be0be75264e58 100644 GIT binary patch delta 6729 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 diff --git a/internal/php7/php7.y b/internal/php7/php7.y index 03fbb1e..bc12e9f 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -870,31 +870,13 @@ statement: } | T_WHILE '(' expr ')' while_statement { - exprBrackets := &ast.ParserBrackets{ - Node: ast.Node{ - Position: position.NewTokensPosition($2, $4), - }, - OpenBracketTkn: $2, - Child: $3, - CloseBracketTkn: $4, - } - - switch n := $5.(type) { - case *ast.StmtWhile : - n.Cond = exprBrackets - case *ast.StmtAltWhile : - n.Cond = exprBrackets - } + $5.(*ast.StmtWhile).WhileTkn = $1 + $5.(*ast.StmtWhile).OpenParenthesisTkn = $2 + $5.(*ast.StmtWhile).Cond = $3 + $5.(*ast.StmtWhile).CloseParenthesisTkn = $4 + $5.(*ast.StmtWhile).Node.Position = position.NewTokenNodePosition($1, $5) $$ = $5 - - // save position - $$.GetNode().Position = position.NewTokenNodePosition($1, $5) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.Start, $2.SkippedTokens) - yylex.(*Parser).setFreeFloatingTokens(exprBrackets, token.End, $4.SkippedTokens) } | T_DO statement T_WHILE '(' expr ')' ';' { @@ -1740,29 +1722,30 @@ case_separator: while_statement: statement { - $$ = &ast.StmtWhile{ast.Node{}, nil, $1} - - // save position - $$.GetNode().Position = position.NewNodePosition($1) + $$ = &ast.StmtWhile{ + Node: ast.Node{ + Position: position.NewNodePosition($1), + }, + Stmt: $1, + } } | ':' inner_statement_list T_ENDWHILE ';' { - stmtList := &ast.StmtStmtList{ + $$ = &ast.StmtWhile{ Node: ast.Node{ - Position: position.NewNodeListPosition($2), + Position: position.NewTokensPosition($1, $4), }, - Stmts: $2, + Alt: true, + ColonTkn: $1, + Stmt: &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Stmts: $2, + }, + EndWhileTkn: $3, + SemiColonTkn: $4, } - $$ = &ast.StmtAltWhile{ast.Node{}, nil, stmtList} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $4) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Cond, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Stmts, $3.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.AltEnd, $4.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $4.SkippedTokens) } ; diff --git a/internal/php7/php7_test.go b/internal/php7/php7_test.go index a12803b..2204bc8 100644 --- a/internal/php7/php7_test.go +++ b/internal/php7/php7_test.go @@ -3821,7 +3821,7 @@ func TestPhp7(t *testing.T) { }, }, }, - &ast.StmtAltWhile{ + &ast.StmtWhile{ Node: ast.Node{ Position: &position.Position{ StartLine: 69, @@ -3830,6 +3830,7 @@ func TestPhp7(t *testing.T) { EndPos: 1290, }, }, + Alt: true, Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ diff --git a/pkg/ast/ast.go b/pkg/ast/ast.go index 4b60110..cceb924 100644 --- a/pkg/ast/ast.go +++ b/pkg/ast/ast.go @@ -30,7 +30,6 @@ type NodeVisitor interface { StmtAltFor(n *StmtAltFor) StmtAltForeach(n *StmtAltForeach) StmtAltSwitch(n *StmtAltSwitch) - StmtAltWhile(n *StmtAltWhile) StmtBreak(n *StmtBreak) StmtCase(n *StmtCase) StmtCaseList(n *StmtCaseList) diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 993b65b..80ca23e 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -212,17 +212,6 @@ func (n *StmtAltSwitch) Accept(v NodeVisitor) { v.StmtAltSwitch(n) } -// StmtAltWhile node -type StmtAltWhile struct { - Node - Cond Vertex - Stmt Vertex -} - -func (n *StmtAltWhile) Accept(v NodeVisitor) { - v.StmtAltWhile(n) -} - // StmtBreak node type StmtBreak struct { Node @@ -839,8 +828,15 @@ func (n *StmtUseDeclaration) Accept(v NodeVisitor) { // StmtWhile node type StmtWhile struct { Node - Cond Vertex - Stmt Vertex + Alt bool + WhileTkn *token.Token + OpenParenthesisTkn *token.Token + Cond Vertex + CloseParenthesisTkn *token.Token + ColonTkn *token.Token + Stmt Vertex + EndWhileTkn *token.Token + SemiColonTkn *token.Token } func (n *StmtWhile) Accept(v NodeVisitor) { diff --git a/pkg/ast/traverser/dfs.go b/pkg/ast/traverser/dfs.go index 89d6977..5903f24 100644 --- a/pkg/ast/traverser/dfs.go +++ b/pkg/ast/traverser/dfs.go @@ -196,23 +196,6 @@ func (t *DFS) Traverse(n ast.Vertex) { t.Traverse(nn.CaseList) t.visitor.Leave("CaseList", true) } - case *ast.StmtAltWhile: - if nn == nil { - return - } - if !t.visitor.EnterNode(nn) { - return - } - if nn.Cond != nil { - t.visitor.Enter("Cond", true) - t.Traverse(nn.Cond) - t.visitor.Leave("Cond", true) - } - if nn.Stmt != nil { - t.visitor.Enter("Stmt", true) - t.Traverse(nn.Stmt) - t.visitor.Leave("Stmt", true) - } case *ast.StmtBreak: if nn == nil { return diff --git a/pkg/ast/visitor/dump.go b/pkg/ast/visitor/dump.go index 874e88d..c684ede 100644 --- a/pkg/ast/visitor/dump.go +++ b/pkg/ast/visitor/dump.go @@ -270,12 +270,6 @@ func (v *Dump) StmtAltSwitch(n *ast.StmtAltSwitch) { v.printNode(n.GetNode()) } -func (v *Dump) StmtAltWhile(n *ast.StmtAltWhile) { - v.printIndentIfNotSingle(v.indent - 1) - v.print("&ast.StmtAltWhile{\n") - v.printNode(n.GetNode()) -} - func (v *Dump) StmtBreak(n *ast.StmtBreak) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.StmtBreak{\n") @@ -637,6 +631,11 @@ func (v *Dump) StmtWhile(n *ast.StmtWhile) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.StmtWhile{\n") v.printNode(n.GetNode()) + + if n.Alt { + v.printIndent(v.indent) + v.print("Alt: true,\n") + } } func (v *Dump) ExprArray(n *ast.ExprArray) { diff --git a/pkg/ast/visitor/filter_parser_nodes.go b/pkg/ast/visitor/filter_parser_nodes.go index 859778f..20ed98d 100644 --- a/pkg/ast/visitor/filter_parser_nodes.go +++ b/pkg/ast/visitor/filter_parser_nodes.go @@ -13,26 +13,6 @@ func (v *FilterParserNodes) EnterNode(n ast.Vertex) bool { return true } -func (v *FilterParserNodes) StmtWhile(n *ast.StmtWhile) { - for { - if nn, ok := n.Cond.(*ast.ParserBrackets); ok { - n.Cond = nn.Child - } else { - break - } - } -} - -func (v *FilterParserNodes) StmtAltWhile(n *ast.StmtAltWhile) { - for { - if nn, ok := n.Cond.(*ast.ParserBrackets); ok { - n.Cond = nn.Child - } else { - break - } - } -} - func (v *FilterParserNodes) StmtDo(n *ast.StmtDo) { for { if nn, ok := n.Cond.(*ast.ParserBrackets); ok { diff --git a/pkg/ast/visitor/filter_tokens.go b/pkg/ast/visitor/filter_tokens.go index a1df886..620b703 100644 --- a/pkg/ast/visitor/filter_tokens.go +++ b/pkg/ast/visitor/filter_tokens.go @@ -113,3 +113,12 @@ func (v *FilterTokens) ParserBrackets(n *ast.ParserBrackets) { n.OpenBracketTkn = nil n.CloseBracketTkn = nil } + +func (v *FilterTokens) StmtWhile(n *ast.StmtWhile) { + n.WhileTkn = nil + n.OpenParenthesisTkn = nil + n.CloseParenthesisTkn = nil + n.ColonTkn = nil + n.EndWhileTkn = nil + n.SemiColonTkn = nil +} diff --git a/pkg/ast/visitor/null.go b/pkg/ast/visitor/null.go index 83c590d..4054486 100644 --- a/pkg/ast/visitor/null.go +++ b/pkg/ast/visitor/null.go @@ -66,10 +66,6 @@ func (v *Null) StmtAltSwitch(_ *ast.StmtAltSwitch) { // do nothing } -func (v *Null) StmtAltWhile(_ *ast.StmtAltWhile) { - // do nothing -} - func (v *Null) StmtBreak(_ *ast.StmtBreak) { // do nothing } diff --git a/pkg/printer/pretty_printer.go b/pkg/printer/pretty_printer.go index b089a24..c172f41 100644 --- a/pkg/printer/pretty_printer.go +++ b/pkg/printer/pretty_printer.go @@ -303,8 +303,6 @@ func (p *PrettyPrinter) printNode(n ast.Vertex) { p.printStmtAltForeach(n) case *ast.StmtAltSwitch: p.printStmtAltSwitch(n) - case *ast.StmtAltWhile: - p.printStmtAltWhile(n) case *ast.StmtBreak: p.printStmtBreak(n) case *ast.StmtCase: @@ -1450,21 +1448,6 @@ func (p *PrettyPrinter) printStmtAltSwitch(n ast.Vertex) { io.WriteString(p.w, "endswitch;") } -func (p *PrettyPrinter) printStmtAltWhile(n ast.Vertex) { - nn := n.(*ast.StmtAltWhile) - - io.WriteString(p.w, "while (") - p.Print(nn.Cond) - io.WriteString(p.w, ") :\n") - - s := nn.Stmt.(*ast.StmtStmtList) - p.printNodes(s.Stmts) - - io.WriteString(p.w, "\n") - p.printIndent() - io.WriteString(p.w, "endwhile;") -} - func (p *PrettyPrinter) printStmtBreak(n ast.Vertex) { nn := n.(*ast.StmtBreak) @@ -2190,6 +2173,11 @@ func (p *PrettyPrinter) printStmtUseDeclaration(n ast.Vertex) { func (p *PrettyPrinter) printStmtWhile(n ast.Vertex) { nn := n.(*ast.StmtWhile) + if nn.Alt { + p.printStmtAltWhile(nn) + return + } + io.WriteString(p.w, "while (") p.Print(nn.Cond) io.WriteString(p.w, ")") @@ -2209,3 +2197,18 @@ func (p *PrettyPrinter) printStmtWhile(n ast.Vertex) { p.indentDepth-- } } + +func (p *PrettyPrinter) printStmtAltWhile(n ast.Vertex) { + nn := n.(*ast.StmtWhile) + + io.WriteString(p.w, "while (") + p.Print(nn.Cond) + io.WriteString(p.w, ") :\n") + + s := nn.Stmt.(*ast.StmtStmtList) + p.printNodes(s.Stmts) + + io.WriteString(p.w, "\n") + p.printIndent() + io.WriteString(p.w, "endwhile;") +} diff --git a/pkg/printer/pretty_printer_test.go b/pkg/printer/pretty_printer_test.go index f4a3188..6bb07ea 100644 --- a/pkg/printer/pretty_printer_test.go +++ b/pkg/printer/pretty_printer_test.go @@ -2091,7 +2091,7 @@ func TestPrintAltElseIf(t *testing.T) { p := printer.NewPrettyPrinter(o, " ") p.Print(&ast.StmtElseIf{ - Alt: true, + Alt: true, Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, Stmt: &ast.StmtStmtList{ Stmts: []ast.Vertex{ @@ -2114,7 +2114,7 @@ func TestPrintAltElseIfEmpty(t *testing.T) { p := printer.NewPrettyPrinter(o, " ") p.Print(&ast.StmtElseIf{ - Alt: true, + Alt: true, Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, Stmt: &ast.StmtStmtList{}, }) @@ -2154,7 +2154,7 @@ func TestPrintAltElseEmpty(t *testing.T) { p := printer.NewPrettyPrinter(o, " ") p.Print(&ast.StmtElse{ - Alt: true, + Alt: true, Stmt: &ast.StmtStmtList{}, }) @@ -2241,7 +2241,7 @@ func TestPrintAltIf(t *testing.T) { p.Print(&ast.StmtNamespace{ Stmts: []ast.Vertex{ &ast.StmtIf{ - Alt: true, + Alt: true, Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, Stmt: &ast.StmtStmtList{ Stmts: []ast.Vertex{ @@ -2250,7 +2250,7 @@ func TestPrintAltIf(t *testing.T) { }, ElseIf: []ast.Vertex{ &ast.StmtElseIf{ - Alt: true, + Alt: true, Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, Stmt: &ast.StmtStmtList{ Stmts: []ast.Vertex{ @@ -2259,7 +2259,7 @@ func TestPrintAltIf(t *testing.T) { }, }, &ast.StmtElseIf{ - Alt: true, + Alt: true, Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("c")}}, Stmt: &ast.StmtStmtList{}, }, @@ -2342,7 +2342,8 @@ func TestPrintAltWhile(t *testing.T) { p := printer.NewPrettyPrinter(o, " ") p.Print(&ast.StmtNamespace{ Stmts: []ast.Vertex{ - &ast.StmtAltWhile{ + &ast.StmtWhile{ + Alt: true, Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, Stmt: &ast.StmtStmtList{ Stmts: []ast.Vertex{ diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index afc80a8..8275817 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -365,8 +365,6 @@ func (p *Printer) printNode(n ast.Vertex) { p.printStmtAltForeach(n) case *ast.StmtAltSwitch: p.printStmtAltSwitch(n) - case *ast.StmtAltWhile: - p.printStmtAltWhile(n) case *ast.StmtBreak: p.printStmtBreak(n) case *ast.StmtCase: @@ -2091,39 +2089,6 @@ func (p *Printer) printStmtAltSwitch(n ast.Vertex) { p.printFreeFloating(nn, token.End) } -func (p *Printer) printStmtAltWhile(n ast.Vertex) { - nn := n.(*ast.StmtAltWhile) - p.printFreeFloating(nn, token.Start) - - io.WriteString(p.w, "while") - - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, "(") - } - - p.Print(nn.Cond) - - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, ")") - } - - p.printFreeFloating(nn, token.Cond) - io.WriteString(p.w, ":") - - s := nn.Stmt.(*ast.StmtStmtList) - p.printNodes(s.Stmts) - p.printFreeFloating(nn, token.Stmts) - - io.WriteString(p.w, "endwhile") - p.printFreeFloating(nn, token.AltEnd) - p.printFreeFloating(nn, token.SemiColon) - if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, token.End) -} - func (p *Printer) printStmtBreak(n ast.Vertex) { nn := n.(*ast.StmtBreak) p.printFreeFloating(nn, token.Start) @@ -3169,25 +3134,35 @@ func (p *Printer) printStmtUseDeclaration(n *ast.StmtUseDeclaration) { p.printToken(n.CommaTkn, "") } -func (p *Printer) printStmtWhile(n ast.Vertex) { - nn := n.(*ast.StmtWhile) - p.printFreeFloating(nn, token.Start) - - io.WriteString(p.w, "while") - - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, "(") +func (p *Printer) printStmtWhile(n *ast.StmtWhile) { + if n.Alt { + p.printStmtAltWhile(n) + return } - p.Print(nn.Cond) + p.printToken(n.WhileTkn, "while") + p.printToken(n.OpenParenthesisTkn, "(") + p.Print(n.Cond) + p.printToken(n.CloseParenthesisTkn, ")") - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, ")") + p.Print(n.Stmt) +} + +func (p *Printer) printStmtAltWhile(n *ast.StmtWhile) { + p.printToken(n.WhileTkn, "while") + p.printToken(n.OpenParenthesisTkn, "(") + p.Print(n.Cond) + p.printToken(n.CloseParenthesisTkn, ")") + p.printToken(n.ColonTkn, ":") + + if stmtList, ok := n.Stmt.(*ast.StmtStmtList); ok { + p.printNodes(stmtList.Stmts) + } else { + p.Print(n.Stmt) } - p.Print(nn.Stmt) - - p.printFreeFloating(nn, token.End) + p.printToken(n.EndWhileTkn, "endwhile") + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printParserAs(n ast.Vertex) { diff --git a/pkg/printer/printer_parsed_php5_test.go b/pkg/printer/printer_parsed_php5_test.go index 82dd9a2..1af1e60 100644 --- a/pkg/printer/printer_parsed_php5_test.go +++ b/pkg/printer/printer_parsed_php5_test.go @@ -820,7 +820,8 @@ func TestParseAndPrintPhp5AltSwitch(t *testing.T) { } func TestParseAndPrintPhp5AltWhile(t *testing.T) { - src := `