create ClassExtends ClassImplements InterfaceExtends nodes

This commit is contained in:
z7zmey
2018-05-12 23:10:01 +03:00
parent cf4fb26764
commit ac74ae3225
19 changed files with 1720 additions and 1495 deletions

View File

@@ -11,13 +11,13 @@ type Class struct {
ClassName node.Node
Modifiers []node.Node
ArgumentList *node.ArgumentList
Extends node.Node
Implements []node.Node
Extends *ClassExtends
Implements *ClassImplements
Stmts []node.Node
}
// NewClass node constructor
func NewClass(ClassName node.Node, Modifiers []node.Node, ArgumentList *node.ArgumentList, Extends node.Node, Implements []node.Node, Stmts []node.Node, PhpDocComment string) *Class {
func NewClass(ClassName node.Node, Modifiers []node.Node, ArgumentList *node.ArgumentList, Extends *ClassExtends, Implements *ClassImplements, Stmts []node.Node, PhpDocComment string) *Class {
return &Class{
PhpDocComment,
ClassName,
@@ -69,11 +69,7 @@ func (n *Class) Walk(v walker.Visitor) {
if n.Implements != nil {
vv := v.GetChildrenVisitor("Implements")
for _, nn := range n.Implements {
if nn != nil {
nn.Walk(vv)
}
}
n.Implements.Walk(vv)
}
if n.Stmts != nil {

View File

@@ -0,0 +1,38 @@
package stmt
import (
"github.com/z7zmey/php-parser/node"
"github.com/z7zmey/php-parser/walker"
)
// ClassExtends node
type ClassExtends struct {
ClassName node.Node
}
// NewClassExtends node constructor
func NewClassExtends(className node.Node) *ClassExtends {
return &ClassExtends{
className,
}
}
// Attributes returns node attributes as map
func (n *ClassExtends) Attributes() map[string]interface{} {
return nil
}
// Walk traverses nodes
// Walk is invoked recursively until v.EnterNode returns true
func (n *ClassExtends) Walk(v walker.Visitor) {
if v.EnterNode(n) == false {
return
}
if n.ClassName != nil {
vv := v.GetChildrenVisitor("ClassName")
n.ClassName.Walk(vv)
}
v.LeaveNode(n)
}

View File

@@ -0,0 +1,42 @@
package stmt
import (
"github.com/z7zmey/php-parser/node"
"github.com/z7zmey/php-parser/walker"
)
// ClassImplements node
type ClassImplements struct {
InterfaceNames []node.Node
}
// NewClassImplements node constructor
func NewClassImplements(interfaceNames []node.Node) *ClassImplements {
return &ClassImplements{
interfaceNames,
}
}
// Attributes returns node attributes as map
func (n *ClassImplements) Attributes() map[string]interface{} {
return nil
}
// Walk traverses nodes
// Walk is invoked recursively until v.EnterNode returns true
func (n *ClassImplements) Walk(v walker.Visitor) {
if v.EnterNode(n) == false {
return
}
if n.InterfaceNames != nil {
vv := v.GetChildrenVisitor("InterfaceNames")
for _, nn := range n.InterfaceNames {
if nn != nil {
nn.Walk(vv)
}
}
}
v.LeaveNode(n)
}

View File

@@ -9,12 +9,12 @@ import (
type Interface struct {
PhpDocComment string
InterfaceName node.Node
Extends []node.Node
Extends *InterfaceExtends
Stmts []node.Node
}
// NewInterface node constructor
func NewInterface(InterfaceName node.Node, Extends []node.Node, Stmts []node.Node, PhpDocComment string) *Interface {
func NewInterface(InterfaceName node.Node, Extends *InterfaceExtends, Stmts []node.Node, PhpDocComment string) *Interface {
return &Interface{
PhpDocComment,
InterfaceName,
@@ -44,11 +44,7 @@ func (n *Interface) Walk(v walker.Visitor) {
if n.Extends != nil {
vv := v.GetChildrenVisitor("Extends")
for _, nn := range n.Extends {
if nn != nil {
nn.Walk(vv)
}
}
n.Extends.Walk(vv)
}
if n.Stmts != nil {

View File

@@ -0,0 +1,42 @@
package stmt
import (
"github.com/z7zmey/php-parser/node"
"github.com/z7zmey/php-parser/walker"
)
// InterfaceExtends node
type InterfaceExtends struct {
InterfaceNames []node.Node
}
// NewInterfaceExtends node constructor
func NewInterfaceExtends(InterfaceNames []node.Node) *InterfaceExtends {
return &InterfaceExtends{
InterfaceNames,
}
}
// Attributes returns node attributes as map
func (n *InterfaceExtends) Attributes() map[string]interface{} {
return nil
}
// Walk traverses nodes
// Walk is invoked recursively until v.EnterNode returns true
func (n *InterfaceExtends) Walk(v walker.Visitor) {
if v.EnterNode(n) == false {
return
}
if n.InterfaceNames != nil {
vv := v.GetChildrenVisitor("InterfaceNames")
for _, nn := range n.InterfaceNames {
if nn != nil {
nn.Walk(vv)
}
}
}
v.LeaveNode(n)
}

View File

@@ -72,9 +72,11 @@ func TestClassExtends(t *testing.T) {
Modifiers: []node.Node{
&node.Identifier{Value: "final"},
},
Extends: &name.Name{
Parts: []node.Node{
&name.NamePart{Value: "bar"},
Extends: &stmt.ClassExtends{
ClassName: &name.Name{
Parts: []node.Node{
&name.NamePart{Value: "bar"},
},
},
},
Stmts: []node.Node{},
@@ -103,10 +105,12 @@ func TestClassImplement(t *testing.T) {
Modifiers: []node.Node{
&node.Identifier{Value: "final"},
},
Implements: []node.Node{
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "bar"},
Implements: &stmt.ClassImplements{
InterfaceNames: []node.Node{
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "bar"},
},
},
},
},
@@ -136,15 +140,17 @@ func TestClassImplements(t *testing.T) {
Modifiers: []node.Node{
&node.Identifier{Value: "final"},
},
Implements: []node.Node{
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "bar"},
Implements: &stmt.ClassImplements{
InterfaceNames: []node.Node{
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "bar"},
},
},
},
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "baz"},
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "baz"},
},
},
},
},
@@ -173,20 +179,24 @@ func TestAnonimousClass(t *testing.T) {
Expr: &expr.New{
Class: &stmt.Class{
ArgumentList: &node.ArgumentList{},
Extends: &name.Name{
Parts: []node.Node{
&name.NamePart{Value: "foo"},
},
},
Implements: []node.Node{
&name.Name{
Extends: &stmt.ClassExtends{
ClassName: &name.Name{
Parts: []node.Node{
&name.NamePart{Value: "bar"},
&name.NamePart{Value: "foo"},
},
},
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "baz"},
},
Implements: &stmt.ClassImplements{
InterfaceNames: []node.Node{
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "bar"},
},
},
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "baz"},
},
},
},
},

View File

@@ -43,10 +43,12 @@ func TestInterfaceExtend(t *testing.T) {
&stmt.Interface{
PhpDocComment: "",
InterfaceName: &node.Identifier{Value: "Foo"},
Extends: []node.Node{
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "Bar"},
Extends: &stmt.InterfaceExtends{
InterfaceNames: []node.Node{
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "Bar"},
},
},
},
},
@@ -74,15 +76,17 @@ func TestInterfaceExtends(t *testing.T) {
&stmt.Interface{
PhpDocComment: "",
InterfaceName: &node.Identifier{Value: "Foo"},
Extends: []node.Node{
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "Bar"},
Extends: &stmt.InterfaceExtends{
InterfaceNames: []node.Node{
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "Bar"},
},
},
},
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "Baz"},
&name.Name{
Parts: []node.Node{
&name.NamePart{Value: "Baz"},
},
},
},
},

