php-parser/visitor/dumper.go

72 lines
1.8 KiB
Go
Raw Normal View History

2018-02-20 18:22:15 +00:00
// Package visitor contains walker.visitor implementations
package visitor
2018-01-12 08:04:31 +00:00
import (
"fmt"
2018-03-03 20:51:22 +00:00
"io"
2018-01-12 08:04:31 +00:00
"reflect"
2018-05-27 19:37:22 +00:00
"github.com/z7zmey/php-parser/comment"
2018-01-17 16:58:45 +00:00
"github.com/z7zmey/php-parser/node"
"github.com/z7zmey/php-parser/parser"
2018-01-12 08:04:31 +00:00
2018-01-17 16:58:45 +00:00
"github.com/z7zmey/php-parser/walker"
2018-01-12 08:04:31 +00:00
)
2018-04-07 19:43:48 +00:00
// Dumper writes ast hierarchy to an io.Writer
2018-01-12 08:16:09 +00:00
// Also prints comments and positions attached to nodes
2018-01-12 08:04:31 +00:00
type Dumper struct {
2018-03-03 20:51:22 +00:00
Writer io.Writer
2018-03-01 20:31:36 +00:00
Indent string
Comments parser.Comments
Positions parser.Positions
2018-03-01 20:31:36 +00:00
NsResolver *NamespaceResolver
2018-01-12 08:04:31 +00:00
}
2018-04-07 16:07:02 +00:00
// EnterNode is invoked at every node in hierarchy
2018-02-20 17:52:07 +00:00
func (d Dumper) EnterNode(w walker.Walkable) bool {
2018-01-17 16:58:45 +00:00
n := w.(node.Node)
2018-01-12 08:04:31 +00:00
2018-03-03 20:51:22 +00:00
fmt.Fprintf(d.Writer, "%v[%v]\n", d.Indent, reflect.TypeOf(n))
2018-03-01 20:31:36 +00:00
if d.Positions != nil {
if p := d.Positions[n]; p != nil {
2018-03-03 20:51:22 +00:00
fmt.Fprintf(d.Writer, "%v\"Position\": %s;\n", d.Indent+" ", *p)
2018-03-01 20:31:36 +00:00
}
2018-01-12 08:04:31 +00:00
}
2018-03-01 20:31:36 +00:00
if d.NsResolver != nil {
if namespacedName, ok := d.NsResolver.ResolvedNames[n]; ok {
2018-03-03 20:51:22 +00:00
fmt.Fprintf(d.Writer, "%v\"NamespacedName\": %s;\n", d.Indent+" ", namespacedName)
}
2018-01-12 08:04:31 +00:00
}
2018-03-01 20:31:36 +00:00
if d.Comments != nil {
if c := d.Comments[n]; len(c) > 0 {
2018-03-03 20:51:22 +00:00
fmt.Fprintf(d.Writer, "%v\"Comments\":\n", d.Indent+" ")
2018-03-01 20:31:36 +00:00
for _, cc := range c {
2018-05-27 19:37:22 +00:00
fmt.Fprintf(d.Writer, "%v%q before %q\n", d.Indent+" ", cc, comment.TokenNames[cc.TokenName()])
2018-03-01 20:31:36 +00:00
}
}
}
if a := n.Attributes(); len(a) > 0 {
for key, attr := range a {
2018-03-03 20:51:22 +00:00
fmt.Fprintf(d.Writer, "%v\"%v\": %v;\n", d.Indent+" ", key, attr)
2018-01-12 08:04:31 +00:00
}
}
return true
}
2018-01-12 08:16:09 +00:00
// GetChildrenVisitor is invoked at every node parameter that contains children nodes
2018-01-17 16:58:45 +00:00
func (d Dumper) GetChildrenVisitor(key string) walker.Visitor {
2018-03-03 20:51:22 +00:00
fmt.Fprintf(d.Writer, "%v%q:\n", d.Indent+" ", key)
return Dumper{d.Writer, d.Indent + " ", d.Comments, d.Positions, d.NsResolver}
2018-01-12 08:04:31 +00:00
}
2018-01-12 08:16:09 +00:00
// LeaveNode is invoked after node process
2018-02-20 17:52:07 +00:00
func (d Dumper) LeaveNode(n walker.Walkable) {
2018-01-12 08:04:31 +00:00
// do nothing
}