Passed
Branch master (9232c0)
by Johannes
02:26
created

FileLocator::findAllClasses()   A

Complexity

Conditions 5
Paths 7

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

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