Test Failed
Pull Request — master (#38)
by Sergei
08:01 queued 05:42
created

PhpParserClassifier::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 9
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 13
rs 9.9666
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 ClassifierVisitor $visitor;
16
    private NodeTraverser $nodeTraverser;
17
18
    public function __construct(string $directory, string ...$directories)
19
    {
20
        parent::__construct($directory, ...$directories);
21
        $this->parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7);
22
23
        $filter = fn(string $className): bool => /** @psalm-var class-string $className */ $this->skipClass($className);
24
        $visitor = new ClassifierVisitor($filter);
25
        $traverser = new NodeTraverser();
26
        $traverser->addVisitor(new NameResolver());
27
        $traverser->addVisitor($visitor);
28
29
        $this->visitor = $visitor;
30
        $this->nodeTraverser = $traverser;
31
    }
32
33
    /**
34
     * @return iterable<class-string>
35
     */
36
    protected function getAvailableClasses(): iterable
37
    {
38
        $files = $this->getFiles();
39
40
        foreach ($files as $file) {
41
            $nodes = $this->parser->parse($file->getContents());
42
            if ($nodes !== null) {
43
                $this->nodeTraverser->traverse($nodes);
44
            }
45
        }
46
47
        yield from new \ArrayIterator($this->visitor->getClassNames());
48
    }
49
}
50