Completed
Pull Request — master (#139)
by Kévin
15:46 queued 02:25
created

Factory::factory()   B

Complexity

Conditions 3
Paths 1

Size

Total Lines 36
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 30
CRAP Score 3

Importance

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