Passed
Push — master ( 078af8...830a0c )
by Asmir
01:34 queued 50s
created

FileLocator   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 55
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 12
eloc 22
dl 0
loc 55
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A findFileForClass() 0 15 6
A findAllClasses() 0 20 5
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Metadata\Driver;
6
7
class FileLocator implements AdvancedFileLocatorInterface
8
{
9
    /**
10
     * @var string[]
11
     */
12
    private $dirs;
13
14
    /**
15
     * @param string[] $dirs
16
     */
17
    public function __construct(array $dirs)
18
    {
19
        $this->dirs = $dirs;
20
    }
21
22
    public function findFileForClass(\ReflectionClass $class, string $extension): ?string
23
    {
24
        foreach ($this->dirs as $prefix => $dir) {
25
            if ('' !== $prefix && 0 !== strpos($class->getNamespaceName(), $prefix)) {
26
                continue;
27
            }
28
29
            $len = '' === $prefix ? 0 : strlen($prefix) + 1;
30
            $path = $dir . '/' . str_replace('\\', '.', substr($class->name, $len)) . '.' . $extension;
31
            if (file_exists($path)) {
32
                return $path;
33
            }
34
        }
35
36
        return null;
37
    }
38
39
    /**
40
     * {@inheritDoc}
41
     */
42
    public function findAllClasses(string $extension): array
43
    {
44
        $classes = [];
45
        foreach ($this->dirs as $prefix => $dir) {
46
            /** @var \RecursiveIteratorIterator|\SplFileInfo[] $iterator */
47
            $iterator = new \RecursiveIteratorIterator(
48
                new \RecursiveDirectoryIterator($dir),
49
                \RecursiveIteratorIterator::LEAVES_ONLY
50
            );
51
            $nsPrefix = '' !== $prefix ? $prefix . '\\' : '';
52
            foreach ($iterator as $file) {
53
                if (($fileName = $file->getBasename('.' . $extension)) === $file->getBasename()) {
54
                    continue;
55
                }
56
57
                $classes[] = $nsPrefix . str_replace('.', '\\', $fileName);
58
            }
59
        }
60
61
        return $classes;
62
    }
63
}
64