Passed
Pull Request — master (#38)
by Rustam
02:30
created

PhpParserClassifier   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 33
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 16
c 2
b 0
f 0
dl 0
loc 33
ccs 15
cts 15
cp 1
rs 10
wmc 4

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A getAvailableClasses() 0 14 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Classifier;
6
7
use PhpParser\NodeTraverser;
8
use PhpParser\NodeVisitor\NameResolver;
9
use PhpParser\Parser;
10
use PhpParser\ParserFactory;
11
12
final class PhpParserClassifier extends AbstractClassifier
13
{
14
    private Parser $parser;
15
    private NodeTraverser $nodeTraverser;
16
17 13
    public function __construct(string $directory, string ...$directories)
18
    {
19 13
        parent::__construct($directory, ...$directories);
20 13
        $this->parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7);
21
22 13
        $traverser = new NodeTraverser();
23 13
        $traverser->addVisitor(new NameResolver());
24
25 13
        $this->nodeTraverser = $traverser;
26
    }
27
28
    /**
29
     * @return iterable<class-string>
30
     */
31 10
    protected function getAvailableClasses(): iterable
32
    {
33 10
        $files = $this->getFiles();
34 10
        $visitor = new ClassifierVisitor($this->interfaces, $this->attributes, $this->parentClass);
35 10
        $this->nodeTraverser->addVisitor($visitor);
36
37 10
        foreach ($files as $file) {
38 10
            $nodes = $this->parser->parse($file->getContents());
39 10
            if ($nodes !== null) {
40 10
                $this->nodeTraverser->traverse($nodes);
41
            }
42
        }
43
44 10
        yield from new \ArrayIterator($visitor->getClassNames());
45
    }
46
}
47