Completed
Pull Request — master (#265)
by Enrico
14:16
created

Factory::getPassesMetadata()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 18
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 4.0466

Importance

Changes 0
Metric Value
cc 4
eloc 9
nc 8
nop 0
dl 0
loc 18
ccs 6
cts 7
cp 0.8571
crap 4.0466
rs 9.2
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
        $configs = [];
22
23
        foreach (self::getExpressionPasses() as $passClass) {
24
            $configs[] = $passClass::getMetadata()->getConfiguration();
25
        }
26
27 1
        foreach (self::getStatementPasses() as $passClass) {
28
            $configs[] = $passClass::getMetadata()->getConfiguration();
29
        }
30
31
        foreach (self::getScalarPasses() as $passClass) {
32
            $configs[] = $passClass::getMetadata()->getConfiguration();
33
        }
34
35
        return $configs;
36
    }
37
38
    /**
39
     * @return \PHPSA\Analyzer\Pass\Metadata[]
40
     */
41
    public static function getPassesMetadata()
42
    {
43 46
        $meta = [];
44
45 46
        foreach (self::getExpressionPasses() as $passClass) {
46
            $meta[] = $passClass::getMetadata();
47
        }
48
49 46
        foreach (self::getStatementPasses() as $passClass) {
50
            $meta[] = $passClass::getMetadata();
51 46
        }
52 46
53
        foreach (self::getScalarPasses() as $passClass) {
54
            $meta[] = $passClass::getMetadata();
55 46
        }
56
57
        return $meta;
58
    }
59 46
60
    /**
61
     * @param EventManager $eventManager
62
     * @param Configuration $config
63 46
     * @return Analyzer
64 46
     */
65
    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...
66 46
    {
67 46
        $analyzersConfig = $config->getValue('analyzers');
68
69 46
        $filterEnabled = function ($passClass) use ($config, $analyzersConfig) {
70 46
            /** @var AnalyzerPass\Metadata $passMetadata */
71
            $passMetadata = $passClass::getMetadata();
72 46
73 46
            if (!isset($analyzersConfig[$passMetadata->getName()])) {
74 46
                return false;
75 46
            }
76 46
77 46
            if (!$analyzersConfig[$passMetadata->getName()]['enabled']) {
78 46
                return false;
79 46
            }
80 46
81 46
            if (!$passMetadata->allowsPhpVersion($config->getValue('language_level'))) {
82 46
                return false;
83
            }
84 46
85
            return true;
86
        };
87
88
        $instanciate = function ($passClass) use ($analyzersConfig) {
89
            $passName = $passClass::getMetadata()->getName();
90 46
91
            return new $passClass($analyzersConfig[$passName]);
92
        };
93 46
94 46
        $analyzer = new Analyzer($eventManager);
95 46
        $analyzer->registerExpressionPasses(
96 46
            array_map($instanciate, array_filter(self::getExpressionPasses(), $filterEnabled))
97 46
        );
98 46
        $analyzer->registerStatementPasses(
99 46
            array_map($instanciate, array_filter(self::getStatementPasses(), $filterEnabled))
100 46
        );
101 46
        $analyzer->registerScalarPasses(
102 46
            array_map($instanciate, array_filter(self::getScalarPasses(), $filterEnabled))
103 46
        );
104 46
        $analyzer->bind();
105 46
106 46
        return $analyzer;
107 46
    }
108 46
109 46
    /**
110 46
     * @return array
111 46
     */
112 46
    private static function getStatementPasses()
113 46
    {
114 46
        return [
115
            AnalyzerPass\Statement\MagicMethodParameters::class,
116
            AnalyzerPass\Statement\GotoUsage::class,
117
            AnalyzerPass\Statement\GlobalUsage::class,
118
            AnalyzerPass\Statement\HasMoreThanOneProperty::class,
119
            AnalyzerPass\Statement\MissingBreakStatement::class,
120 46
            AnalyzerPass\Statement\MissingVisibility::class,
121
            AnalyzerPass\Statement\MethodCannotReturn::class,
122 1
            AnalyzerPass\Statement\UnexpectedUseOfThis::class,
123
            AnalyzerPass\Statement\TestAnnotation::class,
124 46
            AnalyzerPass\Statement\MissingDocblock::class,
125 46
            AnalyzerPass\Statement\OldConstructor::class,
126 46
            AnalyzerPass\Statement\ConstantNaming::class,
127 46
            AnalyzerPass\Statement\MissingBody::class,
128 46
            AnalyzerPass\Statement\InlineHtmlUsage::class,
129 46
            AnalyzerPass\Statement\AssignmentInCondition::class,
130 46
            AnalyzerPass\Statement\StaticUsage::class,
131 46
            AnalyzerPass\Statement\OptionalParamBeforeRequired::class,
132 46
            AnalyzerPass\Statement\YodaCondition::class,
133 46
            AnalyzerPass\Statement\ForCondition::class,
134 46
            AnalyzerPass\Statement\PropertyDefinitionDefaultValue::class,
135 46
            AnalyzerPass\Statement\ReturnAndYieldInOneMethod::class,
136 46
        ];
137
    }
138 46
139 46
    /**
140 46
     * @return array
141
     */
142 46
    private static function getExpressionPasses()
143 46
    {
144 46
        return [
145 46
            // Another
146 46
            AnalyzerPass\Expression\ErrorSuppression::class,
147 46
            AnalyzerPass\Expression\MultipleUnaryOperators::class,
148 46
            AnalyzerPass\Expression\StupidUnaryOperators::class,
149 46
            AnalyzerPass\Expression\VariableVariableUsage::class,
150 46
            AnalyzerPass\Expression\Casts::class,
151
            AnalyzerPass\Expression\EvalUsage::class,
152
            AnalyzerPass\Expression\FinalStaticUsage::class,
153
            AnalyzerPass\Expression\CompareWithArray::class,
154
            AnalyzerPass\Expression\DivisionFromZero::class,
155
            AnalyzerPass\Expression\DivisionByOne::class,
156 46
            AnalyzerPass\Expression\BacktickUsage::class,
157
            AnalyzerPass\Expression\LogicInversion::class,
158
            AnalyzerPass\Expression\ExitUsage::class,
159 46
            // Arrays
160 46
            AnalyzerPass\Expression\ArrayShortDefinition::class,
161
            AnalyzerPass\Expression\ArrayDuplicateKeys::class,
162
            AnalyzerPass\Expression\ArrayIllegalOffsetType::class,
163
            // Function call
164
            AnalyzerPass\Expression\FunctionCall\AliasCheck::class,
165
            AnalyzerPass\Expression\FunctionCall\DebugCode::class,
166
            AnalyzerPass\Expression\FunctionCall\RandomApiMigration::class,
167
            AnalyzerPass\Expression\FunctionCall\UseCast::class,
168
            AnalyzerPass\Expression\FunctionCall\DeprecatedIniOptions::class,
169
            AnalyzerPass\Expression\FunctionCall\RegularExpressions::class,
170
            AnalyzerPass\Expression\FunctionCall\ArgumentUnpacking::class,
171
            AnalyzerPass\Expression\FunctionCall\DeprecatedFunctions::class,
172
        ];
173
    }
174
175
    /**
176
     * @return array
177
     */
178
    private static function getScalarPasses()
179
    {
180
        return [
181
            AnalyzerPass\Scalar\CheckLNumberKind::class,
182
        ];
183
    }
184
}
185