From c1b3e6f5b2051fe542be7e3ec93a5df30fb94807 Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Mon, 24 Aug 2020 14:20:20 +0300 Subject: [PATCH] [refactoring] update ast structure of "name" nodes --- internal/php5/parser_test.go | 4 +- internal/php5/php5.go | Bin 298404 -> 296000 bytes internal/php5/php5.y | 308 ++++++++++++--------- internal/php5/php5_test.go | 6 +- internal/php7/parser_test.go | 4 +- internal/php7/php7.go | Bin 253133 -> 252280 bytes internal/php7/php7.y | 164 +++++------ internal/php7/php7_test.go | 6 +- pkg/ast/node.go | 24 +- pkg/ast/traverser/dfs.go | 8 +- pkg/ast/visitor/filter_tokens.go | 27 ++ pkg/ast/visitor/namespace_resolver.go | 4 +- pkg/ast/visitor/namespace_resolver_test.go | 14 +- pkg/printer/pretty_printer.go | 4 +- pkg/printer/pretty_printer_test.go | 6 +- pkg/printer/printer.go | 143 +++++----- pkg/printer/printer_parsed_php5_test.go | 35 ++- pkg/printer/printer_parsed_php7_test.go | 39 ++- pkg/printer/printer_test.go | 6 +- 19 files changed, 446 insertions(+), 356 deletions(-) diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index 6ab5b7a..ab1446d 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -8546,7 +8546,7 @@ func TestStmtNamespace(t *testing.T) { EndPos: 17, }, }, - NamespaceName: &ast.NameName{ + Name: &ast.NameName{ Node: ast.Node{ Position: &position.Position{ StartLine: 1, @@ -8604,7 +8604,7 @@ func TestStmtNamespace_Stmts(t *testing.T) { EndPos: 19, }, }, - NamespaceName: &ast.NameName{ + Name: &ast.NameName{ Node: ast.Node{ Position: &position.Position{ StartLine: 1, diff --git a/internal/php5/php5.go b/internal/php5/php5.go index a1be3c01d1e823818b9cead42d2f229ebccfa0a9..b074c966276016b5d0ba2a3ab7733f1b5d9c3eb4 100644 GIT binary patch delta 13770 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 BIv4-| delta 14338 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 O&9Vl=IUYWzJpTh!Na|kz delta 7108 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 I^=H-hpMk+Pi2wiq diff --git a/internal/php7/php7.y b/internal/php7/php7.y index f6589cd..33c558c 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -350,57 +350,59 @@ top_statement_list: namespace_name: T_STRING { - namePart := &ast.NameNamePart{ast.Node{}, $1.Value} - $$ = []ast.Vertex{namePart} - - // save position - namePart.GetNode().Position = position.NewTokenPosition($1) - - // save comments - yylex.(*Parser).setFreeFloating(namePart, token.Start, $1.SkippedTokens) + $$ = []ast.Vertex{ + &ast.NameNamePart{ + Node: ast.Node{ + Position: position.NewTokenPosition($1), + }, + StringTkn: $1, + Value: $1.Value, + }, + } } | namespace_name T_NS_SEPARATOR T_STRING { - namePart := &ast.NameNamePart{ast.Node{}, $3.Value} - $$ = append($1, namePart) - - // save position - namePart.GetNode().Position = position.NewTokenPosition($3) - - // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating(namePart, token.Start, $3.SkippedTokens) + $$ = append($1, &ast.NameNamePart{ + Node: ast.Node{ + Position: position.NewTokensPosition($2, $3), + }, + NsSeparatorTkn: $2, + StringTkn: $3, + Value: $3.Value, + }) } ; name: namespace_name { - $$ = &ast.NameName{ast.Node{}, $1} - - // save position - $$.GetNode().Position = position.NewNodeListPosition($1) + $$ = &ast.NameName{ + Node: ast.Node{ + Position: position.NewNodeListPosition($1), + }, + Parts: $1, + } } - | T_NAMESPACE T_NS_SEPARATOR namespace_name + | T_NAMESPACE T_NS_SEPARATOR namespace_name { - $$ = &ast.NameRelative{ast.Node{}, $3} - - // save position - $$.GetNode().Position = position.NewTokenNodeListPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Namespace, $2.SkippedTokens) + $$ = &ast.NameRelative{ + Node: ast.Node{ + Position: position.NewTokenNodeListPosition($1, $3), + }, + NsTkn: $1, + NsSeparatorTkn: $2, + Parts: $3, + } } - | T_NS_SEPARATOR namespace_name + | T_NS_SEPARATOR namespace_name { - $$ = &ast.NameFullyQualified{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokenNodeListPosition($1, $2) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.NameFullyQualified{ + Node: ast.Node{ + Position: position.NewTokenNodeListPosition($1, $2), + }, + NsSeparatorTkn: $1, + Parts: $2, + } } ; @@ -443,45 +445,49 @@ top_statement: } | T_NAMESPACE namespace_name ';' { - name := &ast.NameName{ast.Node{}, $2} - $$ = &ast.StmtNamespace{ast.Node{}, name, nil} - - // save position - name.GetNode().Position = position.NewNodeListPosition($2) - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).MoveFreeFloating($2[0], name) - yylex.(*Parser).setFreeFloating(name, token.End, $3.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) + $$ = &ast.StmtNamespace{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + NsTkn: $1, + Name: &ast.NameName{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Parts: $2, + }, + SemiColonTkn: $3, + } } | T_NAMESPACE namespace_name '{' top_statement_list '}' { - name := &ast.NameName{ast.Node{}, $2} - $$ = &ast.StmtNamespace{ast.Node{}, name, $4} - - // save position - name.GetNode().Position = position.NewNodeListPosition($2) - $$.GetNode().Position = position.NewTokensPosition($1, $5) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).MoveFreeFloating($2[0], name) - yylex.(*Parser).setFreeFloating(name, token.End, $3.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Stmts, $5.SkippedTokens) + $$ = &ast.StmtNamespace{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $5), + }, + NsTkn: $1, + Name: &ast.NameName{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Parts: $2, + }, + OpenCurlyBracket: $3, + Stmts: $4, + CloseCurlyBracket: $5, + } } | T_NAMESPACE '{' top_statement_list '}' { - $$ = &ast.StmtNamespace{ast.Node{}, nil, $3} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $4) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Namespace, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Stmts, $4.SkippedTokens) + $$ = &ast.StmtNamespace{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $4), + }, + NsTkn: $1, + OpenCurlyBracket: $2, + Stmts: $3, + CloseCurlyBracket: $4, + } } | T_USE mixed_group_use_declaration ';' { @@ -1222,10 +1228,12 @@ catch_name_list: } | catch_name_list '|' name { + switch n := lastNode($1).(type) { + case *ast.NameName: n.ListSeparatorTkn = $2 + case *ast.NameFullyQualified: n.ListSeparatorTkn = $2 + case *ast.NameRelative: n.ListSeparatorTkn = $2 + } $$ = append($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) } ; @@ -2251,10 +2259,12 @@ name_list: } | name_list ',' name { + switch n := lastNode($1).(type) { + case *ast.NameName: n.ListSeparatorTkn = $2 + case *ast.NameFullyQualified: n.ListSeparatorTkn = $2 + case *ast.NameRelative: n.ListSeparatorTkn = $2 + } $$ = append($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.SkippedTokens) } ; diff --git a/internal/php7/php7_test.go b/internal/php7/php7_test.go index 00d02cc..d717743 100644 --- a/internal/php7/php7_test.go +++ b/internal/php7/php7_test.go @@ -6962,7 +6962,7 @@ func TestPhp7(t *testing.T) { EndPos: 2525, }, }, - NamespaceName: &ast.NameName{ + Name: &ast.NameName{ Node: ast.Node{ Position: &position.Position{ StartLine: 115, @@ -6995,7 +6995,7 @@ func TestPhp7(t *testing.T) { EndPos: 2542, }, }, - NamespaceName: &ast.NameName{ + Name: &ast.NameName{ Node: ast.Node{ Position: &position.Position{ StartLine: 116, @@ -17695,7 +17695,7 @@ func TestPhp7(t *testing.T) { Position: &position.Position{ StartLine: 318, EndLine: 318, - StartPos: 5212, + StartPos: 5211, EndPos: 5215, }, }, diff --git a/pkg/ast/node.go b/pkg/ast/node.go index d7dd01d..d64da63 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -603,8 +603,12 @@ func (n *StmtLabel) Accept(v NodeVisitor) { // StmtNamespace node type StmtNamespace struct { Node - NamespaceName Vertex - Stmts []Vertex + NsTkn *token.Token + Name Vertex + OpenCurlyBracket *token.Token + Stmts []Vertex + CloseCurlyBracket *token.Token + SemiColonTkn *token.Token } func (n *StmtNamespace) Accept(v NodeVisitor) { @@ -1840,7 +1844,8 @@ func (n *ExprBinarySpaceship) Accept(v NodeVisitor) { type NameName struct { Node - Parts []Vertex + Parts []Vertex + ListSeparatorTkn *token.Token } func (n *NameName) Accept(v NodeVisitor) { @@ -1849,7 +1854,9 @@ func (n *NameName) Accept(v NodeVisitor) { type NameFullyQualified struct { Node - Parts []Vertex + NsSeparatorTkn *token.Token + Parts []Vertex + ListSeparatorTkn *token.Token } func (n *NameFullyQualified) Accept(v NodeVisitor) { @@ -1858,7 +1865,10 @@ func (n *NameFullyQualified) Accept(v NodeVisitor) { type NameRelative struct { Node - Parts []Vertex + NsTkn *token.Token + NsSeparatorTkn *token.Token + Parts []Vertex + ListSeparatorTkn *token.Token } func (n *NameRelative) Accept(v NodeVisitor) { @@ -1867,7 +1877,9 @@ func (n *NameRelative) Accept(v NodeVisitor) { type NameNamePart struct { Node - Value []byte + NsSeparatorTkn *token.Token + StringTkn *token.Token + Value []byte } func (n *NameNamePart) Accept(v NodeVisitor) { diff --git a/pkg/ast/traverser/dfs.go b/pkg/ast/traverser/dfs.go index 20eecf3..7e41a44 100644 --- a/pkg/ast/traverser/dfs.go +++ b/pkg/ast/traverser/dfs.go @@ -845,10 +845,10 @@ func (t *DFS) Traverse(n ast.Vertex) { if !t.visitor.EnterNode(nn) { return } - if nn.NamespaceName != nil { - t.visitor.Enter("NamespaceName", true) - t.Traverse(nn.NamespaceName) - t.visitor.Leave("NamespaceName", true) + if nn.Name != nil { + t.visitor.Enter("Name", true) + t.Traverse(nn.Name) + t.visitor.Leave("Name", true) } if nn.Stmts != nil { t.visitor.Enter("Stmts", false) diff --git a/pkg/ast/visitor/filter_tokens.go b/pkg/ast/visitor/filter_tokens.go index 7101b86..adba189 100644 --- a/pkg/ast/visitor/filter_tokens.go +++ b/pkg/ast/visitor/filter_tokens.go @@ -33,3 +33,30 @@ func (v *FilterTokens) StmtUseDeclaration(n *ast.StmtUseDeclaration) { n.AsTkn = nil n.CommaTkn = nil } + +func (v *FilterTokens) NameNamePart(n *ast.NameNamePart) { + n.NsSeparatorTkn = nil + n.StringTkn = nil +} + +func (v *FilterTokens) NameName(n *ast.NameName) { + n.ListSeparatorTkn = nil +} + +func (v *FilterTokens) NameFullyQualified(n *ast.NameFullyQualified) { + n.NsSeparatorTkn = nil + n.ListSeparatorTkn = nil +} + +func (v *FilterTokens) NameRelative(n *ast.NameRelative) { + n.NsTkn = nil + n.NsSeparatorTkn = nil + n.ListSeparatorTkn = nil +} + +func (v *FilterTokens) StmtNamespace(n *ast.StmtNamespace) { + n.NsTkn = nil + n.OpenCurlyBracket = nil + n.CloseCurlyBracket = nil + n.SemiColonTkn = nil +} diff --git a/pkg/ast/visitor/namespace_resolver.go b/pkg/ast/visitor/namespace_resolver.go index 34c92c7..fb5659d 100644 --- a/pkg/ast/visitor/namespace_resolver.go +++ b/pkg/ast/visitor/namespace_resolver.go @@ -37,10 +37,10 @@ func (nsr *NamespaceResolver) EnterNode(n ast.Vertex) bool { } func (nsr *NamespaceResolver) StmtNamespace(n *ast.StmtNamespace) { - if n.NamespaceName == nil { + if n.Name == nil { nsr.Namespace = NewNamespace("") } else { - NSParts := n.NamespaceName.(*ast.NameName).Parts + NSParts := n.Name.(*ast.NameName).Parts nsr.Namespace = NewNamespace(concatNameParts(NSParts)) } } diff --git a/pkg/ast/visitor/namespace_resolver_test.go b/pkg/ast/visitor/namespace_resolver_test.go index 34a31f7..5b01ecc 100644 --- a/pkg/ast/visitor/namespace_resolver_test.go +++ b/pkg/ast/visitor/namespace_resolver_test.go @@ -605,7 +605,7 @@ func TestResolveConstantsName(t *testing.T) { stxTree := &ast.StmtStmtList{ Stmts: []ast.Vertex{ &ast.StmtNamespace{ - NamespaceName: nameAB, + Name: nameAB, }, &ast.StmtConstList{ Consts: []ast.Vertex{ @@ -649,7 +649,7 @@ func TestResolveNamespaces(t *testing.T) { stxTree := &ast.StmtStmtList{ Stmts: []ast.Vertex{ &ast.StmtNamespace{ - NamespaceName: namespaceAB, + Name: namespaceAB, }, &ast.StmtConstList{ Consts: []ast.Vertex{ @@ -666,7 +666,7 @@ func TestResolveNamespaces(t *testing.T) { Stmts: []ast.Vertex{}, }, &ast.StmtNamespace{ - NamespaceName: namespaceCD, + Name: namespaceCD, Stmts: []ast.Vertex{ &ast.StmtUse{ UseDeclarations: []ast.Vertex{ @@ -749,7 +749,7 @@ func TestDoNotResolveReservedConstants(t *testing.T) { stxTree := &ast.StmtStmtList{ Stmts: []ast.Vertex{ &ast.StmtNamespace{ - NamespaceName: namespaceName, + Name: namespaceName, }, &ast.StmtExpression{ Expr: &ast.ExprConstFetch{ @@ -877,7 +877,7 @@ func TestDoNotResolveReservedNames(t *testing.T) { stxTree := &ast.StmtStmtList{ Stmts: []ast.Vertex{ &ast.StmtNamespace{ - NamespaceName: &ast.NameName{ + Name: &ast.NameName{ Parts: []ast.Vertex{ &ast.NameNamePart{Value: []byte("Foo")}, }, @@ -955,7 +955,7 @@ func TestDoNotResolveReservedSpecialNames(t *testing.T) { stxTree := &ast.StmtStmtList{ Stmts: []ast.Vertex{ &ast.StmtNamespace{ - NamespaceName: &ast.NameName{ + Name: &ast.NameName{ Parts: []ast.Vertex{ &ast.NameNamePart{Value: []byte("Foo")}, }, @@ -1007,7 +1007,7 @@ func TestResolvePropertyTypeName(t *testing.T) { stmts := &ast.StmtStmtList{ Stmts: []ast.Vertex{ &ast.StmtNamespace{ - NamespaceName: &ast.NameName{ + Name: &ast.NameName{ Parts: []ast.Vertex{ &ast.NameNamePart{Value: []byte("Foo")}, }, diff --git a/pkg/printer/pretty_printer.go b/pkg/printer/pretty_printer.go index 1aab5d1..fca19fd 100644 --- a/pkg/printer/pretty_printer.go +++ b/pkg/printer/pretty_printer.go @@ -1931,9 +1931,9 @@ func (p *PrettyPrinter) printStmtNamespace(n ast.Vertex) { io.WriteString(p.w, "namespace") - if nn.NamespaceName != nil { + if nn.Name != nil { io.WriteString(p.w, " ") - p.Print(nn.NamespaceName) + p.Print(nn.Name) } if nn.Stmts != nil { diff --git a/pkg/printer/pretty_printer_test.go b/pkg/printer/pretty_printer_test.go index 199bc2f..c457cb8 100644 --- a/pkg/printer/pretty_printer_test.go +++ b/pkg/printer/pretty_printer_test.go @@ -22,7 +22,7 @@ abstract class Bar extends Baz rootNode := &ast.Root{ Stmts: []ast.Vertex{ &ast.StmtNamespace{ - NamespaceName: &ast.NameName{ + Name: &ast.NameName{ Parts: []ast.Vertex{ &ast.NameNamePart{Value: []byte("Foo")}, }, @@ -3454,7 +3454,7 @@ func TestPrintNamespace(t *testing.T) { p := printer.NewPrettyPrinter(o, " ") p.Print(&ast.StmtNamespace{ - NamespaceName: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Name: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, }) expected := `namespace Foo;` @@ -3472,7 +3472,7 @@ func TestPrintNamespaceWithStmts(t *testing.T) { p.Print(&ast.StmtStmtList{ Stmts: []ast.Vertex{ &ast.StmtNamespace{ - NamespaceName: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Name: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, Stmts: []ast.Vertex{ &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}}, }, diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index 8d73f1b..0e8a0dd 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -55,6 +55,16 @@ func (p *Printer) joinPrint(glue string, nn []ast.Vertex) { } } +func (p *Printer) joinPrintRefactored(glue string, nn []ast.Vertex) { + for k, n := range nn { + if k > 0 { + p.bufStart = glue + } + + p.Print(n) + } +} + func (p *Printer) printNodes(nn []ast.Vertex) { for _, n := range nn { p.Print(n) @@ -558,50 +568,36 @@ func (p *Printer) printNodeArgument(n ast.Vertex) { // name -func (p *Printer) printNameNamePart(n ast.Vertex) { - nn := n.(*ast.NameNamePart) - p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart) - p.bufStart = "" - - io.WriteString(p.w, string(nn.Value)) - - p.printFreeFloating(nn, token.End) +func (p *Printer) printNameNamePart(n *ast.NameNamePart) { + p.printToken(n.NsSeparatorTkn, "") + p.printToken(n.StringTkn, string(n.Value)) } -func (p *Printer) printNameName(n ast.Vertex) { - nn := n.(*ast.NameName) - p.printFreeFloating(nn, token.Start) +func (p *Printer) printNameName(n *ast.NameName) { + p.printFreeFloating(n, token.Start) - p.joinPrint("\\", nn.Parts) + p.joinPrintRefactored("\\", n.Parts) - p.printFreeFloating(nn, token.End) + p.printToken(n.ListSeparatorTkn, "") } -func (p *Printer) printNameFullyQualified(n ast.Vertex) { - nn := n.(*ast.NameFullyQualified) - p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart) - p.bufStart = "" +func (p *Printer) printNameFullyQualified(n *ast.NameFullyQualified) { + p.printFreeFloating(n, token.Start) + p.printToken(n.NsSeparatorTkn, "\\") - io.WriteString(p.w, "\\") - p.joinPrint("\\", nn.Parts) + p.joinPrintRefactored("\\", n.Parts) - p.printFreeFloating(nn, token.End) + p.printToken(n.ListSeparatorTkn, "") } -func (p *Printer) printNameRelative(n ast.Vertex) { - nn := n.(*ast.NameRelative) - p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart) - p.bufStart = "" +func (p *Printer) printNameRelative(n *ast.NameRelative) { + p.printFreeFloating(n, token.Start) + p.printToken(n.NsTkn, "namespace") + p.printToken(n.NsSeparatorTkn, "\\") - io.WriteString(p.w, "namespace") - p.printFreeFloating(nn, token.Namespace) + p.joinPrintRefactored("\\", n.Parts) - for _, part := range nn.Parts { - io.WriteString(p.w, "\\") - p.Print(part) - } - - p.printFreeFloating(nn, token.End) + p.printToken(n.ListSeparatorTkn, "") } // scalar @@ -2299,7 +2295,9 @@ func (p *Printer) printStmtCatch(n ast.Vertex) { io.WriteString(p.w, "catch") p.printFreeFloating(nn, token.Catch) io.WriteString(p.w, "(") - p.joinPrint("|", nn.Types) + + p.joinPrintRefactored("|", nn.Types) + p.Print(nn.Var) p.printFreeFloating(nn, token.Var) io.WriteString(p.w, ")") @@ -2409,10 +2407,9 @@ func (p *Printer) printStmtClass(n ast.Vertex) { io.WriteString(p.w, " ") } io.WriteString(p.w, "implements") - if nn.Implements.InterfaceNames[0].GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") - } - p.joinPrint(",", nn.Implements.InterfaceNames) + p.bufStart = " " + p.joinPrintRefactored(",", nn.Implements.InterfaceNames) + } p.printFreeFloating(nn, token.Name) @@ -2896,10 +2893,8 @@ func (p *Printer) printStmtInterface(n ast.Vertex) { io.WriteString(p.w, " ") } io.WriteString(p.w, "extends") - if nn.Extends.InterfaceNames[0].GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") - } - p.joinPrint(",", nn.Extends.InterfaceNames) + p.bufStart = " " + p.joinPrintRefactored(",", nn.Extends.InterfaceNames) } p.printFreeFloating(nn, token.Name) @@ -2923,32 +2918,28 @@ func (p *Printer) printStmtLabel(n ast.Vertex) { p.printFreeFloating(nn, token.End) } -func (p *Printer) printStmtNamespace(n ast.Vertex) { - nn := n.(*ast.StmtNamespace) - p.printFreeFloating(nn, token.Start) - io.WriteString(p.w, "namespace") +func (p *Printer) printStmtNamespace(n *ast.StmtNamespace) { + p.printToken(n.NsTkn, "namespace") - if nn.NamespaceName != nil { - if nn.NamespaceName.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.NamespaceName) + if n.Name != nil { + p.bufStart = " " + p.Print(n.Name) } - if nn.Stmts != nil { - p.printFreeFloating(nn, token.Namespace) - io.WriteString(p.w, "{") - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, token.Stmts) - io.WriteString(p.w, "}") - } else { - p.printFreeFloating(nn, token.SemiColon) - if nn.GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, ";") - } + if n.Stmts != nil { + p.printToken(n.OpenCurlyBracket, "{") + p.printNodes(n.Stmts) + p.printToken(n.CloseCurlyBracket, "}") + return } - p.printFreeFloating(nn, token.End) + if n.OpenCurlyBracket != nil { + p.printToken(n.OpenCurlyBracket, "{") + p.printToken(n.CloseCurlyBracket, "}") + return + } + + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtNop(n ast.Vertex) { @@ -3202,10 +3193,8 @@ func (p *Printer) printStmtTraitUse(n ast.Vertex) { p.printFreeFloating(nn, token.Start) io.WriteString(p.w, "use") - if nn.Traits[0].GetNode().Tokens.IsEmpty() { - io.WriteString(p.w, " ") - } - p.joinPrint(",", nn.Traits) + p.bufStart = " " + p.joinPrintRefactored(",", nn.Traits) p.Print(nn.TraitAdaptationList) @@ -3276,11 +3265,13 @@ func (p *Printer) printStmtUnset(n ast.Vertex) { func (p *Printer) printStmtUse(n *ast.StmtUse) { p.printToken(n.UseTkn, "use") - p.bufStart = " " - p.Print(n.Type) + if n.Type != nil { + p.bufStart = " " + p.Print(n.Type) + } p.bufStart = " " - p.joinPrint(",", n.UseDeclarations) + p.joinPrintRefactored(",", n.UseDeclarations) p.printToken(n.SemiColonTkn, ";") } @@ -3298,16 +3289,7 @@ func (p *Printer) printStmtGroupUse(n *ast.StmtGroupUse) { p.printToken(n.NsSeparatorTkn, "\\") p.printToken(n.OpenCurlyBracketTkn, "{") - for k, v := range n.UseDeclarations { - p.Print(v) - var def string - if k != len(n.UseDeclarations)-1 { - def = "," - } - if decl, ok := v.(*ast.StmtUseDeclaration); ok { - p.printToken(decl.CommaTkn, def) - } - } + p.joinPrintRefactored(",", n.UseDeclarations) p.printToken(n.CloseCurlyBracketTkn, "}") p.printToken(n.SemiColonTkn, ";") @@ -3325,6 +3307,7 @@ func (p *Printer) printStmtUseDeclaration(n *ast.StmtUseDeclaration) { p.Print(n.Use) if n.Alias == nil { + p.printToken(n.CommaTkn, "") return } @@ -3333,6 +3316,8 @@ func (p *Printer) printStmtUseDeclaration(n *ast.StmtUseDeclaration) { p.bufStart = " " p.Print(n.Alias) + + p.printToken(n.CommaTkn, "") } func (p *Printer) printStmtWhile(n ast.Vertex) { diff --git a/pkg/printer/printer_parsed_php5_test.go b/pkg/printer/printer_parsed_php5_test.go index 60cdc39..17cef65 100644 --- a/pkg/printer/printer_parsed_php5_test.go +++ b/pkg/printer/printer_parsed_php5_test.go @@ -45,8 +45,8 @@ func TestParseAndPrintPhp5Root(t *testing.T) { } func TestParseAndPrintPhp5Identifier(t *testing.T) { - - src := `