pretti printer: print indents

This commit is contained in:
z7zmey 2018-04-03 19:20:55 +03:00
parent a394ea9fcc
commit a514fec90f
2 changed files with 716 additions and 425 deletions

View File

@ -44,13 +44,22 @@ func (p *Printer) joinPrint(glue string, nn []node.Node) {
} }
func (p *Printer) printNodes(nn []node.Node) { func (p *Printer) printNodes(nn []node.Node) {
p.indentDepth++
l := len(nn) - 1 l := len(nn) - 1
for k, n := range nn { for k, n := range nn {
p.printIndent()
p.Print(n) p.Print(n)
if k < l { if k < l {
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
} }
} }
p.indentDepth--
}
func (p *Printer) printIndent() {
for i := 0; i < p.indentDepth; i++ {
io.WriteString(p.w, p.indentStr)
}
} }
func (p *Printer) printNode(n node.Node) { func (p *Printer) printNode(n node.Node) {
@ -997,7 +1006,9 @@ func (p *Printer) printExprClosure(n node.Node) {
io.WriteString(p.w, " {\n") io.WriteString(p.w, " {\n")
p.printNodes(nn.Stmts) p.printNodes(nn.Stmts)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
} }
func (p *Printer) printExprConstFetch(n node.Node) { func (p *Printer) printExprConstFetch(n node.Node) {
@ -1314,6 +1325,7 @@ func (p *Printer) printStmtAltFor(n node.Node) {
s := nn.Stmt.(*stmt.StmtList) s := nn.Stmt.(*stmt.StmtList)
p.printNodes(s.Stmts) p.printNodes(s.Stmts)
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "endfor;") io.WriteString(p.w, "endfor;")
} }
@ -1340,8 +1352,9 @@ func (p *Printer) printStmtAltForeach(n node.Node) {
s := nn.Stmt.(*stmt.StmtList) s := nn.Stmt.(*stmt.StmtList)
p.printNodes(s.Stmts) p.printNodes(s.Stmts)
io.WriteString(p.w, "\n")
io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "endforeach;") io.WriteString(p.w, "endforeach;")
} }
@ -1357,15 +1370,18 @@ func (p *Printer) printStmtAltIf(n node.Node) {
for _, elseif := range nn.ElseIf { for _, elseif := range nn.ElseIf {
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.printIndent()
p.Print(elseif) p.Print(elseif)
} }
if nn.Else != nil { if nn.Else != nil {
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.printIndent()
p.Print(nn.Else) p.Print(nn.Else)
} }
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "endif;") io.WriteString(p.w, "endif;")
} }
@ -1378,8 +1394,9 @@ func (p *Printer) printStmtAltSwitch(n node.Node) {
s := nn.Cases s := nn.Cases
p.printNodes(s) p.printNodes(s)
io.WriteString(p.w, "\n")
io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "endswitch;") io.WriteString(p.w, "endswitch;")
} }
@ -1392,8 +1409,9 @@ func (p *Printer) printStmtAltWhile(n node.Node) {
s := nn.Stmt.(*stmt.StmtList) s := nn.Stmt.(*stmt.StmtList)
p.printNodes(s.Stmts) p.printNodes(s.Stmts)
io.WriteString(p.w, "\n")
io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "endwhile;") io.WriteString(p.w, "endwhile;")
} }
@ -1431,7 +1449,9 @@ func (p *Printer) printStmtCatch(n node.Node) {
p.Print(nn.Variable) p.Print(nn.Variable)
io.WriteString(p.w, ") {\n") io.WriteString(p.w, ") {\n")
p.printNodes(nn.Stmts) p.printNodes(nn.Stmts)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
} }
func (p *Printer) printStmtClassMethod(n node.Node) { func (p *Printer) printStmtClassMethod(n node.Node) {
@ -1457,9 +1477,13 @@ func (p *Printer) printStmtClassMethod(n node.Node) {
p.Print(nn.ReturnType) p.Print(nn.ReturnType)
} }
io.WriteString(p.w, "\n{\n") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "{\n")
p.printNodes(nn.Stmts) p.printNodes(nn.Stmts)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
} }
func (p *Printer) printStmtClass(n node.Node) { func (p *Printer) printStmtClass(n node.Node) {
@ -1492,9 +1516,13 @@ func (p *Printer) printStmtClass(n node.Node) {
p.joinPrint(", ", nn.Implements) p.joinPrint(", ", nn.Implements)
} }
io.WriteString(p.w, "\n{\n") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "{\n")
p.printNodes(nn.Stmts) p.printNodes(nn.Stmts)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
} }
func (p *Printer) printStmtClassConstList(n node.Node) { func (p *Printer) printStmtClassConstList(n node.Node) {
@ -1547,7 +1575,10 @@ func (p *Printer) printStmtDeclare(n node.Node) {
p.Print(s) p.Print(s)
default: default:
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.indentDepth++
p.printIndent()
p.Print(s) p.Print(s)
p.indentDepth--
} }
} }
@ -1572,8 +1603,12 @@ func (p *Printer) printStmtDo(n node.Node) {
io.WriteString(p.w, " ") io.WriteString(p.w, " ")
default: default:
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.indentDepth++
p.printIndent()
p.Print(s) p.Print(s)
p.indentDepth--
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.printIndent()
} }
io.WriteString(p.w, "while (") io.WriteString(p.w, "while (")
@ -1604,7 +1639,10 @@ func (p *Printer) printStmtElseif(n node.Node) {
p.Print(s) p.Print(s)
default: default:
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.indentDepth++
p.printIndent()
p.Print(s) p.Print(s)
p.indentDepth--
} }
} }
@ -1622,7 +1660,10 @@ func (p *Printer) printStmtElse(n node.Node) {
p.Print(s) p.Print(s)
default: default:
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.indentDepth++
p.printIndent()
p.Print(s) p.Print(s)
p.indentDepth--
} }
} }
@ -1639,7 +1680,9 @@ func (p *Printer) printStmtFinally(n node.Node) {
io.WriteString(p.w, "finally {\n") io.WriteString(p.w, "finally {\n")
p.printNodes(nn.Stmts) p.printNodes(nn.Stmts)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
} }
func (p *Printer) printStmtFor(n node.Node) { func (p *Printer) printStmtFor(n node.Node) {
@ -1662,7 +1705,10 @@ func (p *Printer) printStmtFor(n node.Node) {
p.Print(s) p.Print(s)
default: default:
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.indentDepth++
p.printIndent()
p.Print(s) p.Print(s)
p.indentDepth--
} }
} }
@ -1693,7 +1739,10 @@ func (p *Printer) printStmtForeach(n node.Node) {
p.Print(s) p.Print(s)
default: default:
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.indentDepth++
p.printIndent()
p.Print(s) p.Print(s)
p.indentDepth--
} }
} }
@ -1719,7 +1768,9 @@ func (p *Printer) printStmtFunction(n node.Node) {
io.WriteString(p.w, " {\n") io.WriteString(p.w, " {\n")
p.printNodes(nn.Stmts) p.printNodes(nn.Stmts)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
} }
func (p *Printer) printStmtGlobal(n node.Node) { func (p *Printer) printStmtGlobal(n node.Node) {
@ -1774,16 +1825,22 @@ func (p *Printer) printStmtIf(n node.Node) {
p.Print(s) p.Print(s)
default: default:
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.indentDepth++
p.printIndent()
p.Print(s) p.Print(s)
p.indentDepth--
} }
if nn.ElseIf != nil { if nn.ElseIf != nil {
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.indentDepth--
p.printNodes(nn.ElseIf) p.printNodes(nn.ElseIf)
p.indentDepth++
} }
if nn.Else != nil { if nn.Else != nil {
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.printIndent()
p.Print(nn.Else) p.Print(nn.Else)
} }
} }
@ -1811,9 +1868,13 @@ func (p *Printer) printStmtInterface(n node.Node) {
p.joinPrint(", ", nn.Extends) p.joinPrint(", ", nn.Extends)
} }
io.WriteString(p.w, "\n{\n") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "{\n")
p.printNodes(nn.Stmts) p.printNodes(nn.Stmts)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
} }
func (p *Printer) printStmtLabel(n node.Node) { func (p *Printer) printStmtLabel(n node.Node) {
@ -1836,7 +1897,9 @@ func (p *Printer) printStmtNamespace(n node.Node) {
if nn.Stmts != nil { if nn.Stmts != nil {
io.WriteString(p.w, " {\n") io.WriteString(p.w, " {\n")
p.printNodes(nn.Stmts) p.printNodes(nn.Stmts)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
} else { } else {
io.WriteString(p.w, ";") io.WriteString(p.w, ";")
} }
@ -1897,7 +1960,9 @@ func (p *Printer) printStmtStmtList(n node.Node) {
io.WriteString(p.w, "{\n") io.WriteString(p.w, "{\n")
p.printNodes(nn.Stmts) p.printNodes(nn.Stmts)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
} }
func (p *Printer) printStmtSwitch(n node.Node) { func (p *Printer) printStmtSwitch(n node.Node) {
@ -1909,7 +1974,9 @@ func (p *Printer) printStmtSwitch(n node.Node) {
io.WriteString(p.w, " {\n") io.WriteString(p.w, " {\n")
p.printNodes(nn.Cases) p.printNodes(nn.Cases)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
} }
func (p *Printer) printStmtThrow(n node.Node) { func (p *Printer) printStmtThrow(n node.Node) {
@ -1966,7 +2033,9 @@ func (p *Printer) printStmtTraitUse(n node.Node) {
if nn.Adaptations != nil { if nn.Adaptations != nil {
io.WriteString(p.w, " {\n") io.WriteString(p.w, " {\n")
p.printNodes(nn.Adaptations) p.printNodes(nn.Adaptations)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
} else { } else {
io.WriteString(p.w, ";") io.WriteString(p.w, ";")
} }
@ -1978,9 +2047,13 @@ func (p *Printer) printStmtTrait(n node.Node) {
io.WriteString(p.w, "trait ") io.WriteString(p.w, "trait ")
p.Print(nn.TraitName) p.Print(nn.TraitName)
io.WriteString(p.w, "\n{\n") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "{\n")
p.printNodes(nn.Stmts) p.printNodes(nn.Stmts)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
} }
func (p *Printer) printStmtTry(n node.Node) { func (p *Printer) printStmtTry(n node.Node) {
@ -1988,15 +2061,20 @@ func (p *Printer) printStmtTry(n node.Node) {
io.WriteString(p.w, "try {\n") io.WriteString(p.w, "try {\n")
p.printNodes(nn.Stmts) p.printNodes(nn.Stmts)
io.WriteString(p.w, "\n}") io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "}")
if nn.Catches != nil { if nn.Catches != nil {
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.indentDepth--
p.printNodes(nn.Catches) p.printNodes(nn.Catches)
p.indentDepth++
} }
if nn.Finally != nil { if nn.Finally != nil {
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.printIndent()
p.Print(nn.Finally) p.Print(nn.Finally)
} }
} }
@ -2055,6 +2133,9 @@ func (p *Printer) printStmtWhile(n node.Node) {
p.Print(s) p.Print(s)
default: default:
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
p.indentDepth++
p.printIndent()
p.Print(s) p.Print(s)
p.indentDepth--
} }
} }

View File

@ -1252,7 +1252,9 @@ func TestPrintExprClosure(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&expr.Closure{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&expr.Closure{
Static: true, Static: true,
ReturnsRef: true, ReturnsRef: true,
Params: []node.Node{ Params: []node.Node{
@ -1276,10 +1278,14 @@ func TestPrintExprClosure(t *testing.T) {
Stmts: []node.Node{ Stmts: []node.Node{
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}},
}, },
},
},
}) })
expected := `static function &(&$var) use (&$a, $b): \Foo { expected := `namespace {
$a; static function &(&$var) use (&$a, $b): \Foo {
$a;
}
}` }`
actual := o.String() actual := o.String()
@ -1940,7 +1946,7 @@ func TestPrintAltElseIf(t *testing.T) {
}) })
expected := `elseif ($a) : expected := `elseif ($a) :
$b;` $b;`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -1978,7 +1984,7 @@ func TestPrintAltElse(t *testing.T) {
}) })
expected := `else : expected := `else :
$b;` $b;`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2006,7 +2012,9 @@ func TestPrintAltFor(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.AltFor{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.AltFor{
Init: []node.Node{ Init: []node.Node{
&expr.Variable{VarName: &node.Identifier{Value: "a"}}, &expr.Variable{VarName: &node.Identifier{Value: "a"}},
}, },
@ -2021,11 +2029,15 @@ func TestPrintAltFor(t *testing.T) {
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "d"}}}, &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "d"}}},
}, },
}, },
},
},
}) })
expected := `for ($a; $b; $c) : expected := `namespace {
$d; for ($a; $b; $c) :
endfor;` $d;
endfor;
}`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2037,7 +2049,9 @@ func TestPrintAltForeach(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.AltForeach{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.AltForeach{
ByRef: true, ByRef: true,
Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}},
Key: &expr.Variable{VarName: &node.Identifier{Value: "key"}}, Key: &expr.Variable{VarName: &node.Identifier{Value: "key"}},
@ -2047,11 +2061,15 @@ func TestPrintAltForeach(t *testing.T) {
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "d"}}}, &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "d"}}},
}, },
}, },
},
},
}) })
expected := `foreach ($var as $key => &$val) : expected := `namespace {
$d; foreach ($var as $key => &$val) :
endforeach;` $d;
endforeach;
}`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2063,7 +2081,9 @@ func TestPrintAltIf(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.AltIf{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.AltIf{
Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
Stmt: &stmt.StmtList{ Stmt: &stmt.StmtList{
Stmts: []node.Node{ Stmts: []node.Node{
@ -2091,16 +2111,20 @@ func TestPrintAltIf(t *testing.T) {
}, },
}, },
}, },
},
},
}) })
expected := `if ($a) : expected := `namespace {
$d; if ($a) :
elseif ($b) : $d;
$b; elseif ($b) :
elseif ($c) : $b;
else : elseif ($c) :
$b; else :
endif;` $b;
endif;
}`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2112,7 +2136,9 @@ func TestPrintStmtAltSwitch(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.AltSwitch{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.AltSwitch{
Cond: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, Cond: &expr.Variable{VarName: &node.Identifier{Value: "var"}},
Cases: []node.Node{ Cases: []node.Node{
&stmt.Case{ &stmt.Case{
@ -2128,14 +2154,18 @@ func TestPrintStmtAltSwitch(t *testing.T) {
}, },
}, },
}, },
},
},
}) })
expected := `switch ($var) : expected := `namespace {
case 'a': switch ($var) :
$a; case 'a':
case 'b': $a;
$b; case 'b':
endswitch;` $b;
endswitch;
}`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2147,18 +2177,24 @@ func TestPrintAltWhile(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.AltWhile{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.AltWhile{
Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
Stmt: &stmt.StmtList{ Stmt: &stmt.StmtList{
Stmts: []node.Node{ Stmts: []node.Node{
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}}, &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}},
}, },
}, },
},
},
}) })
expected := `while ($a) : expected := `namespace {
$b; while ($a) :
endwhile;` $b;
endwhile;
}`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2194,7 +2230,7 @@ func TestPrintStmtCase(t *testing.T) {
}) })
expected := `case $a: expected := `case $a:
$a;` $a;`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2223,7 +2259,9 @@ func TestPrintStmtCatch(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Catch{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.Catch{
Types: []node.Node{ Types: []node.Node{
&name.Name{Parts: []node.Node{&name.NamePart{Value: "Exception"}}}, &name.Name{Parts: []node.Node{&name.NamePart{Value: "Exception"}}},
&name.FullyQualified{Parts: []node.Node{&name.NamePart{Value: "RuntimeException"}}}, &name.FullyQualified{Parts: []node.Node{&name.NamePart{Value: "RuntimeException"}}},
@ -2232,10 +2270,14 @@ func TestPrintStmtCatch(t *testing.T) {
Stmts: []node.Node{ Stmts: []node.Node{
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}},
}, },
},
},
}) })
expected := `catch (Exception | \RuntimeException $e) { expected := `namespace {
$a; catch (Exception | \RuntimeException $e) {
$a;
}
}` }`
actual := o.String() actual := o.String()
@ -2272,7 +2314,7 @@ func TestPrintStmtClassMethod(t *testing.T) {
expected := `public function &foo(?int &$a = null, ...$b): void expected := `public function &foo(?int &$a = null, ...$b): void
{ {
$a; $a;
}` }`
actual := o.String() actual := o.String()
@ -2285,7 +2327,9 @@ func TestPrintStmtClass(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Class{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.Class{
Modifiers: []node.Node{&node.Identifier{Value: "abstract"}}, Modifiers: []node.Node{&node.Identifier{Value: "abstract"}},
ClassName: &node.Identifier{Value: "Foo"}, ClassName: &node.Identifier{Value: "Foo"},
Extends: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, Extends: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}},
@ -2304,11 +2348,15 @@ func TestPrintStmtClass(t *testing.T) {
}, },
}, },
}, },
},
},
}) })
expected := `abstract class Foo extends Bar implements Baz, Quuz expected := `namespace {
{ abstract class Foo extends Bar implements Baz, Quuz
public const FOO = 'bar'; {
public const FOO = 'bar';
}
}` }`
actual := o.String() actual := o.String()
@ -2321,7 +2369,9 @@ func TestPrintStmtAnonymousClass(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Class{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.Class{
Modifiers: []node.Node{&node.Identifier{Value: "abstract"}}, Modifiers: []node.Node{&node.Identifier{Value: "abstract"}},
Args: []node.Node{ Args: []node.Node{
&node.Argument{ &node.Argument{
@ -2347,11 +2397,15 @@ func TestPrintStmtAnonymousClass(t *testing.T) {
}, },
}, },
}, },
},
},
}) })
expected := `abstract class($a, $b) extends Bar implements Baz, Quuz expected := `namespace {
{ abstract class($a, $b) extends Bar implements Baz, Quuz
public const FOO = 'bar'; {
public const FOO = 'bar';
}
}` }`
actual := o.String() actual := o.String()
@ -2423,7 +2477,9 @@ func TestPrintStmtDeclareStmts(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Declare{ p.Print(&stmt.StmtList{
Stmts: []node.Node{
&stmt.Declare{
Consts: []node.Node{ Consts: []node.Node{
&stmt.Constant{ &stmt.Constant{
ConstantName: &node.Identifier{Value: "FOO"}, ConstantName: &node.Identifier{Value: "FOO"},
@ -2435,10 +2491,14 @@ func TestPrintStmtDeclareStmts(t *testing.T) {
&stmt.Nop{}, &stmt.Nop{},
}, },
}, },
},
},
}) })
expected := `declare(FOO = 'bar') { expected := `{
; declare(FOO = 'bar') {
;
}
}` }`
actual := o.String() actual := o.String()
@ -2451,7 +2511,9 @@ func TestPrintStmtDeclareExpr(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Declare{ p.Print(&stmt.StmtList{
Stmts: []node.Node{
&stmt.Declare{
Consts: []node.Node{ Consts: []node.Node{
&stmt.Constant{ &stmt.Constant{
ConstantName: &node.Identifier{Value: "FOO"}, ConstantName: &node.Identifier{Value: "FOO"},
@ -2459,10 +2521,14 @@ func TestPrintStmtDeclareExpr(t *testing.T) {
}, },
}, },
Stmt: &stmt.Expression{Expr: &scalar.String{Value: "bar"}}, Stmt: &stmt.Expression{Expr: &scalar.String{Value: "bar"}},
},
},
}) })
expected := `declare(FOO = 'bar') expected := `{
'bar';` declare(FOO = 'bar')
'bar';
}`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2503,7 +2569,7 @@ func TestPrintStmtDefalut(t *testing.T) {
}) })
expected := `default: expected := `default:
$a;` $a;`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2531,16 +2597,22 @@ func TestPrintStmtDo_Expression(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Do{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.Do{
Cond: &scalar.Lnumber{Value: "1"}, Cond: &scalar.Lnumber{Value: "1"},
Stmt: &stmt.Expression{ Stmt: &stmt.Expression{
Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
}, },
},
},
}) })
expected := `do expected := `namespace {
$a; do
while (1);` $a;
while (1);
}`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2552,18 +2624,24 @@ func TestPrintStmtDo_StmtList(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Do{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.Do{
Cond: &scalar.Lnumber{Value: "1"}, Cond: &scalar.Lnumber{Value: "1"},
Stmt: &stmt.StmtList{ Stmt: &stmt.StmtList{
Stmts: []node.Node{ Stmts: []node.Node{
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}},
}, },
}, },
},
},
}) })
expected := `do { expected := `namespace {
$a; do {
} while (1);` $a;
} while (1);
}`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2604,7 +2682,7 @@ func TestPrintStmtElseIfStmts(t *testing.T) {
}) })
expected := `elseif ($a) { expected := `elseif ($a) {
; ;
}` }`
actual := o.String() actual := o.String()
@ -2623,7 +2701,7 @@ func TestPrintStmtElseIfExpr(t *testing.T) {
}) })
expected := `elseif ($a) expected := `elseif ($a)
'bar';` 'bar';`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2661,7 +2739,7 @@ func TestPrintStmtElseStmts(t *testing.T) {
}) })
expected := `else { expected := `else {
; ;
}` }`
actual := o.String() actual := o.String()
@ -2679,7 +2757,7 @@ func TestPrintStmtElseExpr(t *testing.T) {
}) })
expected := `else expected := `else
'bar';` 'bar';`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2721,14 +2799,20 @@ func TestPrintStmtFinally(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Finally{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.Finally{
Stmts: []node.Node{ Stmts: []node.Node{
&stmt.Nop{}, &stmt.Nop{},
}, },
},
},
}) })
expected := `finally { expected := `namespace {
; finally {
;
}
}` }`
actual := o.String() actual := o.String()
@ -2741,7 +2825,9 @@ func TestPrintStmtForStmts(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.For{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.For{
Init: []node.Node{ Init: []node.Node{
&expr.Variable{VarName: &node.Identifier{Value: "a"}}, &expr.Variable{VarName: &node.Identifier{Value: "a"}},
&expr.Variable{VarName: &node.Identifier{Value: "b"}}, &expr.Variable{VarName: &node.Identifier{Value: "b"}},
@ -2759,10 +2845,14 @@ func TestPrintStmtForStmts(t *testing.T) {
&stmt.Nop{}, &stmt.Nop{},
}, },
}, },
},
},
}) })
expected := `for ($a, $b; $c, $d; $e, $f) { expected := `namespace {
; for ($a, $b; $c, $d; $e, $f) {
;
}
}` }`
actual := o.String() actual := o.String()
@ -2775,7 +2865,9 @@ func TestPrintStmtForExpr(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.For{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.For{
Init: []node.Node{ Init: []node.Node{
&expr.Variable{VarName: &node.Identifier{Value: "a"}}, &expr.Variable{VarName: &node.Identifier{Value: "a"}},
}, },
@ -2786,10 +2878,14 @@ func TestPrintStmtForExpr(t *testing.T) {
&expr.Variable{VarName: &node.Identifier{Value: "c"}}, &expr.Variable{VarName: &node.Identifier{Value: "c"}},
}, },
Stmt: &stmt.Expression{Expr: &scalar.String{Value: "bar"}}, Stmt: &stmt.Expression{Expr: &scalar.String{Value: "bar"}},
},
},
}) })
expected := `for ($a; $b; $c) expected := `namespace {
'bar';` for ($a; $b; $c)
'bar';
}`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2826,7 +2922,9 @@ func TestPrintStmtForeachStmts(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Foreach{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.Foreach{
Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
Variable: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, Variable: &expr.Variable{VarName: &node.Identifier{Value: "b"}},
Stmt: &stmt.StmtList{ Stmt: &stmt.StmtList{
@ -2834,10 +2932,14 @@ func TestPrintStmtForeachStmts(t *testing.T) {
&stmt.Nop{}, &stmt.Nop{},
}, },
}, },
},
},
}) })
expected := `foreach ($a as $b) { expected := `namespace {
; foreach ($a as $b) {
;
}
}` }`
actual := o.String() actual := o.String()
@ -2850,15 +2952,21 @@ func TestPrintStmtForeachExpr(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Foreach{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.Foreach{
Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
Key: &expr.Variable{VarName: &node.Identifier{Value: "k"}}, Key: &expr.Variable{VarName: &node.Identifier{Value: "k"}},
Variable: &expr.Variable{VarName: &node.Identifier{Value: "v"}}, Variable: &expr.Variable{VarName: &node.Identifier{Value: "v"}},
Stmt: &stmt.Expression{Expr: &scalar.String{Value: "bar"}}, Stmt: &stmt.Expression{Expr: &scalar.String{Value: "bar"}},
},
},
}) })
expected := `foreach ($a as $k => $v) expected := `namespace {
'bar';` foreach ($a as $k => $v)
'bar';
}`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -2890,7 +2998,9 @@ func TestPrintStmtFunction(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Function{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.Function{
ReturnsRef: true, ReturnsRef: true,
FunctionName: &node.Identifier{Value: "foo"}, FunctionName: &node.Identifier{Value: "foo"},
Params: []node.Node{ Params: []node.Node{
@ -2904,10 +3014,14 @@ func TestPrintStmtFunction(t *testing.T) {
Stmts: []node.Node{ Stmts: []node.Node{
&stmt.Nop{}, &stmt.Nop{},
}, },
},
},
}) })
expected := `function &foo(&$var): \Foo { expected := `namespace {
; function &foo(&$var): \Foo {
;
}
}` }`
actual := o.String() actual := o.String()
@ -2995,7 +3109,9 @@ func TestPrintIfExpression(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.If{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.If{
Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
Stmt: &stmt.Expression{ Stmt: &stmt.Expression{
Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}},
@ -3021,16 +3137,20 @@ func TestPrintIfExpression(t *testing.T) {
Expr: &expr.Variable{VarName: &node.Identifier{Value: "f"}}, Expr: &expr.Variable{VarName: &node.Identifier{Value: "f"}},
}, },
}, },
},
},
}) })
expected := `if ($a) expected := `namespace {
$b; if ($a)
elseif ($c) { $b;
$d; elseif ($c) {
} $d;
elseif ($e); }
else elseif ($e);
$f;` else
$f;
}`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {
@ -3042,7 +3162,9 @@ func TestPrintIfStmtList(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.If{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.If{
Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
Stmt: &stmt.StmtList{ Stmt: &stmt.StmtList{
Stmts: []node.Node{ Stmts: []node.Node{
@ -3051,10 +3173,14 @@ func TestPrintIfStmtList(t *testing.T) {
}, },
}, },
}, },
},
},
}) })
expected := `if ($a) { expected := `namespace {
$b; if ($a) {
$b;
}
}` }`
actual := o.String() actual := o.String()
@ -3100,7 +3226,9 @@ func TestPrintInterface(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Interface{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.Interface{
InterfaceName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, InterfaceName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}},
Extends: []node.Node{ Extends: []node.Node{
&name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}},
@ -3116,14 +3244,18 @@ func TestPrintInterface(t *testing.T) {
}, },
}, },
}, },
},
},
}) })
expected := `interface Foo extends Bar, Baz expected := `namespace {
{ interface Foo extends Bar, Baz
public function foo() {
{ public function foo()
$a; {
} $a;
}
}
}` }`
actual := o.String() actual := o.String()
@ -3168,15 +3300,21 @@ func TestPrintNamespaceWithStmts(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Namespace{ p.Print(&stmt.StmtList{
Stmts: []node.Node{
&stmt.Namespace{
NamespaceName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, NamespaceName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}},
Stmts: []node.Node{ Stmts: []node.Node{
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}},
}, },
},
},
}) })
expected := `namespace Foo { expected := `{
$a; namespace Foo {
$a;
}
}` }`
actual := o.String() actual := o.String()
@ -3311,8 +3449,44 @@ func TestPrintStmtList(t *testing.T) {
}) })
expected := `{ expected := `{
$a; $a;
$b; $b;
}`
actual := o.String()
if expected != actual {
t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
}
}
func TestPrintStmtListNested(t *testing.T) {
o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ")
p.Print(&stmt.StmtList{
Stmts: []node.Node{
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}},
&stmt.StmtList{
Stmts: []node.Node{
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}},
&stmt.StmtList{
Stmts: []node.Node{
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "c"}}},
},
},
},
},
},
})
expected := `{
$a;
{
$b;
{
$c;
}
}
}` }`
actual := o.String() actual := o.String()
@ -3325,7 +3499,9 @@ func TestPrintStmtSwitch(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Switch{ p.Print(&stmt.StmtList{
Stmts: []node.Node{
&stmt.Switch{
Cond: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, Cond: &expr.Variable{VarName: &node.Identifier{Value: "var"}},
Cases: []node.Node{ Cases: []node.Node{
&stmt.Case{ &stmt.Case{
@ -3341,13 +3517,17 @@ func TestPrintStmtSwitch(t *testing.T) {
}, },
}, },
}, },
},
},
}) })
expected := `switch ($var) { expected := `{
case 'a': switch ($var) {
$a; case 'a':
case 'b': $a;
$b; case 'b':
$b;
}
}` }`
actual := o.String() actual := o.String()
@ -3456,7 +3636,9 @@ func TestPrintStmtTraitAdaptations(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.TraitUse{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.TraitUse{
Traits: []node.Node{ Traits: []node.Node{
&name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}},
&name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}},
@ -3470,10 +3652,14 @@ func TestPrintStmtTraitAdaptations(t *testing.T) {
Alias: &node.Identifier{Value: "b"}, Alias: &node.Identifier{Value: "b"},
}, },
}, },
},
},
}) })
expected := `use Foo, Bar { expected := `namespace {
Foo::a as b; use Foo, Bar {
Foo::a as b;
}
}` }`
actual := o.String() actual := o.String()
@ -3486,7 +3672,9 @@ func TestPrintTrait(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Trait{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.Trait{
TraitName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, TraitName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}},
Stmts: []node.Node{ Stmts: []node.Node{
&stmt.ClassMethod{ &stmt.ClassMethod{
@ -3498,14 +3686,18 @@ func TestPrintTrait(t *testing.T) {
}, },
}, },
}, },
},
},
}) })
expected := `trait Foo expected := `namespace {
{ trait Foo
public function foo() {
{ public function foo()
$a; {
} $a;
}
}
}` }`
actual := o.String() actual := o.String()
@ -3518,7 +3710,9 @@ func TestPrintStmtTry(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.Try{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.Try{
Stmts: []node.Node{ Stmts: []node.Node{
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}},
}, },
@ -3539,16 +3733,20 @@ func TestPrintStmtTry(t *testing.T) {
&stmt.Nop{}, &stmt.Nop{},
}, },
}, },
},
},
}) })
expected := `try { expected := `namespace {
$a; try {
} $a;
catch (Exception | \RuntimeException $e) { }
$b; catch (Exception | \RuntimeException $e) {
} $b;
finally { }
; finally {
;
}
}` }`
actual := o.String() actual := o.String()
@ -3623,17 +3821,23 @@ func TestPrintWhileStmtList(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.While{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.While{
Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
Stmt: &stmt.StmtList{ Stmt: &stmt.StmtList{
Stmts: []node.Node{ Stmts: []node.Node{
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}},
}, },
}, },
},
},
}) })
expected := `while ($a) { expected := `namespace {
$a; while ($a) {
$a;
}
}` }`
actual := o.String() actual := o.String()
@ -3646,13 +3850,19 @@ func TestPrintWhileExpression(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ") p := printer.NewPrinter(o, " ")
p.Print(&stmt.While{ p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.While{
Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
Stmt: &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, Stmt: &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}},
},
},
}) })
expected := `while ($a) expected := `namespace {
$a;` while ($a)
$a;
}`
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {