From f06a8ebb51f6ef99423c586e24051494f34f1b0e Mon Sep 17 00:00:00 2001 From: z7zmey Date: Thu, 28 Mar 2019 19:49:57 +0200 Subject: [PATCH] #86 fix json dumper --- visitor/json_dumper.go | 16 ++++++++++++++-- visitor/json_dumper_test.go | 5 +++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/visitor/json_dumper.go b/visitor/json_dumper.go index 642e4a0..0f0b91c 100644 --- a/visitor/json_dumper.go +++ b/visitor/json_dumper.go @@ -13,8 +13,10 @@ import ( ) type JsonDumper struct { - Writer io.Writer - NsResolver *NamespaceResolver + Writer io.Writer + NsResolver *NamespaceResolver + isChildNode bool + isNotFirstNode bool } // EnterNode is invoked at every node in hierarchy @@ -23,6 +25,14 @@ func (d *JsonDumper) EnterNode(w walker.Walkable) bool { nodeType := reflect.TypeOf(n).String() + if d.isChildNode { + d.isChildNode = false + } else if d.isNotFirstNode { + fmt.Fprint(d.Writer, ",") + } else { + d.isNotFirstNode = true + } + fmt.Fprintf(d.Writer, "{%q:%q", "type", nodeType) if p := n.GetPosition(); p != nil { @@ -114,6 +124,7 @@ func (d *JsonDumper) LeaveNode(n walker.Walkable) { func (d *JsonDumper) EnterChildNode(key string, w walker.Walkable) { fmt.Fprintf(d.Writer, ",%q:", key) + d.isChildNode = true } func (d *JsonDumper) LeaveChildNode(key string, w walker.Walkable) { @@ -122,6 +133,7 @@ func (d *JsonDumper) LeaveChildNode(key string, w walker.Walkable) { func (d *JsonDumper) EnterChildList(key string, w walker.Walkable) { fmt.Fprintf(d.Writer, ",%q:[", key) + d.isNotFirstNode = false } diff --git a/visitor/json_dumper_test.go b/visitor/json_dumper_test.go index f1e5d97..84ab203 100644 --- a/visitor/json_dumper_test.go +++ b/visitor/json_dumper_test.go @@ -16,7 +16,8 @@ func ExampleJsonDumper() { { // some comment // second comment - $var; + $var1; + $var2; } } }` @@ -36,5 +37,5 @@ func ExampleJsonDumper() { nodes.Walk(dumper) // Output: - // {"type":"*node.Root","position":{"startPos":9,"endPos":166,"startLine":3,"endLine":12},"Stmts":[{"type":"*stmt.Namespace","position":{"startPos":9,"endPos":166,"startLine":3,"endLine":12},"freefloating":{"Start": [{"type":"freefloating.TokenType","value":"