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

PhpParserClassifier::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 5
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 9
ccs 6
cts 6
cp 1
crap 1
rs 10
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