[refactoring] update ast structure of "For" node

This commit is contained in:
Vadym Slizov
2020-09-04 11:37:17 +03:00
parent c274c4f92f
commit 0e73cd8852
21 changed files with 1041 additions and 1156 deletions

View File

@@ -27,7 +27,6 @@ type NodeVisitor interface {
ArgumentList(n *ArgumentList)
Argument(n *Argument)
StmtAltFor(n *StmtAltFor)
StmtAltForeach(n *StmtAltForeach)
StmtAltSwitch(n *StmtAltSwitch)
StmtBreak(n *StmtBreak)

View File

@@ -175,19 +175,6 @@ func (n *ScalarString) Accept(v NodeVisitor) {
v.ScalarString(n)
}
// StmtAltFor node
type StmtAltFor struct {
Node
Init []Vertex
Cond []Vertex
Loop []Vertex
Stmt Vertex
}
func (n *StmtAltFor) Accept(v NodeVisitor) {
v.StmtAltFor(n)
}
// StmtAltForeach node
type StmtAltForeach struct {
Node
@@ -453,10 +440,19 @@ func (n *StmtFinally) Accept(v NodeVisitor) {
// StmtFor node
type StmtFor struct {
Node
Init []Vertex
Cond []Vertex
Loop []Vertex
Stmt Vertex
Alt bool
ForTkn *token.Token
OpenParenthesisTkn *token.Token
Init []Vertex
InitSemiColonTkn *token.Token
Cond []Vertex
CondSemiColonTkn *token.Token
Loop []Vertex
CloseParenthesisTkn *token.Token
ColonTkn *token.Token
Stmt Vertex
EndForTkn *token.Token
SemiColonTkn *token.Token
}
func (n *StmtFor) Accept(v NodeVisitor) {

View File

@@ -119,39 +119,6 @@ func (t *DFS) Traverse(n ast.Vertex) {
t.Traverse(nn.Expr)
t.visitor.Leave("Expr", true)
}
case *ast.StmtAltFor:
if nn == nil {
return
}
if !t.visitor.EnterNode(nn) {
return
}
if nn.Init != nil {
t.visitor.Enter("Init", false)
for _, c := range nn.Init {
t.Traverse(c)
}
t.visitor.Leave("Init", false)
}
if nn.Cond != nil {
t.visitor.Enter("Cond", false)
for _, c := range nn.Cond {
t.Traverse(c)
}
t.visitor.Leave("Cond", false)
}
if nn.Loop != nil {
t.visitor.Enter("Loop", false)
for _, c := range nn.Loop {
t.Traverse(c)
}
t.visitor.Leave("Loop", false)
}
if nn.Stmt != nil {
t.visitor.Enter("Stmt", true)
t.Traverse(nn.Stmt)
t.visitor.Leave("Stmt", true)
}
case *ast.StmtAltForeach:
if nn == nil {
return

View File

@@ -252,12 +252,6 @@ func (v *Dump) Argument(n *ast.Argument) {
}
}
func (v *Dump) StmtAltFor(n *ast.StmtAltFor) {
v.printIndentIfNotSingle(v.indent - 1)
v.print("&ast.StmtAltFor{\n")
v.printNode(n.GetNode())
}
func (v *Dump) StmtAltForeach(n *ast.StmtAltForeach) {
v.printIndentIfNotSingle(v.indent - 1)
v.print("&ast.StmtAltForeach{\n")
@@ -414,6 +408,11 @@ func (v *Dump) StmtFor(n *ast.StmtFor) {
v.printIndentIfNotSingle(v.indent - 1)
v.print("&ast.StmtFor{\n")
v.printNode(n.GetNode())
if n.Alt {
v.printIndent(v.indent)
v.print("Alt: true,\n")
}
}
func (v *Dump) StmtForeach(n *ast.StmtForeach) {

View File

@@ -209,44 +209,6 @@ func (v *FilterParserNodes) ExprVariable(n *ast.ExprVariable) {
}
}
func (v *FilterParserNodes) StmtFor(n *ast.StmtFor) {
for k, v := range n.Init {
for {
if nn, ok := v.(*ast.ParserBrackets); ok {
v = nn.Child
} else {
break
}
}
n.Init[k] = v
}
for k, v := range n.Cond {
for {
if nn, ok := v.(*ast.ParserBrackets); ok {
v = nn.Child
} else {
break
}
}
n.Cond[k] = v
}
for k, v := range n.Loop {
for {
if nn, ok := v.(*ast.ParserBrackets); ok {
v = nn.Child
} else {
break
}
}
n.Loop[k] = v
}
}
func (v *FilterParserNodes) ExprAssign(n *ast.ExprAssign) {
for {
if nn, ok := n.Expr.(*ast.ParserBrackets); ok {

View File

@@ -130,3 +130,14 @@ func (v *FilterTokens) StmtDo(n *ast.StmtDo) {
n.CloseParenthesisTkn = nil
n.SemiColonTkn = nil
}
func (v *FilterTokens) StmtFor(n *ast.StmtFor) {
n.ForTkn = nil
n.OpenParenthesisTkn = nil
n.InitSemiColonTkn = nil
n.CondSemiColonTkn = nil
n.CloseParenthesisTkn = nil
n.ColonTkn = nil
n.EndForTkn = nil
n.SemiColonTkn = nil
}

View File

@@ -54,10 +54,6 @@ func (v *Null) Argument(_ *ast.Argument) {
// do nothing
}
func (v *Null) StmtAltFor(_ *ast.StmtAltFor) {
// do nothing
}
func (v *Null) StmtAltForeach(_ *ast.StmtAltForeach) {
// do nothing
}

View File

@@ -297,8 +297,6 @@ func (p *PrettyPrinter) printNode(n ast.Vertex) {
// stmt
case *ast.StmtAltFor:
p.printStmtAltFor(n)
case *ast.StmtAltForeach:
p.printStmtAltForeach(n)
case *ast.StmtAltSwitch:
@@ -1363,25 +1361,6 @@ func (p *PrettyPrinter) printStmtAltElse(n ast.Vertex) {
}
}
func (p *PrettyPrinter) printStmtAltFor(n ast.Vertex) {
nn := n.(*ast.StmtAltFor)
io.WriteString(p.w, "for (")
p.joinPrint(", ", nn.Init)
io.WriteString(p.w, "; ")
p.joinPrint(", ", nn.Cond)
io.WriteString(p.w, "; ")
p.joinPrint(", ", nn.Loop)
io.WriteString(p.w, ") :\n")
s := nn.Stmt.(*ast.StmtStmtList)
p.printNodes(s.Stmts)
io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "endfor;")
}
func (p *PrettyPrinter) printStmtAltForeach(n ast.Vertex) {
nn := n.(*ast.StmtAltForeach)
@@ -1736,6 +1715,11 @@ func (p *PrettyPrinter) printStmtFinally(n ast.Vertex) {
func (p *PrettyPrinter) printStmtFor(n ast.Vertex) {
nn := n.(*ast.StmtFor)
if nn.Alt {
p.printStmtAltFor(nn)
return
}
io.WriteString(p.w, "for (")
p.joinPrint(", ", nn.Init)
io.WriteString(p.w, "; ")
@@ -1760,6 +1744,25 @@ func (p *PrettyPrinter) printStmtFor(n ast.Vertex) {
}
}
func (p *PrettyPrinter) printStmtAltFor(n ast.Vertex) {
nn := n.(*ast.StmtFor)
io.WriteString(p.w, "for (")
p.joinPrint(", ", nn.Init)
io.WriteString(p.w, "; ")
p.joinPrint(", ", nn.Cond)
io.WriteString(p.w, "; ")
p.joinPrint(", ", nn.Loop)
io.WriteString(p.w, ") :\n")
s := nn.Stmt.(*ast.StmtStmtList)
p.printNodes(s.Stmts)
io.WriteString(p.w, "\n")
p.printIndent()
io.WriteString(p.w, "endfor;")
}
func (p *PrettyPrinter) printStmtForeach(n ast.Vertex) {
nn := n.(*ast.StmtForeach)

View File

@@ -2172,7 +2172,8 @@ func TestPrintAltFor(t *testing.T) {
p := printer.NewPrettyPrinter(o, " ")
p.Print(&ast.StmtNamespace{
Stmts: []ast.Vertex{
&ast.StmtAltFor{
&ast.StmtFor{
Alt: true,
Init: []ast.Vertex{
&ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}},
},

View File

@@ -359,8 +359,6 @@ func (p *Printer) printNode(n ast.Vertex) {
// stmt
case *ast.StmtAltFor:
p.printStmtAltFor(n)
case *ast.StmtAltForeach:
p.printStmtAltForeach(n)
case *ast.StmtAltSwitch:
@@ -1973,39 +1971,6 @@ func (p *Printer) printExprYield(n ast.Vertex) {
// smtm
func (p *Printer) printStmtAltFor(n ast.Vertex) {
nn := n.(*ast.StmtAltFor)
p.printFreeFloating(nn, token.Start)
io.WriteString(p.w, "for")
p.printFreeFloating(nn, token.For)
io.WriteString(p.w, "(")
p.joinPrint(",", nn.Init)
p.printFreeFloating(nn, token.InitExpr)
io.WriteString(p.w, ";")
p.joinPrint(",", nn.Cond)
p.printFreeFloating(nn, token.CondExpr)
io.WriteString(p.w, ";")
p.joinPrint(",", nn.Loop)
p.printFreeFloating(nn, token.IncExpr)
io.WriteString(p.w, ")")
p.printFreeFloating(nn, token.Cond)
io.WriteString(p.w, ":")
s := nn.Stmt.(*ast.StmtStmtList)
p.printNodes(s.Stmts)
p.printFreeFloating(nn, token.Stmts)
io.WriteString(p.w, "endfor")
p.printFreeFloating(nn, token.AltEnd)
p.printFreeFloating(nn, token.SemiColon)
if nn.GetNode().Tokens.IsEmpty() {
io.WriteString(p.w, ";")
}
p.printFreeFloating(nn, token.End)
}
func (p *Printer) printStmtAltForeach(n ast.Vertex) {
nn := n.(*ast.StmtAltForeach)
p.printFreeFloating(nn, token.Start)
@@ -2477,26 +2442,43 @@ func (p *Printer) printStmtFinally(n ast.Vertex) {
p.printFreeFloating(nn, token.End)
}
func (p *Printer) printStmtFor(n ast.Vertex) {
nn := n.(*ast.StmtFor)
p.printFreeFloating(nn, token.Start)
func (p *Printer) printStmtFor(n *ast.StmtFor) {
if n.Alt {
p.printStmtAltFor(n)
return
}
io.WriteString(p.w, "for")
p.printFreeFloating(nn, token.For)
io.WriteString(p.w, "(")
p.joinPrint(",", nn.Init)
p.printFreeFloating(nn, token.InitExpr)
io.WriteString(p.w, ";")
p.joinPrint(",", nn.Cond)
p.printFreeFloating(nn, token.CondExpr)
io.WriteString(p.w, ";")
p.joinPrint(",", nn.Loop)
p.printFreeFloating(nn, token.IncExpr)
io.WriteString(p.w, ")")
p.printToken(n.ForTkn, "for")
p.printToken(n.OpenParenthesisTkn, "(")
p.joinPrint(",", n.Init)
p.printToken(n.InitSemiColonTkn, ";")
p.joinPrint(",", n.Cond)
p.printToken(n.CondSemiColonTkn, ";")
p.joinPrint(",", n.Loop)
p.printToken(n.CloseParenthesisTkn, ")")
p.Print(nn.Stmt)
p.Print(n.Stmt)
}
p.printFreeFloating(nn, token.End)
func (p *Printer) printStmtAltFor(n *ast.StmtFor) {
p.printToken(n.ForTkn, "for")
p.printToken(n.OpenParenthesisTkn, "(")
p.joinPrint(",", n.Init)
p.printToken(n.InitSemiColonTkn, ";")
p.joinPrint(",", n.Cond)
p.printToken(n.CondSemiColonTkn, ";")
p.joinPrint(",", n.Loop)
p.printToken(n.CloseParenthesisTkn, ")")
p.printToken(n.ColonTkn, ":")
if stmtList, ok := n.Stmt.(*ast.StmtStmtList); ok {
p.printNodes(stmtList.Stmts)
} else {
p.printNode(n.Stmt)
}
p.printToken(n.EndForTkn, "endfor")
p.printToken(n.SemiColonTkn, ";")
}
func (p *Printer) printStmtForeach(n ast.Vertex) {

View File

@@ -762,7 +762,8 @@ func TestParseAndPrintPhp5AltIf(t *testing.T) {
}
func TestParseAndPrintPhp5AltFor(t *testing.T) {
src := `<?php
// TODO: remove ; after <?php
src := `<?php ;
for ( $a ; $b ; $c ) :
endfor ;
@@ -988,7 +989,8 @@ func TestParseAndPrintPhp5IfExpression(t *testing.T) {
}
func TestParseAndPrintPhp5For(t *testing.T) {
src := `<?php
// TODO: remove ; after <?php
src := `<?php ;
for ( $i = 0 ; $i < 3 ; $i ++ )
echo $i . PHP_EOL;

View File

@@ -875,7 +875,8 @@ func TestParseAndPrintAltIf(t *testing.T) {
}
func TestParseAndPrintAltFor(t *testing.T) {
src := `<?php
// TODO: remove ; after <?php
src := `<?php ;
for ( $a ; $b ; $c ) :
endfor ;
@@ -1106,7 +1107,8 @@ func TestParseAndPrintIfExpression(t *testing.T) {
}
func TestParseAndPrintFor(t *testing.T) {
src := `<?php
// TODO: remove ; after <?php
src := `<?php ;
for ( $i = 0 ; $i < 3 ; $i ++ )
echo $i . PHP_EOL;

View File

@@ -2651,7 +2651,8 @@ func TestPrinterPrintAltFor(t *testing.T) {
o := bytes.NewBufferString("")
p := printer.NewPrinter(o)
p.Print(&ast.StmtAltFor{
p.Print(&ast.StmtFor{
Alt: true,
Init: []ast.Vertex{
&ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$a")},