Completed
Branch master (c5ceed)
by Tomáš
33:54 queued 13:17
created

SniffFinder::findSniffsInDirectory()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 5
cts 5
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 5
nc 1
nop 1
crap 1
1
<?php
2
3
/*
4
 * This file is part of Symplify
5
 * Copyright (c) 2016 Tomas Votruba (http://tomasvotruba.cz).
6
 */
7
8
namespace Symplify\PHP7_CodeSniffer\SniffFinder;
9
10
use Nette\Caching\Storages\DevNullStorage;
11
use Nette\Loaders\RobotLoader;
12
use ReflectionClass;
13
use Symfony\Component\Finder\Finder;
14
use Symplify\PHP7_CodeSniffer\SniffFinder\Composer\VendorDirProvider;
15
use Symplify\PHP7_CodeSniffer\SniffFinder\Naming\SniffNaming;
16
17
final class SniffFinder
18
{
19
    /**
20
     * @var string[]
21
     */
22
    private $sniffClassesPerDirectory = [];
23
24
    /**
25
     * {@inheritdoc}
26
     */
27 1
    public function findAllSniffClasses() : array
28
    {
29 1
        return $this->findAllSniffClassesInDirectory(VendorDirProvider::provide());
30
    }
31
32
    /**
33
     * {@inheritdoc}
34
     */
35 1
    public function findAllSniffs() : array
36
    {
37 1
        return $this->findSniffsInDirectory(VendorDirProvider::provide());
38
    }
39
40
    /**
41
     * {@inheritdoc}
42
     */
43 2
    public function findSniffsInDirectory(string $directory) : array
44
    {
45 2
        $filesInfo = (new Finder())->files()
46 2
            ->in($directory)
47 2
            ->name('*Sniff.php');
48
49 2
        return array_keys(iterator_to_array($filesInfo));
50
    }
51
52
    /**
53
     * {@inheritdoc}
54
     */
55 1
    public function findAllSniffClassesInDirectory(string $directory) : array
56
    {
57 1
        if (isset($this->sniffClassesPerDirectory[$directory])) {
58 1
            return $this->sniffClassesPerDirectory[$directory];
59
        }
60
61 1
        $robot = $this->createAndSetupRobotLoaderForDirectory($directory);
62 1
        $robot->rebuild();
63
64 1
        $sniffClasses = $this->filterOutAbstractAndNonPhpSniffs(array_keys($robot->getIndexedClasses()));
65 1
        $this->sniffClassesPerDirectory[$directory] = $sniffClasses;
66
67 1
        return $sniffClasses;
68
    }
69
70 1
    private function createAndSetupRobotLoaderForDirectory(string $directory) : RobotLoader
71
    {
72 1
        $robot = new RobotLoader();
73 1
        $robot->setCacheStorage(new DevNullStorage());
74 1
        $robot->addDirectory($directory);
75 1
        $robot->ignoreDirs .= ', tests, Tests';
76 1
        $robot->acceptFiles = '*Sniff.php';
77 1
        return $robot;
78
    }
79
80 1
    private function filterOutAbstractAndNonPhpSniffs(array $classes) : array
81
    {
82 1
        $sniffClasses = [];
83 1
        foreach ($classes as $class) {
84 1
            if ($this->isAbstractClass($class)) {
85 1
                continue;
86
            }
87
88 1
            if (!$this->doesSniffSupportsPhp($class)) {
89 1
                continue;
90
            }
91
92 1
            $code = SniffNaming::guessSniffCodeBySniffClass($class);
93 1
            $sniffClasses[$code] = $class;
94
        }
95
96 1
        return $sniffClasses;
97
    }
98
99 1
    private function isAbstractClass(string $className) : bool
100
    {
101 1
        $reflection = new ReflectionClass($className);
102 1
        return $reflection->isAbstract();
103
    }
104
105 1
    private function doesSniffSupportsPhp(string $className) : bool
106
    {
107 1
        $vars = get_class_vars($className);
108 1
        if (!isset($vars['supportedTokenizers'])) {
109 1
            return true;
110
        }
111
112 1
        if (in_array('PHP', $vars['supportedTokenizers'])) {
113 1
            return true;
114
        }
115
116 1
        return false;
117
    }
118
}
119