Completed
Pull Request — master (#139)
by Kévin
21:00 queued 02:16
created

Factory::getStatementPasses()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 7
nc 1
nop 0
dl 0
loc 10
ccs 8
cts 8
cp 1
crap 1
rs 9.4285
c 0
b 0
f 0
1
<?php
2
/**
3
 * @author Patsura Dmitry https://github.com/ovr <[email protected]>
4
 */
5
6
namespace PHPSA\Analyzer;
7
8
use PHPSA\Analyzer;
9
use PHPSA\Configuration;
10
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
11
use Webiny\Component\EventManager\EventManager;
12
use PHPSA\Analyzer\Pass as AnalyzerPass;
13
14
class Factory
15
{
16
    /**
17
     * @return NodeDefinition[]
18
     */
19 1
    public static function getPassesConfigurations()
20
    {
21 1
        $configs = [];
22
23 1
        foreach (self::getExpressionPasses() as $passClass) {
24 1
            if (!self::isAnalyzerConfigurable($passClass)) {
25 1
                continue;
26
            }
27
28 1
            $configs[] = $passClass::getConfiguration();
29 1
        }
30
31 1
        foreach (self::getStatementPasses() as $passClass) {
32 1
            if (!self::isAnalyzerConfigurable($passClass)) {
33
                continue;
34
            }
35
36 1
            $configs[] = $passClass::getConfiguration();
37 1
        }
38
39 1
        return $configs;
40
    }
41
42
    /**
43
     * @param EventManager $eventManager
44
     * @param Configuration $config
45
     * @return Analyzer
46
     */
47 1
    public static function factory(EventManager $eventManager, Configuration $config)
0 ignored issues
show
Best Practice introduced by
Using PHP4-style constructors that are named like the class is not recommend; better use the more explicit __construct method.
Loading history...
48
    {
49
        $filterEnabled = function ($passClass) use ($config) {
50 1
            if (!self::isAnalyzerConfigurable($passClass)) {
51 1
                return true;
52
            }
53
54 1
            $passName = $passClass::getName();
55
56 1
            if (!isset($config['analyzers'][$passName], $config['analyzers'][$passName]['enabled'])) {
57
                return true;
58
            }
59
60 1
            return $config['analyzers'][$passName]['enabled'];
61 1
        };
62
63 1
        $instanciate = function ($passClass) use ($config) {
64 1
            if (!self::isAnalyzerConfigurable($passClass)) {
65 1
                return new $passClass();
66
            }
67
68 1
            $passName = $passClass::getName();
69
70 1
            if (!isset($config['analyzers'][$passName])) {
71
                return new $passClass();
72
            }
73
74 1
            return new $passClass($config['analyzers'][$passName]);
75 1
        };
76
77 1
        $analyzer = new Analyzer($eventManager);
78 1
        $analyzer->registerExpressionPasses(
79 1
            array_map($instanciate, array_filter(self::getExpressionPasses(), $filterEnabled))
80 1
        );
81 1
        $analyzer->registerStatementPasses(
82 1
            array_map($instanciate, array_filter(self::getStatementPasses(), $filterEnabled))
83 1
        );
84 1
        $analyzer->bind();
85
86 1
        return $analyzer;
87
    }
88
89
    /**
90
     * @return array
91
     */
92 1
    private static function getStatementPasses()
93
    {
94 1
        return [
95 1
            AnalyzerPass\Statement\DoNotUseGoto::class,
96 1
            AnalyzerPass\Statement\MissingBreakStatement::class,
97 1
            AnalyzerPass\Statement\MethodCannotReturn::class,
98 1
            AnalyzerPass\Statement\UnexpectedUseOfThis::class,
99 1
            AnalyzerPass\Statement\OldConstructor::class,
100 1
        ];
101
    }
102
103
    /**
104
     * @return array
105
     */
106 1
    private static function getExpressionPasses()
107
    {
108
        return [
109
            // Another
110 1
            AnalyzerPass\Expression\ErrorSuppression::class,
111 1
            AnalyzerPass\Expression\VariableVariableUsage::class,
112 1
            AnalyzerPass\Expression\Casts::class,
113
            // Arrays
114 1
            AnalyzerPass\Expression\ArrayShortDefinition::class,
115 1
            AnalyzerPass\Expression\ArrayDuplicateKeys::class,
116
            // Function call
117 1
            AnalyzerPass\Expression\FunctionCall\AliasCheck::class,
118 1
            AnalyzerPass\Expression\FunctionCall\DebugCode::class,
119 1
            AnalyzerPass\Expression\FunctionCall\RandomApiMigration::class,
120 1
            AnalyzerPass\Expression\FunctionCall\UseCast::class,
121 1
            AnalyzerPass\Expression\FunctionCall\DeprecatedIniOptions::class,
122 1
            AnalyzerPass\Expression\FunctionCall\RegularExpressions::class,
123 1
            AnalyzerPass\Expression\FunctionCall\ArgumentUnpacking::class,
124 1
            AnalyzerPass\Expression\FunctionCall\DeprecatedFunctions::class,
125 1
        ];
126
    }
127
128 1
    private static function isAnalyzerConfigurable($passName)
129
    {
130 1
        return in_array(AnalyzerPass\ConfigurablePassInterface::class, class_implements($passName), true);
131
    }
132
}
133