create expr.Reference node

[wip] create expr.Reference node

[wip] create expr.Reference node

[wip] create expr.Reference node

fix
This commit is contained in:
z7zmey
2018-05-14 18:09:11 +03:00
parent ac74ae3225
commit ec0ef26bd6
22 changed files with 1408 additions and 1445 deletions

View File

@@ -272,6 +272,8 @@ func (p *Printer) printNode(n node.Node) {
p.printExprPrint(n)
case *expr.PropertyFetch:
p.printExprPropertyFetch(n)
case *expr.Reference:
p.printExprReference(n)
case *expr.Require:
p.printExprRequire(n)
case *expr.RequireOnce:
@@ -964,10 +966,6 @@ func (p *Printer) printExprArrayItem(n node.Node) {
io.WriteString(p.w, " => ")
}
if nn.ByRef {
io.WriteString(p.w, "&")
}
p.Print(nn.Val)
}
@@ -1008,11 +1006,6 @@ func (p *Printer) printExprClone(n node.Node) {
func (p *Printer) printExprClosureUse(n node.Node) {
nn := n.(*expr.ClosureUse)
if nn.ByRef {
io.WriteString(p.w, "&")
}
p.Print(nn.Variable)
}
@@ -1211,6 +1204,13 @@ func (p *Printer) printExprPropertyFetch(n node.Node) {
p.Print(nn.Property)
}
func (p *Printer) printExprReference(n node.Node) {
nn := n.(*expr.Reference)
io.WriteString(p.w, "&")
p.Print(nn.Variable)
}
func (p *Printer) printExprRequire(n node.Node) {
nn := n.(*expr.Require)
@@ -1382,10 +1382,6 @@ func (p *Printer) printStmtAltForeach(n node.Node) {
io.WriteString(p.w, " => ")
}
if nn.ByRef {
io.WriteString(p.w, "&")
}
p.Print(nn.Variable)
io.WriteString(p.w, ") :\n")
@@ -1769,9 +1765,6 @@ func (p *Printer) printStmtForeach(n node.Node) {
io.WriteString(p.w, " => ")
}
if nn.ByRef {
io.WriteString(p.w, "&")
}
p.Print(nn.Variable)
io.WriteString(p.w, ")")

View File

@@ -1245,9 +1245,8 @@ func TestPrintExprArrayItemWithKey(t *testing.T) {
p := printer.NewPrinter(o, " ")
p.Print(&expr.ArrayItem{
ByRef: false,
Key: &scalar.String{Value: "'Hello'"},
Val: &expr.Variable{VarName: &node.Identifier{Value: "world"}},
Key: &scalar.String{Value: "'Hello'"},
Val: &expr.Variable{VarName: &node.Identifier{Value: "world"}},
})
expected := `'Hello' => $world`
@@ -1263,8 +1262,7 @@ func TestPrintExprArrayItem(t *testing.T) {
p := printer.NewPrinter(o, " ")
p.Print(&expr.ArrayItem{
ByRef: true,
Val: &expr.Variable{VarName: &node.Identifier{Value: "world"}},
Val: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "world"}}},
})
expected := `&$world`
@@ -1282,18 +1280,15 @@ func TestPrintExprArray(t *testing.T) {
p.Print(&expr.Array{
Items: []node.Node{
&expr.ArrayItem{
ByRef: false,
Key: &scalar.String{Value: "'Hello'"},
Val: &expr.Variable{VarName: &node.Identifier{Value: "world"}},
Key: &scalar.String{Value: "'Hello'"},
Val: &expr.Variable{VarName: &node.Identifier{Value: "world"}},
},
&expr.ArrayItem{
ByRef: true,
Key: &scalar.Lnumber{Value: "2"},
Val: &expr.Variable{VarName: &node.Identifier{Value: "var"}},
Key: &scalar.Lnumber{Value: "2"},
Val: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}},
},
&expr.ArrayItem{
ByRef: false,
Val: &expr.Variable{VarName: &node.Identifier{Value: "var"}},
Val: &expr.Variable{VarName: &node.Identifier{Value: "var"}},
},
},
})
@@ -1376,8 +1371,7 @@ func TestPrintExprClosureUse(t *testing.T) {
p := printer.NewPrinter(o, " ")
p.Print(&expr.ClosureUse{
ByRef: true,
Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}},
Variable: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}},
})
expected := `&$var`
@@ -1406,11 +1400,9 @@ func TestPrintExprClosure(t *testing.T) {
},
Uses: []node.Node{
&expr.ClosureUse{
ByRef: true,
Variable: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
Variable: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "a"}}},
},
&expr.ClosureUse{
ByRef: false,
Variable: &expr.Variable{VarName: &node.Identifier{Value: "b"}},
},
},
@@ -1795,6 +1787,22 @@ func TestPrintPropertyFetch(t *testing.T) {
}
}
func TestPrintExprReference(t *testing.T) {
o := bytes.NewBufferString("")
p := printer.NewPrinter(o, " ")
p.Print(&expr.Reference{
Variable: &expr.Variable{VarName: &node.Identifier{Value: "foo"}},
})
expected := `&$foo`
actual := o.String()
if expected != actual {
t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
}
}
func TestPrintRequire(t *testing.T) {
o := bytes.NewBufferString("")
@@ -1854,9 +1862,8 @@ func TestPrintExprShortArray(t *testing.T) {
Val: &expr.Variable{VarName: &node.Identifier{Value: "world"}},
},
&expr.ArrayItem{
ByRef: true,
Key: &scalar.Lnumber{Value: "2"},
Val: &expr.Variable{VarName: &node.Identifier{Value: "var"}},
Key: &scalar.Lnumber{Value: "2"},
Val: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}},
},
&expr.ArrayItem{
Val: &expr.Variable{VarName: &node.Identifier{Value: "var"}},
@@ -2200,10 +2207,9 @@ func TestPrintAltForeach(t *testing.T) {
p.Print(&stmt.Namespace{
Stmts: []node.Node{
&stmt.AltForeach{
ByRef: true,
Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}},
Key: &expr.Variable{VarName: &node.Identifier{Value: "key"}},
Variable: &expr.Variable{VarName: &node.Identifier{Value: "val"}},
Variable: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "val"}}},
Stmt: &stmt.StmtList{
Stmts: []node.Node{
&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "d"}}},
@@ -3141,10 +3147,9 @@ func TestPrintStmtForeachNop(t *testing.T) {
p := printer.NewPrinter(o, " ")
p.Print(&stmt.Foreach{
ByRef: true,
Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}},
Key: &expr.Variable{VarName: &node.Identifier{Value: "k"}},
Variable: &expr.Variable{VarName: &node.Identifier{Value: "v"}},
Variable: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "v"}}},
Stmt: &stmt.Nop{},
})