create ClassExtends ClassImplements InterfaceExtends nodes
This commit is contained in:
@@ -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 {
|
||||
|
||||
38
node/stmt/n_class_extends.go
Normal file
38
node/stmt/n_class_extends.go
Normal 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)
|
||||
}
|
||||
42
node/stmt/n_class_implements.go
Normal file
42
node/stmt/n_class_implements.go
Normal 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)
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
42
node/stmt/n_interface_extends.go
Normal file
42
node/stmt/n_interface_extends.go
Normal 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)
|
||||
}
|
||||
@@ -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"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user