Completed
Pull Request — master (#283)
by Oskar
01:58
created

PackageCollectingVisitor   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 48
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 0
Metric Value
dl 0
loc 48
rs 10
c 0
b 0
f 0
wmc 12
lcom 1
cbo 4

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A enterNode() 0 6 2
D leaveNode() 0 27 9
1
<?php
2
3
namespace Hal\Metric\Package;
4
5
use Hal\Metric\Metrics;
6
use Hal\Metric\PackageMetric;
7
use PhpParser\Node;
8
use PhpParser\Node\Stmt\Class_;
9
use PhpParser\Node\Stmt\Interface_;
10
use PhpParser\Node\Stmt\Namespace_;
11
use PhpParser\Node\Stmt\Trait_;
12
use PhpParser\NodeVisitorAbstract;
13
14
class PackageCollectingVisitor extends NodeVisitorAbstract
15
{
16
    /** @var string */
17
    private $namespace = '';
18
19
    /** @var Metrics */
20
    private $metrics;
21
22
    public function __construct(Metrics $metrics)
23
    {
24
        $this->metrics = $metrics;
25
    }
26
27
    public function enterNode(Node $node)
28
    {
29
        if ($node instanceof Namespace_) {
30
            $this->namespace = (string) $node->name;
31
        }
32
    }
33
34
    public function leaveNode(Node $node)
35
    {
36
        if ($node instanceof Class_ || $node instanceof Interface_ || $node instanceof Trait_) {
37
            $package = $this->namespace;
38
39
            $docComment = $node->getDocComment();
40
            $docBlockText = $docComment ? $docComment->getText() : '';
41
            if (preg_match('/^\s*\* @package (.*)/m', $docBlockText, $matches)) {
42
                $package = $matches[1];
43
            }
44
            if (preg_match('/^\s*\* @subpackage (.*)/m', $docBlockText, $matches)) {
45
                $package = $package . '\\' . $matches[1];
46
            }
47
48
            $packageName = $package . '\\';
49
            if (! $packageMetric = $this->metrics->get($packageName)) {
50
                $packageMetric = new PackageMetric($packageName);
51
                $this->metrics->attach($packageMetric);
52
            }
53
            /* @var PackageMetric $packageMetric */
54
            $elementName = isset($node->namespacedName) ? $node->namespacedName : 'anonymous@'.spl_object_hash($node);
55
            $elementName = (string) $elementName;
56
            $packageMetric->addClass($elementName);
57
58
            $this->metrics->get($elementName)->set('package', $packageName);
59
        }
60
    }
61
}
62