From d33afa9b38cb0034a17603f02dd36816e5e12fed Mon Sep 17 00:00:00 2001 From: vadim Date: Sat, 9 Dec 2017 12:11:56 +0200 Subject: [PATCH] trait node --- node/stmt/throw.go | 32 ++++++++++++++++++++++++++++++++ node/stmt/trait.go | 35 +++++++++++++++++++++++++++++++++++ parser/parser.go | 4 ++-- parser/parser.y | 4 ++-- 4 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 node/stmt/throw.go create mode 100644 node/stmt/trait.go diff --git a/node/stmt/throw.go b/node/stmt/throw.go new file mode 100644 index 0000000..f5fb452 --- /dev/null +++ b/node/stmt/throw.go @@ -0,0 +1,32 @@ +package stmt + +import ( + "fmt" + "io" + + "github.com/z7zmey/php-parser/node" + "github.com/z7zmey/php-parser/token" +) + +type Throw struct { + node.SimpleNode + token token.Token + expr node.Node +} + +func NewThrow(token token.Token, expr node.Node) node.Node { + return Throw{ + node.SimpleNode{Name: "Throw", Attributes: make(map[string]string)}, + token, + expr, + } +} + +func (n Throw) Print(out io.Writer, indent string) { + fmt.Fprintf(out, "\n%v%v [%d %d] %q", indent, n.Name, n.token.StartLine, n.token.EndLine, n.token.Value) + + if n.expr != nil { + fmt.Fprintf(out, "\n%vexpr:", indent+" ") + n.expr.Print(out, indent+" ") + } +} diff --git a/node/stmt/trait.go b/node/stmt/trait.go new file mode 100644 index 0000000..d5f71d8 --- /dev/null +++ b/node/stmt/trait.go @@ -0,0 +1,35 @@ +package stmt + +import ( + "fmt" + "io" + + "github.com/z7zmey/php-parser/node" + "github.com/z7zmey/php-parser/token" +) + +type Trait struct { + node.SimpleNode + token token.Token + stmts []node.Node +} + +//TODO: stmts myst be []node.Node +func NewTrait(token token.Token, stmts []node.Node) node.Node { + return Trait{ + node.SimpleNode{Name: "Trait", Attributes: make(map[string]string)}, + token, + stmts, + } +} + +func (n Trait) Print(out io.Writer, indent string) { + fmt.Fprintf(out, "\n%v%v [%d %d] %q", indent, n.Name, n.token.StartLine, n.token.EndLine, n.token.Value) + + if n.stmts != nil { + fmt.Fprintf(out, "\n%vstmts:", indent+" ") + for _, nn := range n.stmts { + nn.Print(out, indent+" ") + } + } +} diff --git a/parser/parser.go b/parser/parser.go index f734824..ac8183c 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -2932,7 +2932,7 @@ yydefault: yyDollar = yyS[yypt-3 : yypt+1] //line parser/parser.y:403 { - yyVAL.node = node.NewSimpleNode("Throw").Append(yyDollar[2].node) + yyVAL.node = stmt.NewThrow(yyDollar[1].token, yyDollar[2].node) } case 151: yyDollar = yyS[yypt-3 : yypt+1] @@ -3070,7 +3070,7 @@ yydefault: yyDollar = yyS[yypt-5 : yypt+1] //line parser/parser.y:466 { - yyVAL.node = node.NewSimpleNode("Trait").Attribute("name", yyDollar[2].token.String()).Append(yyDollar[4].node) + yyVAL.node = stmt.NewTrait(yyDollar[2].token, yyDollar[4].node.(node.SimpleNode).Children) } case 174: yyDollar = yyS[yypt-6 : yypt+1] diff --git a/parser/parser.y b/parser/parser.y index b6b50f8..e731590 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -400,7 +400,7 @@ statement: { $$ = stmt.NewTry($1, $3.(node.SimpleNode).Children, $5, $6) } - | T_THROW expr ';' { $$ = node.NewSimpleNode("Throw").Append($2) } + | T_THROW expr ';' { $$ = stmt.NewThrow($1, $2) } | T_GOTO T_STRING ';' { $$ = stmt.NewGoto($1, $2) } | T_STRING ':' { $$ = stmt.NewLabel($1) } @@ -463,7 +463,7 @@ class_modifier: ; trait_declaration_statement: - T_TRAIT T_STRING '{' class_statement_list '}' { $$ = node.NewSimpleNode("Trait").Attribute("name", $2.String()).Append($4) } + T_TRAIT T_STRING '{' class_statement_list '}' { $$ = stmt.NewTrait($2, $4.(node.SimpleNode).Children) } ; interface_declaration_statement: