Completed
Pull Request — master (#305)
by Дмитрий
04:13 queued 01:07
created

Factory   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 176
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 98.15%

Importance

Changes 0
Metric Value
dl 0
loc 176
ccs 106
cts 108
cp 0.9815
rs 10
c 0
b 0
f 0
wmc 15
lcom 1
cbo 2

6 Methods

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