From 6d1eee5a79d5ea3511975f4cffc0fd3df4d385bd Mon Sep 17 00:00:00 2001 From: Tyler Christensen Date: Mon, 24 Apr 2023 12:23:01 -0600 Subject: [PATCH] php8: resolve enums in NamespaceResolver --- README.md | 4 +-- pkg/visitor/nsresolver/namespace_resolver.go | 16 +++++++++ .../nsresolver/namespace_resolver_test.go | 33 ++++++++++++++++++- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3912ca5..4bbb86a 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ php-parser [flags] ... Namespace resolver ------------------ -Namespace resolver is a visitor that resolves nodes fully qualified name and saves into `map[node.Node]string` structure +Namespace resolver is a visitor that resolves nodes fully qualified name and saves into `map[ast.Vertex]string` structure -- For `Class`, `Interface`, `Trait`, `Function`, `Constant` nodes it saves name with current namespace. +- For `Class`, `Interface`, `Trait`, `Enum`, `Function`, `Constant` nodes it saves name with current namespace. - For `Name`, `Relative`, `FullyQualified` nodes it resolves `use` aliases and saves a fully qualified name. diff --git a/pkg/visitor/nsresolver/namespace_resolver.go b/pkg/visitor/nsresolver/namespace_resolver.go index 59fccc2..5784916 100644 --- a/pkg/visitor/nsresolver/namespace_resolver.go +++ b/pkg/visitor/nsresolver/namespace_resolver.go @@ -89,6 +89,22 @@ func (nsr *NamespaceResolver) StmtClass(n *ast.StmtClass) { } } +func (nsr *NamespaceResolver) StmtEnum(n *ast.StmtEnum) { + if n.Type != nil { + nsr.ResolveName(n.Type, "") + } + + if n.Implements != nil { + for _, interfaceName := range n.Implements { + nsr.ResolveName(interfaceName, "") + } + } + + if n.Name != nil { + nsr.AddNamespacedName(n, string(n.Name.(*ast.Identifier).Value)) + } +} + func (nsr *NamespaceResolver) StmtInterface(n *ast.StmtInterface) { if n.Extends != nil { for _, interfaceName := range n.Extends { diff --git a/pkg/visitor/nsresolver/namespace_resolver_test.go b/pkg/visitor/nsresolver/namespace_resolver_test.go index a2fa52d..b4d07cb 100644 --- a/pkg/visitor/nsresolver/namespace_resolver_test.go +++ b/pkg/visitor/nsresolver/namespace_resolver_test.go @@ -1,9 +1,10 @@ package nsresolver_test import ( + "testing" + "github.com/laytan/php-parser/pkg/visitor/nsresolver" "github.com/laytan/php-parser/pkg/visitor/traverser" - "testing" "gotest.tools/assert" @@ -463,6 +464,36 @@ func TestResolveTraitName(t *testing.T) { assert.DeepEqual(t, expected, nsResolver.ResolvedNames) } +func TestResolveEnumName(t *testing.T) { + nameAB := &ast.Name{Parts: []ast.Vertex{&ast.NamePart{Value: []byte("A")}, &ast.NamePart{Value: []byte("B")}}} + nameBC := &ast.Name{Parts: []ast.Vertex{&ast.NamePart{Value: []byte("B")}, &ast.NamePart{Value: []byte("C")}}} + + enum := &ast.StmtEnum{ + Name: &ast.Identifier{Value: []byte("A")}, + Type: nameAB, + Implements: []ast.Vertex{ + nameBC, + }, + } + + stxTree := &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + enum, + }, + } + + expected := map[ast.Vertex]string{ + enum: "A", + nameAB: "A\\B", + nameBC: "B\\C", + } + + nsResolver := nsresolver.NewNamespaceResolver() + traverser.NewTraverser(nsResolver).Traverse(stxTree) + + assert.DeepEqual(t, expected, nsResolver.ResolvedNames) +} + func TestResolveFunctionName(t *testing.T) { nameAB := &ast.Name{Parts: []ast.Vertex{&ast.NamePart{Value: []byte("A")}, &ast.NamePart{Value: []byte("B")}}} nameBC := &ast.Name{Parts: []ast.Vertex{&ast.NamePart{Value: []byte("B")}, &ast.NamePart{Value: []byte("C")}}}