pretty printer: print Heredoc

This commit is contained in:
z7zmey 2018-04-06 00:39:04 +03:00
parent 9a799fc3be
commit 79277ea3cc
2 changed files with 61 additions and 0 deletions

View File

@ -2,6 +2,7 @@ package printer
import (
"io"
"strings"
"github.com/z7zmey/php-parser/node/stmt"
@ -99,6 +100,8 @@ func (p *Printer) printNode(n node.Node) {
p.printScalarEncapsedStringPart(n)
case *scalar.Encapsed:
p.printScalarEncapsed(n)
case *scalar.Heredoc:
p.printScalarHeredoc(n)
case *scalar.MagicConstant:
p.printScalarMagicConstant(n)
@ -530,6 +533,20 @@ func (p *Printer) printScalarEncapsed(n node.Node) {
io.WriteString(p.w, "\"")
}
func (p *Printer) printScalarHeredoc(n node.Node) {
nn := n.(*scalar.Heredoc)
io.WriteString(p.w, "<<<")
io.WriteString(p.w, nn.Label)
io.WriteString(p.w, "\n")
for _, nn := range nn.Parts {
p.Print(nn)
}
io.WriteString(p.w, strings.Trim(nn.Label, "\"'"))
}
func (p *Printer) printScalarMagicConstant(n node.Node) {
v := n.(*scalar.MagicConstant).Value
io.WriteString(p.w, v)

View File

@ -258,6 +258,50 @@ func TestPrintScalarEncapsed(t *testing.T) {
}
}
func TestPrintScalarHeredoc(t *testing.T) {
o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ")
p.Print(&scalar.Heredoc{
Label: "LBL",
Parts: []node.Node{
&scalar.EncapsedStringPart{Value: "hello "},
&expr.Variable{VarName: &node.Identifier{Value: "var"}},
&scalar.EncapsedStringPart{Value: " world\n"},
},
})
expected := `<<<LBL
hello $var world
LBL`
actual := o.String()
if expected != actual {
t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
}
}
func TestPrintScalarNowdoc(t *testing.T) {
o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ")
p.Print(&scalar.Heredoc{
Label: "'LBL'",
Parts: []node.Node{
&scalar.EncapsedStringPart{Value: "hello world\n"},
},
})
expected := `<<<'LBL'
hello world
LBL`
actual := o.String()
if expected != actual {
t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
}
}
func TestPrintScalarMagicConstant(t *testing.T) {
o := bytes.NewBufferString("")