Completed
Pull Request — 2.x (#151)
by Akihito
01:01
created

CodeVisitor::enterNodeClass()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 14
rs 9.7998
c 0
b 0
f 0
cc 3
nc 3
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Ray\Aop;
6
7
use PhpParser\Node;
8
use PhpParser\Node\Stmt\Class_;
9
use PhpParser\Node\Stmt\ClassMethod;
10
use PhpParser\Node\Stmt\Declare_;
11
use PhpParser\Node\Stmt\Namespace_;
12
use PhpParser\Node\Stmt\Use_;
13
use PhpParser\NodeVisitorAbstract;
14
use Ray\Aop\Exception\MultipleClassInOneFileException;
15
16
final class CodeVisitor extends NodeVisitorAbstract
17
{
18
    /**
19
     * @var ?Namespace_
20
     */
21
    public $namespace;
22
23
    /**
24
     * @var Declare_[]
25
     */
26
    public $declare = [];
27
28
    /**
29
     * @var Use_[]
30
     */
31
    public $use = [];
32
33
    /**
34
     * @var null|Class_
35
     */
36
    public $class;
37
38
    /**
39
     * @var ClassMethod[]
40
     */
41
    public $classMethod = [];
42
43
    public function enterNode(Node $node)
44
    {
45
        if ($node instanceof Declare_) {
46
            $this->declare[] = $node;
47
48
            return null;
49
        }
50
        if ($node instanceof Use_) {
51
            $this->use[] = $node;
52
53
            return null;
54
        }
55
        if ($node instanceof Namespace_) {
56
            $this->namespace = $node;
57
58
            return null;
59
        }
60
61
        return $this->enterNodeClass($node);
62
    }
63
64
    private function validateClass(Class_ $class) : void
65
    {
66
        $isClassAlreadyDeclared = $this->class instanceof Class_;
67
        if ($isClassAlreadyDeclared) {
68
            $name = $class->name instanceof Node\Identifier ? $class->name->name : '';
69
70
            throw new MultipleClassInOneFileException($name);
71
        }
72
    }
73
74
    /**
75
     * @return null
76
     */
77
    private function enterNodeClass(Node $node)
78
    {
79
        if ($node instanceof Class_) {
80
            $this->validateClass($node);
81
            $this->class = $node;
82
83
            return null;
84
        }
85
        if ($node instanceof ClassMethod) {
86
            $this->classMethod[] = $node;
87
        }
88
89
        return null;
90
    }
91
}
92