From 7678303cb9b7e45e67f73735184d301cb68d76a4 Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Thu, 10 Sep 2020 23:11:08 +0300 Subject: [PATCH] [refactoring] update ast structure of "Echo" node --- internal/php5/php5.go | Bin 291575 -> 291345 bytes internal/php5/php5.y | 28 +- internal/php7/php7.go | Bin 243341 -> 243865 bytes internal/php7/php7.y | 30 +- internal/scanner/lexer.go | 2 +- internal/scanner/scanner.go | Bin 412458 -> 412497 bytes internal/scanner/scanner.rl | 8 +- pkg/ast/node.go | 5 +- pkg/ast/visitor/filter_tokens.go | 6 + pkg/printer/printer.go | 592 ++++++++++++------------ pkg/printer/printer_parsed_php5_test.go | 87 ++-- pkg/printer/printer_parsed_php7_test.go | 91 ++-- pkg/printer/printer_test.go | 40 +- 13 files changed, 401 insertions(+), 488 deletions(-) diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 8f172745feeccc6f547808e220c2b98adb0ae9c5..5392ff0446928a6a8795c72598e5956f085ce441 100644 GIT binary patch delta 9897 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 delta 9560 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�by<>PV#yPfebw1`*nrWAU5 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 trait_use_statement function_call_parameter trait_adaptation_statement trait_precedence trait_alias %type trait_method_reference_fully_qualified trait_method_reference trait_modifiers member_modifier method %type static_scalar_value static_operation static_var_list global_var_list -%type ctor_arguments function_call_parameter_list +%type ctor_arguments function_call_parameter_list echo_expr_list %type trait_adaptations %type switch_case_list %type method_body @@ -255,7 +255,7 @@ import ( %type top_statement_list namespace_name use_declarations use_function_declarations use_const_declarations %type inner_statement_list encaps_list isset_variables non_empty_array_pair_list %type array_pair_list assignment_list lexical_var_list elseif_list new_elseif_list non_empty_for_expr -%type for_expr case_list echo_expr_list unset_variables declare_list catch_statement additional_catches +%type for_expr case_list unset_variables declare_list catch_statement additional_catches %type non_empty_additional_catches parameter_list non_empty_parameter_list class_statement_list %type class_statement_list variable_modifiers method_modifiers class_variable_declaration %type interface_list non_empty_function_call_parameter_list trait_list trait_adaptation_list non_empty_trait_adaptation_list @@ -1054,16 +1054,11 @@ unticked_statement: } | T_ECHO echo_expr_list ';' { - $$ = &ast.StmtEcho{ast.Node{}, $2} + $2.(*ast.StmtEcho).EchoTkn = $1 + $2.(*ast.StmtEcho).SemiColonTkn = $3 + $2.(*ast.StmtEcho).Node.Position = position.NewTokensPosition($1, $3) - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setToken($$, token.Echo, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $3.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) + $$ = $2 } | T_INLINE_HTML { @@ -2874,14 +2869,16 @@ class_constant_declaration: echo_expr_list: echo_expr_list ',' expr { - $$ = append($1, $3) + $1.(*ast.StmtEcho).Exprs = append($1.(*ast.StmtEcho).Exprs, $3) + $1.(*ast.StmtEcho).SeparatorTkns = append($1.(*ast.StmtEcho).SeparatorTkns, $2) - // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) + $$ = $1 } | expr { - $$ = []ast.Vertex{$1} + $$ = &ast.StmtEcho{ + Exprs: []ast.Vertex{$1}, + } } ; @@ -3335,7 +3332,6 @@ expr_without_variable: $$.GetNode().Position = position.NewNodesPosition($1, $3) // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) yylex.(*Parser).setFreeFloating($$, token.Expr, $2.SkippedTokens) } | expr '+' expr diff --git a/internal/php7/php7.go b/internal/php7/php7.go index e26b9a2073fb49ece3b1bbcde0a46629e8ef4809..4734582a7493eaa72f99118a4072352d22ff6208 100644 GIT binary patch delta 12529 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 delta 11329 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 diff --git a/internal/php7/php7.y b/internal/php7/php7.y index a095f9a..6f37de7 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -249,7 +249,7 @@ import ( %type exit_expr scalar lexical_var function_call member_name property_name %type variable_class_name dereferencable_scalar constant dereferencable %type callable_expr callable_variable static_member new_variable -%type encaps_var encaps_var_offset +%type encaps_var encaps_var_offset echo_expr_list %type if_stmt %type alt_if_stmt %type if_stmt_without_else @@ -275,7 +275,7 @@ import ( %type encaps_list backticks_expr namespace_name catch_name_list catch_list class_const_list -%type const_list echo_expr_list for_exprs non_empty_for_exprs +%type const_list for_exprs non_empty_for_exprs %type unprefixed_use_declarations inline_use_declarations property_list %type case_list trait_adaptation_list unset_variables %type use_declarations lexical_var_list isset_variables non_empty_array_pair_list @@ -954,7 +954,6 @@ statement: { $2.(*ast.StmtGlobal).GlobalTkn = $1 $2.(*ast.StmtGlobal).SemiColonTkn = $3 - $2.(*ast.StmtGlobal).SeparatorTkns = append($2.(*ast.StmtGlobal).SeparatorTkns, nil) $2.(*ast.StmtGlobal).Node.Position = position.NewTokensPosition($1, $3) $$ = $2 @@ -963,23 +962,17 @@ statement: { $2.(*ast.StmtStatic).StaticTkn = $1 $2.(*ast.StmtStatic).SemiColonTkn = $3 - $2.(*ast.StmtStatic).SeparatorTkns = append($2.(*ast.StmtStatic).SeparatorTkns, nil) $2.(*ast.StmtStatic).Node.Position = position.NewTokensPosition($1, $3) $$ = $2 } | T_ECHO echo_expr_list ';' { - $$ = &ast.StmtEcho{ast.Node{}, $2} + $2.(*ast.StmtEcho).EchoTkn = $1 + $2.(*ast.StmtEcho).SemiColonTkn = $3 + $2.(*ast.StmtEcho).Node.Position = position.NewTokensPosition($1, $3) - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setToken($$, token.Echo, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Expr, $3.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) + $$ = $2 } | T_INLINE_HTML { @@ -2629,14 +2622,16 @@ const_decl: echo_expr_list: echo_expr_list ',' echo_expr { - $$ = append($1, $3) + $1.(*ast.StmtEcho).Exprs = append($1.(*ast.StmtEcho).Exprs, $3) + $1.(*ast.StmtEcho).SeparatorTkns = append($1.(*ast.StmtEcho).SeparatorTkns, $2) - // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) + $$ = $1 } | echo_expr { - $$ = []ast.Vertex{$1} + $$ = &ast.StmtEcho{ + Exprs: []ast.Vertex{$1}, + } } ; @@ -3061,7 +3056,6 @@ expr_without_variable: $$.GetNode().Position = position.NewNodesPosition($1, $3) // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) yylex.(*Parser).setFreeFloating($$, token.Expr, $2.SkippedTokens) } | expr '+' expr diff --git a/internal/scanner/lexer.go b/internal/scanner/lexer.go index b21ff7c..7986acb 100644 --- a/internal/scanner/lexer.go +++ b/internal/scanner/lexer.go @@ -58,7 +58,7 @@ func (lex *Lexer) setTokenPosition(token *token.Token) { } func (lex *Lexer) addSkippedToken(t *token.Token, id token.ID, ps, pe int) { - if lex.sts == 0 { + if lex.sts == -1 { lex.sts = lex.ts } diff --git a/internal/scanner/scanner.go b/internal/scanner/scanner.go index f90db2331179561005b52c12de75d42bed8a805e..9f779e69b85f30e18eea65d069f5eb189c65f1f8 100644 GIT binary patch delta 82 zcmZ2AP4eP2$qi3fm~;)BpR%++WnlzjCLm@8Vi2Eo`%@OSMXt)3X$m>16?(-b#R|5z Y3c7|0)m)sMa1jLqF3#HNEnaNP0O@`k+W-In delta 45 vcmcaOO>)&V$qi3f7!8`Av9v#9VFY3(AZ7+)5TAAXGZwZ*uG80fu`LDwuGA75 diff --git a/internal/scanner/scanner.rl b/internal/scanner/scanner.rl index 18874ae..b3a0015 100644 --- a/internal/scanner/scanner.rl +++ b/internal/scanner/scanner.rl @@ -26,7 +26,7 @@ func (lex *Lexer) Lex() *token.Token { tkn := lex.tokenPool.Get() - lex.sts = 0 + lex.sts = -1 lex.ste = 0 lblStart := 0 @@ -498,9 +498,13 @@ func (lex *Lexer) Lex() *token.Token { write exec; }%% + if lex.sts == -1 { + lex.sts = 0 + } + tkn.Value = lex.data[lex.ts:lex.te] tkn.ID = token.ID(tok) - tkn.SkippedString = lex.data[lex.sts:lex.ste] + tkn.Skipped = lex.data[lex.sts:lex.ste] lex.addSkippedToken(tkn, tok, lex.ts, lex.te); return tkn diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 1aa3120..16aa214 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -368,7 +368,10 @@ func (n *StmtDo) Accept(v NodeVisitor) { // StmtEcho node type StmtEcho struct { Node - Exprs []Vertex + EchoTkn *token.Token + Exprs []Vertex + SeparatorTkns []*token.Token + SemiColonTkn *token.Token } func (n *StmtEcho) Accept(v NodeVisitor) { diff --git a/pkg/ast/visitor/filter_tokens.go b/pkg/ast/visitor/filter_tokens.go index c0f9ef5..ef9f1b3 100644 --- a/pkg/ast/visitor/filter_tokens.go +++ b/pkg/ast/visitor/filter_tokens.go @@ -194,3 +194,9 @@ func (v *FilterTokens) StmtStatic(n *ast.StmtStatic) { func (v *FilterTokens) StmtStaticVar(n *ast.StmtStaticVar) { n.EqualTkn = nil } + +func (v *FilterTokens) StmtEcho(n *ast.StmtEcho) { + n.EchoTkn = nil + n.SeparatorTkns = nil + n.SemiColonTkn = nil +} diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index e7da279..20df694 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -1,6 +1,7 @@ package printer import ( + "bytes" "io" "strings" @@ -16,9 +17,10 @@ const ( ) type Printer struct { - w io.Writer - s printerState - bufStart string + w io.Writer + s printerState + bufStart string + lastWrite []byte } // NewPrinter - Constructor for Printer @@ -32,12 +34,17 @@ func (p *Printer) SetState(s printerState) { p.s = s } +func (p *Printer) write(b []byte) { + p.lastWrite = b + p.w.Write(b) +} + func (p *Printer) Print(n ast.Vertex) { _, isRoot := n.(*ast.Root) _, isInlineHtml := n.(*ast.StmtInlineHtml) if p.s == HtmlState && !isInlineHtml && !isRoot { if n.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " 0 { - io.WriteString(p.w, glue) + p.write([]byte(glue)) } p.Print(n) @@ -97,28 +104,28 @@ func (p *Printer) printFreeFloatingOrDefault(n ast.Vertex, pos token.Position, d } if len(n.GetNode().Tokens[pos]) == 0 { - io.WriteString(p.w, def) + p.write([]byte(def)) return } for _, m := range n.GetNode().Tokens[pos] { - io.WriteString(p.w, string(m.Value)) + p.write(m.Value) } } func (p *Printer) printToken(t *token.Token, def string) { if t != nil { - p.w.Write(t.Skipped) - p.w.Write(t.Value) + p.write(t.Skipped) + p.write(t.Value) p.bufStart = "" return } if def != "" { - p.w.Write([]byte(p.bufStart)) + p.write([]byte(p.bufStart)) p.bufStart = "" - p.w.Write([]byte(def)) + p.write([]byte(def)) return } } @@ -129,7 +136,7 @@ func (p *Printer) printFreeFloating(n ast.Vertex, pos token.Position) { } for _, m := range n.GetNode().Tokens[pos] { - io.WriteString(p.w, string(m.Value)) + p.write(m.Value) } } @@ -503,7 +510,7 @@ func (p *Printer) printNodeIdentifier(n ast.Vertex) { p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart) p.bufStart = "" - io.WriteString(p.w, string(nn.Value)) + p.write(nn.Value) p.printFreeFloating(nn, token.End) } @@ -512,7 +519,7 @@ func (p *Printer) printNodeReference(n ast.Vertex) { nn := n.(*ast.Reference) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "&") + p.write([]byte("&")) p.Print(nn.Var) p.printFreeFloating(nn, token.End) @@ -522,7 +529,7 @@ func (p *Printer) printNodeVariadic(n ast.Vertex) { nn := n.(*ast.Variadic) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "...") + p.write([]byte("...")) p.Print(nn.Var) p.printFreeFloating(nn, token.End) @@ -539,7 +546,7 @@ func (p *Printer) printNodeParameter(n ast.Vertex) { p.Print(nn.Var) if nn.DefaultValue != nil { - io.WriteString(p.w, "=") + p.write([]byte("=")) p.Print(nn.DefaultValue) } @@ -550,7 +557,7 @@ func (p *Printer) printNodeNullable(n ast.Vertex) { nn := n.(*ast.Nullable) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "?") + p.write([]byte("?")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -561,12 +568,12 @@ func (p *Printer) printNodeArgument(n ast.Vertex) { p.printFreeFloating(nn, token.Start) if nn.IsReference { - io.WriteString(p.w, "&") + p.write([]byte("&")) } p.printFreeFloating(nn, token.Ampersand) if nn.Variadic { - io.WriteString(p.w, "...") + p.write([]byte("...")) } p.Print(nn.Expr) @@ -615,7 +622,7 @@ func (p *Printer) printScalarLNumber(n ast.Vertex) { p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart) p.bufStart = "" - io.WriteString(p.w, string(nn.Value)) + p.write(nn.Value) p.printFreeFloating(nn, token.End) } @@ -625,7 +632,7 @@ func (p *Printer) printScalarDNumber(n ast.Vertex) { p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart) p.bufStart = "" - io.WriteString(p.w, string(nn.Value)) + p.write(nn.Value) p.printFreeFloating(nn, token.End) } @@ -635,7 +642,7 @@ func (p *Printer) printScalarString(n ast.Vertex) { p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart) p.bufStart = "" - io.WriteString(p.w, string(nn.Value)) + p.write(nn.Value) p.printFreeFloating(nn, token.End) } @@ -645,7 +652,7 @@ func (p *Printer) printScalarEncapsedStringPart(n ast.Vertex) { p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart) p.bufStart = "" - io.WriteString(p.w, string(nn.Value)) + p.write(nn.Value) p.printFreeFloating(nn, token.End) } @@ -655,7 +662,7 @@ func (p *Printer) printScalarEncapsed(n ast.Vertex) { p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart) p.bufStart = "" - io.WriteString(p.w, "\"") + p.write([]byte("\"")) for _, part := range nn.Parts { switch part.(type) { case *ast.ExprArrayDimFetch: @@ -676,7 +683,7 @@ func (p *Printer) printScalarEncapsed(n ast.Vertex) { p.Print(part) } } - io.WriteString(p.w, "\"") + p.write([]byte("\"")) p.printFreeFloating(nn, token.End) } @@ -686,7 +693,7 @@ func (p *Printer) printScalarHeredoc(n ast.Vertex) { p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart) p.bufStart = "" - io.WriteString(p.w, string(nn.Label)) + p.write(nn.Label) for _, part := range nn.Parts { switch part.(type) { @@ -709,7 +716,7 @@ func (p *Printer) printScalarHeredoc(n ast.Vertex) { } } - io.WriteString(p.w, strings.Trim(string(nn.Label), "<\"'\n")) + p.write([]byte(strings.Trim(string(nn.Label), "<\"'\n"))) p.printFreeFloating(nn, token.End) } @@ -719,7 +726,7 @@ func (p *Printer) printScalarMagicConstant(n ast.Vertex) { p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart) p.bufStart = "" - io.WriteString(p.w, string(nn.Value)) + p.write(nn.Value) p.printFreeFloating(nn, token.End) } @@ -731,7 +738,7 @@ func (p *Printer) printAssign(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "=") + p.write([]byte("=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -742,9 +749,9 @@ func (p *Printer) printAssignReference(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "=") + p.write([]byte("=")) p.printFreeFloating(nn, token.Equal) - io.WriteString(p.w, "&") + p.write([]byte("&")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -755,8 +762,8 @@ func (p *Printer) printAssignBitwiseAnd(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "&") - io.WriteString(p.w, "=") + p.write([]byte("&")) + p.write([]byte("=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -767,7 +774,7 @@ func (p *Printer) printAssignBitwiseOr(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "|=") + p.write([]byte("|=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -778,7 +785,7 @@ func (p *Printer) printAssignBitwiseXor(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "^=") + p.write([]byte("^=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -789,7 +796,7 @@ func (p *Printer) printAssignCoalesce(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "??=") + p.write([]byte("??=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -800,7 +807,7 @@ func (p *Printer) printAssignConcat(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, ".=") + p.write([]byte(".=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -811,7 +818,7 @@ func (p *Printer) printAssignDiv(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "/=") + p.write([]byte("/=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -822,7 +829,7 @@ func (p *Printer) printAssignMinus(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "-=") + p.write([]byte("-=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -833,7 +840,7 @@ func (p *Printer) printAssignMod(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "%=") + p.write([]byte("%=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -844,7 +851,7 @@ func (p *Printer) printAssignMul(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "*=") + p.write([]byte("*=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -855,7 +862,7 @@ func (p *Printer) printAssignPlus(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "+=") + p.write([]byte("+=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -866,7 +873,7 @@ func (p *Printer) printAssignPow(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "**=") + p.write([]byte("**=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -877,7 +884,7 @@ func (p *Printer) printAssignShiftLeft(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "<<=") + p.write([]byte("<<=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -888,7 +895,7 @@ func (p *Printer) printAssignShiftRight(n ast.Vertex) { p.printFreeFloating(nn, token.Start) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, ">>=") + p.write([]byte(">>=")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -902,7 +909,7 @@ func (p *Printer) printBinaryBitwiseAnd(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "&") + p.write([]byte("&")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -914,7 +921,7 @@ func (p *Printer) printBinaryBitwiseOr(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "|") + p.write([]byte("|")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -926,7 +933,7 @@ func (p *Printer) printBinaryBitwiseXor(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "^") + p.write([]byte("^")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -938,7 +945,7 @@ func (p *Printer) printBinaryBooleanAnd(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "&&") + p.write([]byte("&&")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -950,7 +957,7 @@ func (p *Printer) printBinaryBooleanOr(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "||") + p.write([]byte("||")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -962,7 +969,7 @@ func (p *Printer) printBinaryCoalesce(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "??") + p.write([]byte("??")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -974,7 +981,7 @@ func (p *Printer) printBinaryConcat(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, ".") + p.write([]byte(".")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -986,7 +993,7 @@ func (p *Printer) printBinaryDiv(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "/") + p.write([]byte("/")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -998,7 +1005,7 @@ func (p *Printer) printBinaryEqual(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "==") + p.write([]byte("==")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1010,7 +1017,7 @@ func (p *Printer) printBinaryGreaterOrEqual(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, ">=") + p.write([]byte(">=")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1022,7 +1029,7 @@ func (p *Printer) printBinaryGreater(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, ">") + p.write([]byte(">")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1034,7 +1041,7 @@ func (p *Printer) printBinaryIdentical(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "===") + p.write([]byte("===")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1047,11 +1054,11 @@ func (p *Printer) printBinaryLogicalAnd(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "and") + p.write([]byte("and")) if nn.Right.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Right) @@ -1065,11 +1072,11 @@ func (p *Printer) printBinaryLogicalOr(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "or") + p.write([]byte("or")) if nn.Right.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Right) @@ -1083,11 +1090,11 @@ func (p *Printer) printBinaryLogicalXor(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "xor") + p.write([]byte("xor")) if nn.Right.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Right) @@ -1100,7 +1107,7 @@ func (p *Printer) printBinaryMinus(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "-") + p.write([]byte("-")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1112,7 +1119,7 @@ func (p *Printer) printBinaryMod(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "%") + p.write([]byte("%")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1124,7 +1131,7 @@ func (p *Printer) printBinaryMul(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "*") + p.write([]byte("*")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1138,7 +1145,7 @@ func (p *Printer) printBinaryNotEqual(n ast.Vertex) { p.printFreeFloating(nn, token.Expr) p.printFreeFloating(nn, token.Equal) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "!=") + p.write([]byte("!=")) } p.Print(nn.Right) @@ -1151,7 +1158,7 @@ func (p *Printer) printBinaryNotIdentical(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "!==") + p.write([]byte("!==")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1163,7 +1170,7 @@ func (p *Printer) printBinaryPlus(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "+") + p.write([]byte("+")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1175,7 +1182,7 @@ func (p *Printer) printBinaryPow(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "**") + p.write([]byte("**")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1187,7 +1194,7 @@ func (p *Printer) printBinaryShiftLeft(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "<<") + p.write([]byte("<<")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1199,7 +1206,7 @@ func (p *Printer) printBinaryShiftRight(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, ">>") + p.write([]byte(">>")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1211,7 +1218,7 @@ func (p *Printer) printBinarySmallerOrEqual(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "<=") + p.write([]byte("<=")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1223,7 +1230,7 @@ func (p *Printer) printBinarySmaller(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "<") + p.write([]byte("<")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1235,7 +1242,7 @@ func (p *Printer) printBinarySpaceship(n ast.Vertex) { p.Print(nn.Left) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "<=>") + p.write([]byte("<=>")) p.Print(nn.Right) p.printFreeFloating(nn, token.End) @@ -1249,7 +1256,7 @@ func (p *Printer) printArray(n ast.Vertex) { p.printFreeFloating(nn, token.Cast) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "(array)") + p.write([]byte("(array)")) } p.Print(nn.Expr) @@ -1262,7 +1269,7 @@ func (p *Printer) printBool(n ast.Vertex) { p.printFreeFloating(nn, token.Cast) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "(boolean)") + p.write([]byte("(boolean)")) } p.Print(nn.Expr) @@ -1275,7 +1282,7 @@ func (p *Printer) printDouble(n ast.Vertex) { p.printFreeFloating(nn, token.Cast) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "(float)") + p.write([]byte("(float)")) } p.Print(nn.Expr) @@ -1288,7 +1295,7 @@ func (p *Printer) printInt(n ast.Vertex) { p.printFreeFloating(nn, token.Cast) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "(integer)") + p.write([]byte("(integer)")) } p.Print(nn.Expr) @@ -1301,7 +1308,7 @@ func (p *Printer) printObject(n ast.Vertex) { p.printFreeFloating(nn, token.Cast) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "(object)") + p.write([]byte("(object)")) } p.Print(nn.Expr) @@ -1314,7 +1321,7 @@ func (p *Printer) printString(n ast.Vertex) { p.printFreeFloating(nn, token.Cast) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "(string)") + p.write([]byte("(string)")) } p.Print(nn.Expr) @@ -1327,7 +1334,7 @@ func (p *Printer) printUnset(n ast.Vertex) { p.printFreeFloating(nn, token.Cast) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "(unset)") + p.write([]byte("(unset)")) } p.Print(nn.Expr) @@ -1342,12 +1349,12 @@ func (p *Printer) printExprArrayDimFetch(n ast.Vertex) { p.Print(nn.Var) p.printFreeFloating(nn, token.Var) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "[") + p.write([]byte("[")) } p.Print(nn.Dim) p.printFreeFloating(nn, token.Expr) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "]") + p.write([]byte("]")) } p.printFreeFloating(nn, token.End) } @@ -1358,12 +1365,12 @@ func (p *Printer) printExprArrayDimFetchWithoutLeadingDollar(n ast.Vertex) { p.printExprVariableWithoutLeadingDollar(nn.Var) p.printFreeFloating(nn, token.Var) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "[") + p.write([]byte("[")) } p.Print(nn.Dim) p.printFreeFloating(nn, token.Expr) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "]") + p.write([]byte("]")) } p.printFreeFloating(nn, token.End) } @@ -1373,13 +1380,13 @@ func (p *Printer) printExprArrayItem(n ast.Vertex) { p.printFreeFloating(nn, token.Start) if nn.Unpack { - io.WriteString(p.w, "...") + p.write([]byte("...")) } if nn.Key != nil { p.Print(nn.Key) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "=>") + p.write([]byte("=>")) } p.Print(nn.Val) @@ -1390,12 +1397,12 @@ func (p *Printer) printExprArrayItem(n ast.Vertex) { func (p *Printer) printExprArray(n ast.Vertex) { nn := n.(*ast.ExprArray) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "array") + p.write([]byte("array")) p.printFreeFloating(nn, token.Array) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.joinPrint(",", nn.Items) p.printFreeFloating(nn, token.ArrayPairList) - io.WriteString(p.w, ")") + p.write([]byte(")")) p.printFreeFloating(nn, token.End) } @@ -1405,25 +1412,25 @@ func (p *Printer) printExprArrowFunction(n ast.Vertex) { p.printFreeFloating(nn, token.Start) if nn.Static { - io.WriteString(p.w, "static") + p.write([]byte("static")) } p.printFreeFloating(nn, token.Static) if nn.Static && n.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "fn") + p.write([]byte("fn")) p.printFreeFloating(nn, token.Function) if nn.ReturnsRef { - io.WriteString(p.w, "&") + p.write([]byte("&")) } p.printFreeFloating(nn, token.Ampersand) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.joinPrint(",", nn.Params) p.printFreeFloating(nn, token.ParameterList) - io.WriteString(p.w, ")") + p.write([]byte(")")) p.printFreeFloating(nn, token.Params) if nn.ReturnType != nil { @@ -1432,9 +1439,9 @@ func (p *Printer) printExprArrowFunction(n ast.Vertex) { } p.printFreeFloating(nn, token.ReturnType) - io.WriteString(p.w, "=>") + p.write([]byte("=>")) - p.printNode(nn.Expr) + p.Print(nn.Expr) p.printFreeFloating(nn, token.End) } @@ -1442,7 +1449,7 @@ func (p *Printer) printExprArrowFunction(n ast.Vertex) { func (p *Printer) printExprBitwiseNot(n ast.Vertex) { nn := n.(*ast.ExprBitwiseNot) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "~") + p.write([]byte("~")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) } @@ -1450,7 +1457,7 @@ func (p *Printer) printExprBitwiseNot(n ast.Vertex) { func (p *Printer) printExprBooleanNot(n ast.Vertex) { nn := n.(*ast.ExprBooleanNot) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "!") + p.write([]byte("!")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) } @@ -1461,7 +1468,7 @@ func (p *Printer) printExprClassConstFetch(n ast.Vertex) { p.Print(nn.Class) p.printFreeFloating(nn, token.Name) - io.WriteString(p.w, "::") + p.write([]byte("::")) p.Print(nn.ConstantName) p.printFreeFloating(nn, token.End) @@ -1470,9 +1477,9 @@ func (p *Printer) printExprClassConstFetch(n ast.Vertex) { func (p *Printer) printExprClone(n ast.Vertex) { nn := n.(*ast.ExprClone) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "clone") + p.write([]byte("clone")) if nn.Expr.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -1481,12 +1488,12 @@ func (p *Printer) printExprClone(n ast.Vertex) { func (p *Printer) printExprClosureUse(n ast.Vertex) { nn := n.(*ast.ExprClosureUse) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "use") + p.write([]byte("use")) p.printFreeFloating(nn, token.Use) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.joinPrint(",", nn.Uses) p.printFreeFloating(nn, token.LexicalVarList) - io.WriteString(p.w, ")") + p.write([]byte(")")) p.printFreeFloating(nn, token.End) } @@ -1496,25 +1503,25 @@ func (p *Printer) printExprClosure(n ast.Vertex) { p.printFreeFloating(nn, token.Start) if nn.Static { - io.WriteString(p.w, "static") + p.write([]byte("static")) } p.printFreeFloating(nn, token.Static) if nn.Static && n.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "function") + p.write([]byte("function")) p.printFreeFloating(nn, token.Function) if nn.ReturnsRef { - io.WriteString(p.w, "&") + p.write([]byte("&")) } p.printFreeFloating(nn, token.Ampersand) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.joinPrint(",", nn.Params) p.printFreeFloating(nn, token.ParameterList) - io.WriteString(p.w, ")") + p.write([]byte(")")) p.printFreeFloating(nn, token.Params) if nn.ClosureUse != nil { @@ -1528,10 +1535,10 @@ func (p *Printer) printExprClosure(n ast.Vertex) { } p.printFreeFloating(nn, token.ReturnType) - io.WriteString(p.w, "{") + p.write([]byte("{")) p.printNodes(nn.Stmts) p.printFreeFloating(nn, token.Stmts) - io.WriteString(p.w, "}") + p.write([]byte("}")) p.printFreeFloating(nn, token.End) } @@ -1546,16 +1553,16 @@ func (p *Printer) printExprConstFetch(n ast.Vertex) { func (p *Printer) printExprEmpty(n ast.Vertex) { nn := n.(*ast.ExprEmpty) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "empty") + p.write([]byte("empty")) if _, ok := nn.Expr.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, "(") + p.write([]byte("(")) } p.Print(nn.Expr) if _, ok := nn.Expr.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, ")") + p.write([]byte(")")) } p.printFreeFloating(nn, token.End) @@ -1564,7 +1571,7 @@ func (p *Printer) printExprEmpty(n ast.Vertex) { func (p *Printer) printExprErrorSuppress(n ast.Vertex) { nn := n.(*ast.ExprErrorSuppress) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "@") + p.write([]byte("@")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -1574,16 +1581,16 @@ func (p *Printer) printExprEval(n ast.Vertex) { nn := n.(*ast.ExprEval) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "eval") + p.write([]byte("eval")) if _, ok := nn.Expr.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, "(") + p.write([]byte("(")) } p.Print(nn.Expr) if _, ok := nn.Expr.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, ")") + p.write([]byte(")")) } p.printFreeFloating(nn, token.End) @@ -1594,13 +1601,13 @@ func (p *Printer) printExprExit(n ast.Vertex) { p.printFreeFloating(nn, token.Start) if nn.Die { - io.WriteString(p.w, "die") + p.write([]byte("die")) } else { - io.WriteString(p.w, "exit") + p.write([]byte("exit")) } if nn.Expr != nil && nn.Expr.GetNode().Tokens.IsEmpty() && nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Expr) p.printFreeFloating(nn, token.Expr) @@ -1624,9 +1631,9 @@ func (p *Printer) printExprFunctionCall(n ast.Vertex) { func (p *Printer) printExprInclude(n ast.Vertex) { nn := n.(*ast.ExprInclude) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "include") + p.write([]byte("include")) if nn.Expr.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -1635,9 +1642,9 @@ func (p *Printer) printExprInclude(n ast.Vertex) { func (p *Printer) printExprIncludeOnce(n ast.Vertex) { nn := n.(*ast.ExprIncludeOnce) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "include_once") + p.write([]byte("include_once")) if nn.Expr.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -1650,10 +1657,10 @@ func (p *Printer) printExprInstanceOf(n ast.Vertex) { p.Print(nn.Expr) p.printFreeFloating(nn, token.Expr) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "instanceof") + p.write([]byte("instanceof")) p.bufStart = " " p.Print(nn.Class) @@ -1665,12 +1672,12 @@ func (p *Printer) printExprIsset(n ast.Vertex) { nn := n.(*ast.ExprIsset) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "isset") + p.write([]byte("isset")) p.printFreeFloating(nn, token.Isset) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.joinPrint(",", nn.Vars) p.printFreeFloating(nn, token.VarList) - io.WriteString(p.w, ")") + p.write([]byte(")")) p.printFreeFloating(nn, token.End) } @@ -1679,12 +1686,12 @@ func (p *Printer) printExprList(n ast.Vertex) { nn := n.(*ast.ExprList) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "list") + p.write([]byte("list")) p.printFreeFloating(nn, token.List) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.joinPrint(",", nn.Items) p.printFreeFloating(nn, token.ArrayPairList) - io.WriteString(p.w, ")") + p.write([]byte(")")) p.printFreeFloating(nn, token.End) } @@ -1695,7 +1702,7 @@ func (p *Printer) printExprMethodCall(n ast.Vertex) { p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "->") + p.write([]byte("->")) p.Print(nn.Method) p.printFreeFloatingOrDefault(nn.ArgumentList, token.Start, "(") @@ -1709,7 +1716,7 @@ func (p *Printer) printExprNew(n ast.Vertex) { nn := n.(*ast.ExprNew) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "new") + p.write([]byte("new")) p.bufStart = " " p.Print(nn.Class) @@ -1728,7 +1735,7 @@ func (p *Printer) printExprPostDec(n ast.Vertex) { p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "--") + p.write([]byte("--")) p.printFreeFloating(nn, token.End) } @@ -1739,7 +1746,7 @@ func (p *Printer) printExprPostInc(n ast.Vertex) { p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "++") + p.write([]byte("++")) p.printFreeFloating(nn, token.End) } @@ -1748,7 +1755,7 @@ func (p *Printer) printExprPreDec(n ast.Vertex) { nn := n.(*ast.ExprPreDec) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "--") + p.write([]byte("--")) p.Print(nn.Var) p.printFreeFloating(nn, token.End) @@ -1758,7 +1765,7 @@ func (p *Printer) printExprPreInc(n ast.Vertex) { nn := n.(*ast.ExprPreInc) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "++") + p.write([]byte("++")) p.Print(nn.Var) p.printFreeFloating(nn, token.End) @@ -1768,9 +1775,9 @@ func (p *Printer) printExprPrint(n ast.Vertex) { nn := n.(*ast.ExprPrint) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "print") + p.write([]byte("print")) if nn.Expr.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Expr) @@ -1783,7 +1790,7 @@ func (p *Printer) printExprPropertyFetch(n ast.Vertex) { p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "->") + p.write([]byte("->")) p.Print(nn.Property) p.printFreeFloating(nn, token.End) @@ -1793,7 +1800,7 @@ func (p *Printer) printExprReference(n ast.Vertex) { nn := n.(*ast.ExprReference) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "&") + p.write([]byte("&")) p.Print(nn.Var) p.printFreeFloating(nn, token.End) @@ -1803,9 +1810,9 @@ func (p *Printer) printExprRequire(n ast.Vertex) { nn := n.(*ast.ExprRequire) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "require") + p.write([]byte("require")) if nn.Expr.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Expr) @@ -1816,9 +1823,9 @@ func (p *Printer) printExprRequireOnce(n ast.Vertex) { nn := n.(*ast.ExprRequireOnce) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "require_once") + p.write([]byte("require_once")) if nn.Expr.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Expr) @@ -1829,9 +1836,9 @@ func (p *Printer) printExprShellExec(n ast.Vertex) { nn := n.(*ast.ExprShellExec) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "`") + p.write([]byte("`")) p.joinPrint("", nn.Parts) - io.WriteString(p.w, "`") + p.write([]byte("`")) p.printFreeFloating(nn, token.End) } @@ -1840,10 +1847,10 @@ func (p *Printer) printExprShortArray(n ast.Vertex) { nn := n.(*ast.ExprShortArray) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "[") + p.write([]byte("[")) p.joinPrint(",", nn.Items) p.printFreeFloating(nn, token.ArrayPairList) - io.WriteString(p.w, "]") + p.write([]byte("]")) p.printFreeFloating(nn, token.End) } @@ -1852,10 +1859,10 @@ func (p *Printer) printExprShortList(n ast.Vertex) { nn := n.(*ast.ExprShortList) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "[") + p.write([]byte("[")) p.joinPrint(",", nn.Items) p.printFreeFloating(nn, token.ArrayPairList) - io.WriteString(p.w, "]") + p.write([]byte("]")) p.printFreeFloating(nn, token.End) } @@ -1866,7 +1873,7 @@ func (p *Printer) printExprStaticCall(n ast.Vertex) { p.Print(nn.Class) p.printFreeFloating(nn, token.Name) - io.WriteString(p.w, "::") + p.write([]byte("::")) p.Print(nn.Call) p.printFreeFloatingOrDefault(nn.ArgumentList, token.Start, "(") @@ -1882,7 +1889,7 @@ func (p *Printer) printExprStaticPropertyFetch(n ast.Vertex) { p.Print(nn.Class) p.printFreeFloating(nn, token.Name) - io.WriteString(p.w, "::") + p.write([]byte("::")) p.Print(nn.Property) p.printFreeFloating(nn, token.End) @@ -1894,14 +1901,14 @@ func (p *Printer) printExprTernary(n ast.Vertex) { p.Print(nn.Condition) p.printFreeFloating(nn, token.Cond) - io.WriteString(p.w, "?") + p.write([]byte("?")) if nn.IfTrue != nil { p.Print(nn.IfTrue) } p.printFreeFloating(nn, token.True) - io.WriteString(p.w, ":") + p.write([]byte(":")) p.Print(nn.IfFalse) p.printFreeFloating(nn, token.End) @@ -1911,7 +1918,7 @@ func (p *Printer) printExprUnaryMinus(n ast.Vertex) { nn := n.(*ast.ExprUnaryMinus) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "-") + p.write([]byte("-")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -1921,7 +1928,7 @@ func (p *Printer) printExprUnaryPlus(n ast.Vertex) { nn := n.(*ast.ExprUnaryPlus) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "+") + p.write([]byte("+")) p.Print(nn.Expr) p.printFreeFloating(nn, token.End) @@ -1933,7 +1940,7 @@ func (p *Printer) printExprVariable(n ast.Vertex) { p.bufStart = "" if _, ok := nn.VarName.(*ast.Identifier); !ok { - io.WriteString(p.w, "$") + p.write([]byte("$")) } p.Print(nn.VarName) @@ -1954,9 +1961,9 @@ func (p *Printer) printExprYieldFrom(n ast.Vertex) { nn := n.(*ast.ExprYieldFrom) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "yield from") + p.write([]byte("yield from")) if nn.Expr.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Expr) @@ -1967,18 +1974,18 @@ func (p *Printer) printExprYield(n ast.Vertex) { nn := n.(*ast.ExprYield) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "yield") + p.write([]byte("yield")) if nn.Key != nil { if nn.Key.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Key) p.printFreeFloating(nn, token.Expr) - io.WriteString(p.w, "=>") + p.write([]byte("=>")) } else { if nn.Value.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } } @@ -1993,45 +2000,45 @@ func (p *Printer) printStmtAltForeach(n ast.Vertex) { nn := n.(*ast.StmtAltForeach) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "foreach") + p.write([]byte("foreach")) p.printFreeFloating(nn, token.Foreach) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.Print(nn.Expr) p.printFreeFloating(nn, token.Expr) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "as") + p.write([]byte("as")) if nn.Key != nil { if nn.Key.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Key) p.printFreeFloating(nn, token.Key) - io.WriteString(p.w, "=>") + p.write([]byte("=>")) } else { if nn.Var.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } } p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, ")") + p.write([]byte(")")) p.printFreeFloating(nn, token.Cond) - io.WriteString(p.w, ":") + p.write([]byte(":")) s := nn.Stmt.(*ast.StmtStmtList) p.printNodes(s.Stmts) p.printFreeFloating(nn, token.Stmts) - io.WriteString(p.w, "endforeach") + p.write([]byte("endforeach")) p.printFreeFloating(nn, token.AltEnd) p.printFreeFloating(nn, token.SemiColon) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + p.write([]byte(";")) } p.printFreeFloating(nn, token.End) @@ -2060,20 +2067,20 @@ func (p *Printer) printStmtCatch(n ast.Vertex) { nn := n.(*ast.StmtCatch) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "catch") + p.write([]byte("catch")) p.printFreeFloating(nn, token.Catch) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.joinPrintRefactored("|", nn.Types) p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, ")") + p.write([]byte(")")) p.printFreeFloating(nn, token.Cond) - io.WriteString(p.w, "{") + p.write([]byte("{")) p.printNodes(nn.Stmts) p.printFreeFloating(nn, token.Stmts) - io.WriteString(p.w, "}") + p.write([]byte("}")) p.printFreeFloating(nn, token.End) } @@ -2085,37 +2092,37 @@ func (p *Printer) printStmtClassMethod(n ast.Vertex) { if nn.Modifiers != nil { for k, m := range nn.Modifiers { if k > 0 && m.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(m) } if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } } p.printFreeFloating(nn, token.ModifierList) - io.WriteString(p.w, "function") + p.write([]byte("function")) p.printFreeFloating(nn, token.Function) if nn.ReturnsRef { if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "&") + p.write([]byte("&")) p.printFreeFloating(nn, token.Ampersand) } else { if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } } p.Print(nn.MethodName) p.printFreeFloating(nn, token.Name) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.joinPrint(",", nn.Params) p.printFreeFloating(nn, token.ParameterList) - io.WriteString(p.w, ")") + p.write([]byte(")")) p.printFreeFloating(nn, token.Params) if nn.ReturnType != nil { @@ -2136,17 +2143,17 @@ func (p *Printer) printStmtClass(n ast.Vertex) { if nn.Modifiers != nil { for k, m := range nn.Modifiers { if k > 0 && m.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(m) } if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } } p.printFreeFloating(nn, token.ModifierList) - io.WriteString(p.w, "class") + p.write([]byte("class")) if nn.ClassName != nil { p.bufStart = " " @@ -2162,9 +2169,9 @@ func (p *Printer) printStmtClass(n ast.Vertex) { if nn.Extends != nil { p.printFreeFloating(nn.Extends, token.Start) if nn.Extends.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "extends") + p.write([]byte("extends")) p.bufStart = " " p.Print(nn.Extends.ClassName) } @@ -2172,19 +2179,19 @@ func (p *Printer) printStmtClass(n ast.Vertex) { if nn.Implements != nil { p.printFreeFloating(nn.Implements, token.Start) if nn.Implements.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "implements") + p.write([]byte("implements")) p.bufStart = " " p.joinPrintRefactored(",", nn.Implements.InterfaceNames) } p.printFreeFloating(nn, token.Name) - io.WriteString(p.w, "{") + p.write([]byte("{")) p.printNodes(nn.Stmts) p.printFreeFloating(nn, token.Stmts) - io.WriteString(p.w, "}") + p.write([]byte("}")) p.printFreeFloating(nn, token.End) } @@ -2227,27 +2234,27 @@ func (p *Printer) printStmtDeclare(n ast.Vertex) { nn := n.(*ast.StmtDeclare) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "declare") + p.write([]byte("declare")) p.printFreeFloating(nn, token.Declare) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.joinPrintRefactored(",", nn.Consts) p.printFreeFloating(nn, token.ConstList) - io.WriteString(p.w, ")") + p.write([]byte(")")) if nn.Alt { p.printFreeFloating(nn, token.Cond) - io.WriteString(p.w, ":") + p.write([]byte(":")) s := nn.Stmt.(*ast.StmtStmtList) p.printNodes(s.Stmts) p.printFreeFloating(nn, token.Stmts) - io.WriteString(p.w, "enddeclare") + p.write([]byte("enddeclare")) p.printFreeFloating(nn, token.AltEnd) p.printFreeFloating(nn, token.SemiColon) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + p.write([]byte(";")) } } else { p.Print(nn.Stmt) @@ -2275,28 +2282,11 @@ func (p *Printer) printStmtDo(n *ast.StmtDo) { p.printToken(n.SemiColonTkn, ";") } -func (p *Printer) printStmtEcho(n ast.Vertex) { - nn := n.(*ast.StmtEcho) - - if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "echo") - } - if nn.Exprs[0].GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") - } - - p.printFreeFloating(nn, token.Start) - p.printFreeFloating(nn, token.Echo) - - p.joinPrint(",", nn.Exprs) - p.printFreeFloating(nn, token.Expr) - - p.printFreeFloating(nn, token.SemiColon) - if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, token.End) +func (p *Printer) printStmtEcho(n *ast.StmtEcho) { + p.printToken(n.EchoTkn, "echo") + p.bufStart = " " + p.printSeparatedList(n.Exprs, n.SeparatorTkns, ",") + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtElseif(n *ast.StmtElseIf) { @@ -2358,7 +2348,7 @@ func (p *Printer) printStmtExpression(n ast.Vertex) { p.printFreeFloating(nn, token.SemiColon) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + p.write([]byte(";")) } p.printFreeFloating(nn, token.End) @@ -2368,12 +2358,12 @@ func (p *Printer) printStmtFinally(n ast.Vertex) { nn := n.(*ast.StmtFinally) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "finally") + p.write([]byte("finally")) p.printFreeFloating(nn, token.Finally) - io.WriteString(p.w, "{") + p.write([]byte("{")) p.printNodes(nn.Stmts) p.printFreeFloating(nn, token.Stmts) - io.WriteString(p.w, "}") + p.write([]byte("}")) p.printFreeFloating(nn, token.End) } @@ -2410,7 +2400,7 @@ func (p *Printer) printStmtAltFor(n *ast.StmtFor) { if stmtList, ok := n.Stmt.(*ast.StmtStmtList); ok { p.printNodes(stmtList.Stmts) } else { - p.printNode(n.Stmt) + p.Print(n.Stmt) } p.printToken(n.EndForTkn, "endfor") @@ -2421,34 +2411,34 @@ func (p *Printer) printStmtForeach(n ast.Vertex) { nn := n.(*ast.StmtForeach) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "foreach") + p.write([]byte("foreach")) p.printFreeFloating(nn, token.Foreach) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.Print(nn.Expr) p.printFreeFloating(nn, token.Expr) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "as") + p.write([]byte("as")) if nn.Key != nil { if nn.Key.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Key) p.printFreeFloating(nn, token.Key) - io.WriteString(p.w, "=>") + p.write([]byte("=>")) } else { if nn.Var.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } } p.Print(nn.Var) p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, ")") + p.write([]byte(")")) p.Print(nn.Stmt) @@ -2459,27 +2449,27 @@ func (p *Printer) printStmtFunction(n ast.Vertex) { nn := n.(*ast.StmtFunction) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "function") + p.write([]byte("function")) p.printFreeFloating(nn, token.Function) if nn.ReturnsRef { if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "&") + p.write([]byte("&")) } else { if nn.FunctionName.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } } p.Print(nn.FunctionName) p.printFreeFloating(nn, token.Name) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.joinPrint(",", nn.Params) p.printFreeFloating(nn, token.ParamList) - io.WriteString(p.w, ")") + p.write([]byte(")")) p.printFreeFloating(nn, token.Params) if nn.ReturnType != nil { @@ -2488,10 +2478,10 @@ func (p *Printer) printStmtFunction(n ast.Vertex) { } p.printFreeFloating(nn, token.ReturnType) - io.WriteString(p.w, "{") + p.write([]byte("{")) p.printNodes(nn.Stmts) p.printFreeFloating(nn, token.Stmts) - io.WriteString(p.w, "}") + p.write([]byte("}")) p.printFreeFloating(nn, token.End) } @@ -2507,16 +2497,16 @@ func (p *Printer) printStmtGoto(n ast.Vertex) { nn := n.(*ast.StmtGoto) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "goto") + p.write([]byte("goto")) if nn.Label.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Label) p.printFreeFloating(nn, token.Label) p.printFreeFloating(nn, token.SemiColon) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + p.write([]byte(";")) } p.printFreeFloating(nn, token.End) @@ -2569,12 +2559,12 @@ func (p *Printer) printStmtInlineHTML(n ast.Vertex) { nn := n.(*ast.StmtInlineHtml) p.printFreeFloating(nn, token.Start) - if p.s == PhpState && nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, "?>") + if p.s == PhpState && !bytes.Contains(p.lastWrite, []byte("?>")) { + p.write([]byte("?>")) } p.SetState(HtmlState) - io.WriteString(p.w, string(nn.Value)) + p.write(nn.Value) p.printFreeFloating(nn, token.End) } @@ -2583,10 +2573,10 @@ func (p *Printer) printStmtInterface(n ast.Vertex) { nn := n.(*ast.StmtInterface) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "interface") + p.write([]byte("interface")) if nn.InterfaceName.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.InterfaceName) @@ -2594,18 +2584,18 @@ func (p *Printer) printStmtInterface(n ast.Vertex) { if nn.Extends != nil { p.printFreeFloating(nn.Extends, token.Start) if nn.Extends.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "extends") + p.write([]byte("extends")) p.bufStart = " " p.joinPrintRefactored(",", nn.Extends.InterfaceNames) } p.printFreeFloating(nn, token.Name) - io.WriteString(p.w, "{") + p.write([]byte("{")) p.printNodes(nn.Stmts) p.printFreeFloating(nn, token.Stmts) - io.WriteString(p.w, "}") + p.write([]byte("}")) p.printFreeFloating(nn, token.End) } @@ -2617,7 +2607,7 @@ func (p *Printer) printStmtLabel(n ast.Vertex) { p.Print(nn.LabelName) p.printFreeFloating(nn, token.Label) - io.WriteString(p.w, ":") + p.write([]byte(":")) p.printFreeFloating(nn, token.End) } @@ -2650,7 +2640,7 @@ func (p *Printer) printStmtNop(n ast.Vertex) { p.printFreeFloatingOrDefault(n, token.Start, p.bufStart) p.printFreeFloating(n, token.SemiColon) if n.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + p.write([]byte(";")) } p.printFreeFloating(n, token.End) } @@ -2661,7 +2651,7 @@ func (p *Printer) printStmtPropertyList(n ast.Vertex) { for k, m := range nn.Modifiers { if k > 0 && m.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(m) } @@ -2672,7 +2662,7 @@ func (p *Printer) printStmtPropertyList(n ast.Vertex) { } if nn.Properties[0].GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.joinPrint(",", nn.Properties) @@ -2680,7 +2670,7 @@ func (p *Printer) printStmtPropertyList(n ast.Vertex) { p.printFreeFloating(n, token.SemiColon) if n.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + p.write([]byte(";")) } p.printFreeFloating(nn, token.End) @@ -2694,7 +2684,7 @@ func (p *Printer) printStmtProperty(n ast.Vertex) { if nn.Expr != nil { p.printFreeFloating(nn, token.Var) - io.WriteString(p.w, "=") + p.write([]byte("=")) p.Print(nn.Expr) } @@ -2766,16 +2756,16 @@ func (p *Printer) printStmtThrow(n ast.Vertex) { nn := n.(*ast.StmtThrow) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "throw") + p.write([]byte("throw")) if nn.Expr.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Expr) p.printFreeFloating(nn, token.Expr) p.printFreeFloating(nn, token.SemiColon) if n.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + p.write([]byte(";")) } p.printFreeFloating(nn, token.End) @@ -2785,10 +2775,10 @@ func (p *Printer) printStmtTraitAdaptationList(n ast.Vertex) { nn := n.(*ast.StmtTraitAdaptationList) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "{") + p.write([]byte("{")) p.printNodes(nn.Adaptations) p.printFreeFloating(nn, token.AdaptationList) - io.WriteString(p.w, "}") + p.write([]byte("}")) p.printFreeFloating(nn, token.End) } @@ -2800,7 +2790,7 @@ func (p *Printer) printStmtTraitMethodRef(n ast.Vertex) { if nn.Trait != nil { p.Print(nn.Trait) p.printFreeFloating(nn, token.Name) - io.WriteString(p.w, "::") + p.write([]byte("::")) } p.Print(nn.Method) @@ -2816,20 +2806,20 @@ func (p *Printer) printStmtTraitUseAlias(n ast.Vertex) { p.printFreeFloating(nn, token.Ref) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "as") + p.write([]byte("as")) if nn.Modifier != nil { if nn.Modifier.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Modifier) } if nn.Alias != nil { if nn.Alias.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.Alias) } @@ -2837,7 +2827,7 @@ func (p *Printer) printStmtTraitUseAlias(n ast.Vertex) { p.printFreeFloating(nn, token.SemiColon) if n.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + p.write([]byte(";")) } p.printFreeFloating(nn, token.End) @@ -2850,17 +2840,17 @@ func (p *Printer) printStmtTraitUsePrecedence(n ast.Vertex) { p.Print(nn.Ref) p.printFreeFloating(nn, token.Ref) if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } - io.WriteString(p.w, "insteadof") + p.write([]byte("insteadof")) p.bufStart = " " p.joinPrint(",", nn.Insteadof) p.printFreeFloating(nn, token.NameList) p.printFreeFloating(nn, token.SemiColon) if n.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + p.write([]byte(";")) } p.printFreeFloating(nn, token.End) @@ -2870,7 +2860,7 @@ func (p *Printer) printStmtTraitUse(n ast.Vertex) { nn := n.(*ast.StmtTraitUse) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "use") + p.write([]byte("use")) p.bufStart = " " p.joinPrintRefactored(",", nn.Traits) @@ -2883,17 +2873,17 @@ func (p *Printer) printStmtTrait(n ast.Vertex) { nn := n.(*ast.StmtTrait) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "trait") + p.write([]byte("trait")) if nn.TraitName.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") + p.write([]byte(" ")) } p.Print(nn.TraitName) p.printFreeFloating(nn, token.Name) - io.WriteString(p.w, "{") + p.write([]byte("{")) p.printNodes(nn.Stmts) p.printFreeFloating(nn, token.Stmts) - io.WriteString(p.w, "}") + p.write([]byte("}")) p.printFreeFloating(nn, token.End) } @@ -2902,12 +2892,12 @@ func (p *Printer) printStmtTry(n ast.Vertex) { nn := n.(*ast.StmtTry) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "try") + p.write([]byte("try")) p.printFreeFloating(nn, token.Try) - io.WriteString(p.w, "{") + p.write([]byte("{")) p.printNodes(nn.Stmts) p.printFreeFloating(nn, token.Stmts) - io.WriteString(p.w, "}") + p.write([]byte("}")) if nn.Catches != nil { p.printNodes(nn.Catches) @@ -2924,17 +2914,17 @@ func (p *Printer) printStmtUnset(n ast.Vertex) { nn := n.(*ast.StmtUnset) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "unset") + p.write([]byte("unset")) p.printFreeFloating(nn, token.Unset) - io.WriteString(p.w, "(") + p.write([]byte("(")) p.joinPrint(",", nn.Vars) p.printFreeFloating(nn, token.VarList) - io.WriteString(p.w, ")") + p.write([]byte(")")) p.printFreeFloating(nn, token.CloseParenthesisToken) p.printFreeFloating(nn, token.SemiColon) if n.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") + p.write([]byte(";")) } p.printFreeFloating(nn, token.End) @@ -3033,7 +3023,7 @@ func (p *Printer) printParserAs(n ast.Vertex) { nn := n.(*ast.ParserAs) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "as") + p.write([]byte("as")) p.Print(nn.Child) p.printFreeFloating(nn, token.End) @@ -3043,7 +3033,7 @@ func (p *Printer) printParserNsSeparator(n ast.Vertex) { nn := n.(*ast.ParserNsSeparator) p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "\\") + p.write([]byte("\\")) p.Print(nn.Child) p.printFreeFloating(nn, token.End) diff --git a/pkg/printer/printer_parsed_php5_test.go b/pkg/printer/printer_parsed_php5_test.go index 8a2ee8d..75dfafa 100644 --- a/pkg/printer/printer_parsed_php5_test.go +++ b/pkg/printer/printer_parsed_php5_test.go @@ -45,7 +45,6 @@ func TestParseAndPrintPhp5Root(t *testing.T) { } func TestParseAndPrintPhp5Identifier(t *testing.T) { - // TODO: remove ; after HTML")}, - &ast.StmtExpression{ - Expr: &ast.ExprVariable{ - Node: ast.Node{ - Tokens: token.Collection{ - token.Start: []*token.Token{ - { - ID: token.ID('$'), - Value: []byte("$"), - }, - }, - }, - }, - VarName: &ast.Identifier{ - Value: []byte("a"), + &ast.StmtEcho{ + Exprs: []ast.Vertex{ + &ast.ScalarString{ + Value: []byte(`"a"`), }, }, }, &ast.StmtInlineHtml{Value: []byte("
HTML
")}, - &ast.StmtExpression{ - Expr: &ast.ExprVariable{ - Node: ast.Node{ - Tokens: token.Collection{ - token.Start: []*token.Token{ - { - ID: token.ID('$'), - Value: []byte("$"), - }, - }, - }, - }, - VarName: &ast.Identifier{ - Value: []byte("a"), + &ast.StmtEcho{ + Exprs: []ast.Vertex{ + &ast.ScalarString{ + Value: []byte(`"b"`), }, }, }, }, }) - expected := `
HTML
HTML
HTML
HTML