php-parser/visitor/dumper.go

84 lines
2.1 KiB
Go
Raw Normal View History

2018-02-20 20:22:15 +02:00
// Package visitor contains walker.visitor implementations
package visitor
2018-01-12 10:04:31 +02:00
import (
"fmt"
2018-03-03 22:51:22 +02:00
"io"
2018-01-12 10:04:31 +02:00
"reflect"
2018-06-18 23:29:52 +03:00
"strings"
2018-01-12 10:04:31 +02:00
"github.com/z7zmey/php-parser/meta"
2018-01-17 18:58:45 +02:00
"github.com/z7zmey/php-parser/node"
2018-01-12 10:04:31 +02:00
2018-01-17 18:58:45 +02:00
"github.com/z7zmey/php-parser/walker"
2018-01-12 10:04:31 +02:00
)
2018-04-07 21:43:48 +02:00
// Dumper writes ast hierarchy to an io.Writer
2018-01-12 10:16:09 +02:00
// Also prints comments and positions attached to nodes
2018-01-12 10:04:31 +02:00
type Dumper struct {
2018-03-03 22:51:22 +02:00
Writer io.Writer
2018-03-01 22:31:36 +02:00
Indent string
NsResolver *NamespaceResolver
2018-01-12 10:04:31 +02:00
}
2018-04-07 18:07:02 +02:00
// EnterNode is invoked at every node in hierarchy
2018-06-18 23:29:52 +03:00
func (d *Dumper) EnterNode(w walker.Walkable) bool {
2018-01-17 18:58:45 +02:00
n := w.(node.Node)
2018-01-12 10:04:31 +02:00
2018-03-03 22:51:22 +02:00
fmt.Fprintf(d.Writer, "%v[%v]\n", d.Indent, reflect.TypeOf(n))
2018-03-01 22:31:36 +02:00
2018-06-24 10:19:44 +03:00
if n.GetPosition() != nil {
fmt.Fprintf(d.Writer, "%v\"Position\": %s\n", d.Indent+" ", n.GetPosition())
2018-01-12 10:04:31 +02:00
}
2018-03-01 22:31:36 +02:00
if d.NsResolver != nil {
if namespacedName, ok := d.NsResolver.ResolvedNames[n]; ok {
2018-06-19 23:55:12 +03:00
fmt.Fprintf(d.Writer, "%v\"NamespacedName\": %q\n", d.Indent+" ", namespacedName)
}
2018-01-12 10:04:31 +02:00
}
if mm := n.GetMeta(); len(mm) > 0 {
fmt.Fprintf(d.Writer, "%v\"Meta\":\n", d.Indent+" ")
for _, m := range mm {
fmt.Fprintf(d.Writer, "%v%q before %q\n", d.Indent+" ", m, meta.TokenNames[m.GetTokenName()])
2018-03-01 22:31:36 +02:00
}
}
if a := n.Attributes(); len(a) > 0 {
for key, attr := range a {
2018-06-19 23:55:12 +03:00
switch attr.(type) {
case string:
fmt.Fprintf(d.Writer, "%v\"%v\": %q\n", d.Indent+" ", key, attr)
default:
fmt.Fprintf(d.Writer, "%v\"%v\": %v\n", d.Indent+" ", key, attr)
}
2018-01-12 10:04:31 +02:00
}
}
return true
}
2018-06-18 23:29:52 +03:00
// LeaveNode is invoked after node process
func (d *Dumper) LeaveNode(n walker.Walkable) {
// do nothing
}
2018-01-12 10:16:09 +02:00
// GetChildrenVisitor is invoked at every node parameter that contains children nodes
2018-06-18 23:29:52 +03:00
func (d *Dumper) EnterChildNode(key string, w walker.Walkable) {
2018-03-03 22:51:22 +02:00
fmt.Fprintf(d.Writer, "%v%q:\n", d.Indent+" ", key)
2018-06-18 23:29:52 +03:00
d.Indent = d.Indent + " "
2018-01-12 10:04:31 +02:00
}
2018-06-18 23:29:52 +03:00
func (d *Dumper) LeaveChildNode(key string, w walker.Walkable) {
d.Indent = strings.TrimSuffix(d.Indent, " ")
}
func (d *Dumper) EnterChildList(key string, w walker.Walkable) {
fmt.Fprintf(d.Writer, "%v%q:\n", d.Indent+" ", key)
d.Indent = d.Indent + " "
}
func (d *Dumper) LeaveChildList(key string, w walker.Walkable) {
d.Indent = strings.TrimSuffix(d.Indent, " ")
2018-01-12 10:04:31 +02:00
}