[refactoring] add Parser nodes for use
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
42
pkg/ast/visitor/filter_parser_nodes.go
Normal file
42
pkg/ast/visitor/filter_parser_nodes.go
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -19,10 +19,9 @@ type Printer struct {
|
||||
w io.Writer
|
||||
s printerState
|
||||
bufStart string
|
||||
bufEnd string
|
||||
}
|
||||
|
||||
// NewPrinter - Constructor for Printer
|
||||
// NewPrinter - Constructor for Printer
|
||||
func NewPrinter(w io.Writer) *Printer {
|
||||
return &Printer{
|
||||
w: w,
|
||||
@@ -449,6 +448,12 @@ func (p *Printer) printNode(n ast.Vertex) {
|
||||
p.printStmtUseType(n)
|
||||
case *ast.StmtWhile:
|
||||
p.printStmtWhile(n)
|
||||
case *ast.ParserAs:
|
||||
p.printParserAs(n)
|
||||
case *ast.ParserNsSeparator:
|
||||
p.printParserNsSeparator(n)
|
||||
case *ast.ParserBrackets:
|
||||
p.printParserBrackets(n)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -556,8 +561,7 @@ func (p *Printer) printNameName(n ast.Vertex) {
|
||||
|
||||
p.joinPrint("\\", nn.Parts)
|
||||
|
||||
p.printFreeFloatingOrDefault(nn, token.End, p.bufEnd)
|
||||
p.bufEnd = ""
|
||||
p.printFreeFloating(nn, token.End)
|
||||
}
|
||||
|
||||
func (p *Printer) printNameFullyQualified(n ast.Vertex) {
|
||||
@@ -568,8 +572,7 @@ func (p *Printer) printNameFullyQualified(n ast.Vertex) {
|
||||
io.WriteString(p.w, "\\")
|
||||
p.joinPrint("\\", nn.Parts)
|
||||
|
||||
p.printFreeFloatingOrDefault(nn, token.End, p.bufEnd)
|
||||
p.bufEnd = ""
|
||||
p.printFreeFloating(nn, token.End)
|
||||
}
|
||||
|
||||
func (p *Printer) printNameRelative(n ast.Vertex) {
|
||||
@@ -585,8 +588,7 @@ func (p *Printer) printNameRelative(n ast.Vertex) {
|
||||
p.Print(part)
|
||||
}
|
||||
|
||||
p.printFreeFloatingOrDefault(nn, token.End, p.bufEnd)
|
||||
p.bufEnd = ""
|
||||
p.printFreeFloating(nn, token.End)
|
||||
}
|
||||
|
||||
// scalar
|
||||
@@ -3203,43 +3205,38 @@ func (p *Printer) printStmtGroupUseList(n ast.Vertex) {
|
||||
|
||||
p.Print(nn.Prefix)
|
||||
|
||||
p.bufStart = "\\{"
|
||||
p.bufEnd = "}"
|
||||
if _, ok := nn.UseList.(*ast.ParserNsSeparator); !ok {
|
||||
io.WriteString(p.w, "\\{")
|
||||
}
|
||||
|
||||
p.Print(nn.UseList)
|
||||
|
||||
if _, ok := nn.UseList.(*ast.ParserNsSeparator); !ok {
|
||||
io.WriteString(p.w, "}")
|
||||
}
|
||||
|
||||
p.printFreeFloating(nn, token.End)
|
||||
}
|
||||
|
||||
func (p *Printer) printStmtUseList(n ast.Vertex) {
|
||||
nn := n.(*ast.StmtUseList)
|
||||
|
||||
bufEnd := p.bufEnd
|
||||
p.bufEnd = ""
|
||||
|
||||
if p.bufStart == "\\{" {
|
||||
p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart)
|
||||
p.bufStart = ""
|
||||
} else {
|
||||
p.printFreeFloating(nn, token.Start)
|
||||
}
|
||||
p.printFreeFloating(nn, token.Start)
|
||||
|
||||
p.joinPrint(",", nn.UseDeclarations)
|
||||
|
||||
p.printFreeFloatingOrDefault(nn, token.End, bufEnd)
|
||||
p.printFreeFloating(nn, token.End)
|
||||
}
|
||||
|
||||
func (p *Printer) printStmtUseDeclaration(n ast.Vertex) {
|
||||
nn := n.(*ast.StmtUseDeclaration)
|
||||
p.printFreeFloating(nn, token.Start)
|
||||
|
||||
if nn.Alias != nil {
|
||||
p.bufEnd = " "
|
||||
}
|
||||
|
||||
p.Print(nn.Use)
|
||||
|
||||
if nn.Alias != nil {
|
||||
io.WriteString(p.w, "as")
|
||||
if _, ok := nn.Alias.(*ast.ParserAs); !ok {
|
||||
io.WriteString(p.w, " as")
|
||||
}
|
||||
|
||||
p.bufStart = " "
|
||||
p.Print(nn.Alias)
|
||||
@@ -3275,3 +3272,32 @@ func (p *Printer) printStmtWhile(n ast.Vertex) {
|
||||
|
||||
p.printFreeFloating(nn, token.End)
|
||||
}
|
||||
|
||||
func (p *Printer) printParserAs(n ast.Vertex) {
|
||||
nn := n.(*ast.ParserAs)
|
||||
p.printFreeFloating(nn, token.Start)
|
||||
|
||||
io.WriteString(p.w, "as")
|
||||
p.Print(nn.Child)
|
||||
|
||||
p.printFreeFloating(nn, token.End)
|
||||
}
|
||||
|
||||
func (p *Printer) printParserNsSeparator(n ast.Vertex) {
|
||||
nn := n.(*ast.ParserNsSeparator)
|
||||
p.printFreeFloating(nn, token.Start)
|
||||
|
||||
io.WriteString(p.w, "\\")
|
||||
p.Print(nn.Child)
|
||||
|
||||
p.printFreeFloating(nn, token.End)
|
||||
}
|
||||
|
||||
func (p *Printer) printParserBrackets(n ast.Vertex) {
|
||||
nn := n.(*ast.ParserBrackets)
|
||||
p.printFreeFloating(nn, token.Start)
|
||||
|
||||
p.Print(nn.Child)
|
||||
|
||||
p.printFreeFloating(nn, token.End)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user