pretty printer: print Declare, Nop

This commit is contained in:
z7zmey 2018-03-28 23:44:02 +03:00
parent 3c80c876d4
commit 09fada08da
2 changed files with 112 additions and 0 deletions

View File

@ -19,6 +19,21 @@ func Print(o io.Writer, n node.Node) {
fn(o, n) fn(o, n)
} }
func printStmt(o io.Writer, n node.Node) {
switch nn := n.(type) {
case *stmt.Nop:
Print(o, nn)
break
case *stmt.StmtList:
io.WriteString(o, " {\n")
printNodes(o, nn.Stmts)
io.WriteString(o, "}\n")
default:
io.WriteString(o, "\n")
Print(o, nn)
}
}
func joinPrint(glue string, o io.Writer, nn []node.Node) { func joinPrint(glue string, o io.Writer, nn []node.Node) {
for k, n := range nn { for k, n := range nn {
if k > 0 { if k > 0 {
@ -300,11 +315,15 @@ func getPrintFuncByNode(n node.Node) func(o io.Writer, n node.Node) {
return printStmtConstant return printStmtConstant
case *stmt.Continue: case *stmt.Continue:
return printStmtContinue return printStmtContinue
case *stmt.Declare:
return printStmtDeclare
case *stmt.StmtList: case *stmt.StmtList:
return printStmtStmtList return printStmtStmtList
case *stmt.Expression: case *stmt.Expression:
return printStmtExpression return printStmtExpression
case *stmt.Nop:
return printStmtNop
} }
panic("printer is missing for the node") panic("printer is missing for the node")
@ -1430,6 +1449,15 @@ func printStmtContinue(o io.Writer, n node.Node) {
io.WriteString(o, ";\n") io.WriteString(o, ";\n")
} }
func printStmtDeclare(o io.Writer, n node.Node) {
nn := n.(*stmt.Declare)
io.WriteString(o, "declare(")
joinPrint(", ", o, nn.Consts)
io.WriteString(o, ")")
printStmt(o, nn.Stmt)
}
func printStmtStmtList(o io.Writer, n node.Node) { func printStmtStmtList(o io.Writer, n node.Node) {
nn := n.(*stmt.StmtList) nn := n.(*stmt.StmtList)
@ -1443,3 +1471,7 @@ func printStmtExpression(o io.Writer, n node.Node) {
io.WriteString(o, ";\n") io.WriteString(o, ";\n")
} }
func printStmtNop(o io.Writer, n node.Node) {
io.WriteString(o, ";\n")
}

View File

@ -2259,6 +2259,73 @@ func TestPrintStmtContinue(t *testing.T) {
} }
} }
func TestPrintStmtDeclareStmts(t *testing.T) {
o := bytes.NewBufferString("")
printer.Print(o, &stmt.Declare{
Consts: []node.Node{
&stmt.Constant{
ConstantName: &node.Identifier{Value: "FOO"},
Expr: &scalar.String{Value: "bar"},
},
},
Stmt: &stmt.StmtList{
Stmts: []node.Node{
&stmt.Nop{},
},
},
})
expected := "declare(FOO = 'bar') {\n;\n}\n"
actual := o.String()
if expected != actual {
t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
}
}
func TestPrintStmtDeclareExpr(t *testing.T) {
o := bytes.NewBufferString("")
printer.Print(o, &stmt.Declare{
Consts: []node.Node{
&stmt.Constant{
ConstantName: &node.Identifier{Value: "FOO"},
Expr: &scalar.String{Value: "bar"},
},
},
Stmt: &stmt.Expression{Expr: &scalar.String{Value: "bar"}},
})
expected := "declare(FOO = 'bar')\n'bar';\n"
actual := o.String()
if expected != actual {
t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
}
}
func TestPrintStmtDeclareNop(t *testing.T) {
o := bytes.NewBufferString("")
printer.Print(o, &stmt.Declare{
Consts: []node.Node{
&stmt.Constant{
ConstantName: &node.Identifier{Value: "FOO"},
Expr: &scalar.String{Value: "bar"},
},
},
Stmt: &stmt.Nop{},
})
expected := "declare(FOO = 'bar');\n"
actual := o.String()
if expected != actual {
t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
}
}
func TestPrintStmtList(t *testing.T) { func TestPrintStmtList(t *testing.T) {
o := bytes.NewBufferString("") o := bytes.NewBufferString("")
@ -2289,3 +2356,16 @@ func TestPrintExpression(t *testing.T) {
t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual) t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
} }
} }
func TestPrintNop(t *testing.T) {
o := bytes.NewBufferString("")
printer.Print(o, &stmt.Nop{})
expected := ";\n"
actual := o.String()
if expected != actual {
t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
}
}