[refactoring] add Parser nodes for use

This commit is contained in:
Vadym Slizov
2020-08-09 00:56:21 +02:00
parent 45464654c6
commit fd5d891037
15 changed files with 1926 additions and 1107 deletions

View File

@@ -198,4 +198,8 @@ type NodeVisitor interface {
NameFullyQualified(n *NameFullyQualified)
NameRelative(n *NameRelative)
NameNamePart(n *NameNamePart)
ParserAs(n *ParserAs)
ParserNsSeparator(n *ParserNsSeparator)
ParserBrackets(n *ParserBrackets)
}

View File

@@ -1876,3 +1876,30 @@ type NameNamePart struct {
func (n *NameNamePart) Accept(v NodeVisitor) {
v.NameNamePart(n)
}
type ParserAs struct {
Node
Child Vertex
}
func (n *ParserAs) Accept(v NodeVisitor) {
v.ParserAs(n)
}
type ParserNsSeparator struct {
Node
Child Vertex
}
func (n *ParserNsSeparator) Accept(v NodeVisitor) {
v.ParserNsSeparator(n)
}
type ParserBrackets struct {
Node
Child Vertex
}
func (n *ParserBrackets) Accept(v NodeVisitor) {
v.ParserBrackets(n)
}

View File

@@ -2783,6 +2783,42 @@ func (t *DFS) Traverse(n ast.Vertex) {
if !t.visitor.EnterNode(nn) {
return
}
case *ast.ParserAs:
if nn == nil {
return
}
if !t.visitor.EnterNode(nn) {
return
}
if nn.Child != nil {
t.visitor.Enter("Child", true)
t.Traverse(nn.Child)
t.visitor.Leave("Child", true)
}
case *ast.ParserNsSeparator:
if nn == nil {
return
}
if !t.visitor.EnterNode(nn) {
return
}
if nn.Child != nil {
t.visitor.Enter("Child", true)
t.Traverse(nn.Child)
t.visitor.Leave("Child", true)
}
case *ast.ParserBrackets:
if nn == nil {
return
}
if !t.visitor.EnterNode(nn) {
return
}
if nn.Child != nil {
t.visitor.Enter("Child", true)
t.Traverse(nn.Child)
t.visitor.Leave("Child", true)
}
default:
panic("unexpected type of node")
}

View File

@@ -1288,3 +1288,21 @@ func (v *Dump) NameNamePart(n *ast.NameNamePart) {
v.printIndent(v.indent)
v.print(fmt.Sprintf("Value: []byte(%q),\n", n.Value))
}
func (v *Dump) ParserAs(n *ast.ParserAs) {
v.printIndentIfNotSingle(v.indent - 1)
v.print("&ast.ParserAs{\n")
v.printNode(n.GetNode())
}
func (v *Dump) ParserNsSeparator(n *ast.ParserNsSeparator) {
v.printIndentIfNotSingle(v.indent - 1)
v.print("&ast.ParserNsSeparator{\n")
v.printNode(n.GetNode())
}
func (v *Dump) ParserBrackets(n *ast.ParserBrackets) {
v.printIndentIfNotSingle(v.indent - 1)
v.print("&ast.ParserBrackets{\n")
v.printNode(n.GetNode())
}

View File

@@ -0,0 +1,42 @@
package visitor
import (
"github.com/z7zmey/php-parser/pkg/ast"
)
type FilterParserNodes struct {
Null
}
func (v *FilterParserNodes) EnterNode(n ast.Vertex) bool {
n.Accept(v)
return true
}
func (v *FilterParserNodes) StmtGroupUseList(n *ast.StmtGroupUseList) {
if nn, ok := n.Prefix.(*ast.ParserNsSeparator); ok {
n.Prefix = nn.Child
}
if nn, ok := n.UseList.(*ast.ParserNsSeparator); ok {
n.UseList = nn.Child
}
if nn, ok := n.UseList.(*ast.ParserBrackets); ok {
n.UseList = nn.Child
}
}
func (v *FilterParserNodes) StmtUseList(n *ast.StmtUseList) {
for k, v := range n.UseDeclarations {
if nn, ok := v.(*ast.ParserNsSeparator); ok {
n.UseDeclarations[k] = nn.Child
}
}
}
func (v *FilterParserNodes) StmtUseDeclaration(n *ast.StmtUseDeclaration) {
if nn, ok := n.Alias.(*ast.ParserAs); ok {
n.Alias = nn.Child
}
}

View File

@@ -713,3 +713,15 @@ func (v *Null) NameRelative(_ *ast.NameRelative) {
func (v *Null) NameNamePart(_ *ast.NameNamePart) {
// do nothing
}
func (v *Null) ParserAs(_ *ast.ParserAs) {
// do nothing
}
func (v *Null) ParserNsSeparator(_ *ast.ParserNsSeparator) {
// do nothing
}
func (v *Null) ParserBrackets(_ *ast.ParserBrackets) {
// do nothing
}