Completed
Push — master ( 3e0393...c84f1e )
by Enrico
09:13
created

Factory::getStatementPasses()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 21
CRAP Score 1

Importance

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