View File

@@ -4,6 +4,8 @@ import (
"reflect"
"testing"
"github.com/z7zmey/php-parser/node/name"
"github.com/z7zmey/php-parser/node/expr"
"github.com/z7zmey/php-parser/node/stmt"
@@ -93,8 +95,8 @@ var nodesToTest = []struct {
ClassName: &node.Identifier{},
Modifiers: []node.Node{&stmt.Expression{}},
ArgumentList: &node.ArgumentList{},
Extends: &node.Identifier{},
Implements: []node.Node{&stmt.Expression{}},
Extends: &stmt.ClassExtends{},
Implements: &stmt.ClassImplements{},
Stmts: []node.Node{&stmt.Expression{}},
},
[]string{"ClassName", "Modifiers", "ArgumentList", "Extends", "Implements", "Stmts"},
@@ -293,7 +295,7 @@ var nodesToTest = []struct {
&stmt.Interface{
PhpDocComment: "/** */",
InterfaceName: &node.Identifier{},
Extends: []node.Node{&stmt.Expression{}},
Extends: &stmt.InterfaceExtends{},
Stmts: []node.Node{&stmt.Expression{}},
},
[]string{"InterfaceName", "Extends", "Stmts"},
@@ -493,6 +495,31 @@ var nodesToTest = []struct {
[]string{"Adaptations"},
map[string]interface{}{},
},
{
&stmt.ClassExtends{
ClassName: &name.Name{},
},
[]string{"ClassName"},
map[string]interface{}{},
},
{
&stmt.ClassImplements{
InterfaceNames: []node.Node{
&name.Name{},
},
},
[]string{"InterfaceNames"},
map[string]interface{}{},
},
{
&stmt.InterfaceExtends{
InterfaceNames: []node.Node{
&name.Name{},
},
},
[]string{"InterfaceNames"},
map[string]interface{}{},
},
}
type visitorMock struct {