Completed
Pull Request — master (#251)
by
unknown
11:10
created

Factory::getScalarPasses()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 0
dl 0
loc 6
ccs 3
cts 3
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
        $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
     * @param EventManager $eventManager
40
     * @param Configuration $config
41
     * @return Analyzer
42
     */
43 43
    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...
44
    {
45 43
        $analyzersConfig = $config->getValue('analyzers');
46
47
        $filterEnabled = function ($passClass) use ($config, $analyzersConfig) {
48
            /** @var AnalyzerPass\Metadata $passMetadata */
49 43
            $passMetadata = $passClass::getMetadata();
50
51 43
            if (!isset($analyzersConfig[$passMetadata->getName()])) {
52 43
                return false;
53
            }
54
55 43
            if (!$analyzersConfig[$passMetadata->getName()]['enabled']) {
56
                return false;
57
            }
58
59 43
            if (!$passMetadata->allowsPhpVersion($config->getValue('language_level'))) {
60
                return false;
61
            }
62
63 43
            return true;
64 43
        };
65
66 43
        $instanciate = function ($passClass) use ($analyzersConfig) {
67 43
            $passName = $passClass::getMetadata()->getName();
68
69 43
            return new $passClass($analyzersConfig[$passName]);
70 43
        };
71
72 43
        $analyzer = new Analyzer($eventManager);
73 43
        $analyzer->registerExpressionPasses(
74 43
            array_map($instanciate, array_filter(self::getExpressionPasses(), $filterEnabled))
75 43
        );
76 43
        $analyzer->registerStatementPasses(
77 43
            array_map($instanciate, array_filter(self::getStatementPasses(), $filterEnabled))
78 43
        );
79 43
        $analyzer->registerScalarPasses(
80 43
            array_map($instanciate, array_filter(self::getScalarPasses(), $filterEnabled))
81 43
        );
82 43
        $analyzer->bind();
83
84 43
        return $analyzer;
85
    }
86
87
    /**
88
     * @return array
89
     */
90 43
    private static function getStatementPasses()
91
    {
92
        return [
93 43
            AnalyzerPass\Statement\MagicMethodParameters::class,
94 43
            AnalyzerPass\Statement\GotoUsage::class,
95 43
            AnalyzerPass\Statement\GlobalUsage::class,
96 43
            AnalyzerPass\Statement\HasMoreThanOneProperty::class,
97 43
            AnalyzerPass\Statement\MissingBreakStatement::class,
98 43
            AnalyzerPass\Statement\MissingVisibility::class,
99 43
            AnalyzerPass\Statement\MethodCannotReturn::class,
100 43
            AnalyzerPass\Statement\UnexpectedUseOfThis::class,
101 43
            AnalyzerPass\Statement\TestAnnotation::class,
102 43
            AnalyzerPass\Statement\MissingDocblock::class,
103 43
            AnalyzerPass\Statement\OldConstructor::class,
104 43
            AnalyzerPass\Statement\ConstantNaming::class,
105 43
            AnalyzerPass\Statement\MissingBody::class,
106 43
            AnalyzerPass\Statement\InlineHtmlUsage::class,
107 43
            AnalyzerPass\Statement\AssignmentInCondition::class,
108 43
            AnalyzerPass\Statement\StaticUsage::class,
109 43
            AnalyzerPass\Statement\OptionalParamBeforeRequired::class,
110 43
            AnalyzerPass\Statement\YodaCondition::class,
111 43
            AnalyzerPass\Statement\ForCondition::class,
112 43
            AnalyzerPass\Statement\PropertyDefinitionDefaultValue::class,
113 43
        ];
114
    }
115
116
    /**
117
     * @return array
118
     */
119 43
    private static function getExpressionPasses()
120
    {
121
        return [
122
            // Another
123 43
            AnalyzerPass\Expression\ErrorSuppression::class,
124 43
            AnalyzerPass\Expression\MultipleUnaryOperators::class,
125 43
            AnalyzerPass\Expression\StupidUnaryOperators::class,
126 43
            AnalyzerPass\Expression\VariableVariableUsage::class,
127 43
            AnalyzerPass\Expression\Casts::class,
128 43
            AnalyzerPass\Expression\EvalUsage::class,
129 43
            AnalyzerPass\Expression\FinalStaticUsage::class,
130 43
            AnalyzerPass\Expression\CompareWithArray::class,
131 43
            AnalyzerPass\Expression\BacktickUsage::class,
132 43
            AnalyzerPass\Expression\LogicInversion::class,
133 43
            AnalyzerPass\Expression\ExitUsage::class,
134
            // Arrays
135 43
            AnalyzerPass\Expression\ArrayShortDefinition::class,
136 43
            AnalyzerPass\Expression\ArrayDuplicateKeys::class,
137 43
            AnalyzerPass\Expression\ArrayIllegalOffsetType::class,
138
            // Function call
139 43
            AnalyzerPass\Expression\FunctionCall\AliasCheck::class,
140 43
            AnalyzerPass\Expression\FunctionCall\DebugCode::class,
141 43
            AnalyzerPass\Expression\FunctionCall\RandomApiMigration::class,
142 43
            AnalyzerPass\Expression\FunctionCall\UseCast::class,
143 43
            AnalyzerPass\Expression\FunctionCall\DeprecatedIniOptions::class,
144 43
            AnalyzerPass\Expression\FunctionCall\RegularExpressions::class,
145 43
            AnalyzerPass\Expression\FunctionCall\ArgumentUnpacking::class,
146 43
            AnalyzerPass\Expression\FunctionCall\DeprecatedFunctions::class,
147 43
        ];
148
    }
149
150
    /**
151
     * @return array
152
     */
153 43
    private static function getScalarPasses()
154
    {
155
        return [
156 43
            AnalyzerPass\Scalar\CheckLNumberKind::class,
157 43
        ];
158
    }
159
}
160