From 2703c00374a1424a99594e40b6b9dd33e4711080 Mon Sep 17 00:00:00 2001 From: z7zmey Date: Sat, 16 Dec 2017 23:02:18 +0200 Subject: [PATCH] closure_use node --- node/expr/closure_use.go | 32 ++++++++++++++++++++++++++++++++ parser/parser.go | 4 ++-- parser/parser.y | 4 ++-- 3 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 node/expr/closure_use.go diff --git a/node/expr/closure_use.go b/node/expr/closure_use.go new file mode 100644 index 0000000..6cc33e1 --- /dev/null +++ b/node/expr/closure_use.go @@ -0,0 +1,32 @@ +package expr + +import ( + "fmt" + "io" + + "github.com/z7zmey/php-parser/node" +) + +type ClusureUse struct { + node.SimpleNode + variable node.Node + byRef bool +} + +func NewClusureUse(variable node.Node, byRef bool) node.Node { + return ClusureUse{ + node.SimpleNode{Name: "ClusureUse", Attributes: make(map[string]string)}, + variable, + byRef, + } +} + +func (n ClusureUse) Print(out io.Writer, indent string) { + fmt.Fprintf(out, "\n%v%v [- -]", indent, n.Name) + fmt.Fprintf(out, "\n%vby ref: %t", indent+" ", n.byRef) + + if n.variable != nil { + fmt.Fprintf(out, "\n%vvariable:", indent+" ") + n.variable.Print(out, indent+" ") + } +} diff --git a/parser/parser.go b/parser/parser.go index a9fb19f..2ee66ad 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -4290,13 +4290,13 @@ yydefault: yyDollar = yyS[yypt-1 : yypt+1] //line parser/parser.y:914 { - yyVAL.node = node.NewSimpleNode("Variable").Attribute("value", yyDollar[1].token.String()) + yyVAL.node = expr.NewClusureUse(expr.NewVariable(yyDollar[1].token), false) } case 376: yyDollar = yyS[yypt-2 : yypt+1] //line parser/parser.y:915 { - yyVAL.node = node.NewSimpleNode("Variable").Attribute("value", yyDollar[2].token.String()).Attribute("ref", "true") + yyVAL.node = expr.NewClusureUse(expr.NewVariable(yyDollar[2].token), true) } case 377: yyDollar = yyS[yypt-2 : yypt+1] diff --git a/parser/parser.y b/parser/parser.y index ff4616a..9da69b4 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -911,8 +911,8 @@ lexical_var_list: ; lexical_var: - T_VARIABLE { $$ = node.NewSimpleNode("Variable").Attribute("value", $1.String()) } - | '&' T_VARIABLE { $$ = node.NewSimpleNode("Variable").Attribute("value", $2.String()).Attribute("ref", "true") } + T_VARIABLE { $$ = expr.NewClusureUse(expr.NewVariable($1), false) } + | '&' T_VARIABLE { $$ = expr.NewClusureUse(expr.NewVariable($2), true) } ; function_call: