Failed Conditions
Push — master ( 2b713c...735d0a )
by Alex
16s queued 13s
created

VisitExpressions::visitExpression()   F

Complexity

Conditions 28
Paths 28

Size

Total Lines 114
Code Lines 111

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 28
eloc 111
nc 28
nop 1
dl 0
loc 114
rs 3.3333
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
6
namespace AlgoWeb\ODataMetadata\ModelVisitorConcerns;
7
8
use AlgoWeb\ODataMetadata\EdmModelVisitor;
9
use AlgoWeb\ODataMetadata\Enums\ExpressionKind;
10
use AlgoWeb\ODataMetadata\Exception\InvalidOperationException;
11
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IApplyExpression;
12
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IAssertTypeExpression;
13
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IBinaryConstantExpression;
14
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IBooleanConstantExpression;
15
use AlgoWeb\ODataMetadata\Interfaces\Expressions\ICollectionExpression;
16
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IDateTimeConstantExpression;
17
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IDateTimeOffsetConstantExpression;
18
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IDecimalConstantExpression;
19
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IEntitySetReferenceExpression;
20
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IEnumMemberReferenceExpression;
21
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IExpression;
22
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IFloatingConstantExpression;
23
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IFunctionReferenceExpression;
24
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IGuidConstantExpression;
25
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IIfExpression;
26
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IIntegerConstantExpression;
27
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IIsTypeExpression;
28
use AlgoWeb\ODataMetadata\Interfaces\Expressions\ILabeledExpression;
29
use AlgoWeb\ODataMetadata\Interfaces\Expressions\ILabeledExpressionReferenceExpression;
30
use AlgoWeb\ODataMetadata\Interfaces\Expressions\INullExpression;
31
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IParameterReferenceExpression;
32
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IPathExpression;
33
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IPropertyReferenceExpression;
34
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IRecordExpression;
35
use AlgoWeb\ODataMetadata\Interfaces\Expressions\IStringConstantExpression;
36
use AlgoWeb\ODataMetadata\Interfaces\Expressions\ITimeConstantExpression;
37
use AlgoWeb\ODataMetadata\Interfaces\Expressions\RecordExpression\IPropertyConstructor;
38
use AlgoWeb\ODataMetadata\StringConst;
39
40
/**
41
 * Trait VisitExpressions.
42
 * @package AlgoWeb\ODataMetadata\ModelVisitorConcerns
43
 * @mixin EdmModelVisitor
44
 */
45
trait VisitExpressions
46
{
47
    public function visitExpressions(array $expressions): void
48
    {
49
        /** @var EdmModelVisitor $this */
50
        self::visitCollection($expressions, [$this, 'visitExpression']);
51
    }
52
53
    public function visitExpression(IExpression $expression): void
54
    {
55
        /** @var EdmModelVisitor $this */
56
        switch ($expression->getExpressionKind()) {
57
            case ExpressionKind::AssertType():
58
                assert($expression instanceof  IAssertTypeExpression);
59
                $this->processAssertTypeExpression($expression);
60
                break;
61
            case ExpressionKind::BinaryConstant():
62
                assert($expression instanceof  IBinaryConstantExpression);
63
                $this->processBinaryConstantExpression($expression);
64
                break;
65
            case ExpressionKind::BooleanConstant():
66
                assert($expression instanceof  IBooleanConstantExpression);
67
                $this->processBooleanConstantExpression($expression);
68
                break;
69
            case ExpressionKind::Collection():
70
                assert($expression instanceof  ICollectionExpression);
71
                $this->processCollectionExpression($expression);
72
                break;
73
            case ExpressionKind::DateTimeConstant():
74
                assert($expression instanceof  IDateTimeConstantExpression);
75
                $this->processDateTimeConstantExpression($expression);
76
                break;
77
            case ExpressionKind::DateTimeOffsetConstant():
78
                assert($expression instanceof  IDateTimeOffsetConstantExpression);
79
                $this->processDateTimeOffsetConstantExpression($expression);
80
                break;
81
            case ExpressionKind::DecimalConstant():
82
                assert($expression instanceof  IDecimalConstantExpression);
83
                $this->processDecimalConstantExpression($expression);
84
                break;
85
            case ExpressionKind::EntitySetReference():
86
                assert($expression instanceof  IEntitySetReferenceExpression);
87
                $this->processEntitySetReferenceExpression($expression);
88
                break;
89
            case ExpressionKind::EnumMemberReference():
90
                assert($expression instanceof  IEnumMemberReferenceExpression);
91
                $this->processEnumMemberReferenceExpression($expression);
92
                break;
93
            case ExpressionKind::FloatingConstant():
94
                assert($expression instanceof  IFloatingConstantExpression);
95
                $this->processFloatingConstantExpression($expression);
96
                break;
97
            case ExpressionKind::FunctionApplication():
98
                assert($expression instanceof  IApplyExpression);
99
                $this->processFunctionApplicationExpression($expression);
100
                break;
101
            case ExpressionKind::FunctionReference():
102
                assert($expression instanceof  IFunctionReferenceExpression);
103
                $this->processFunctionReferenceExpression($expression);
104
                break;
105
            case ExpressionKind::GuidConstant():
106
                assert($expression instanceof  IGuidConstantExpression);
107
                $this->processGuidConstantExpression($expression);
108
                break;
109
            case ExpressionKind::If():
110
                assert($expression instanceof  IIfExpression);
111
                $this->processIfExpression($expression);
112
                break;
113
            case ExpressionKind::IntegerConstant():
114
                assert($expression instanceof  IIntegerConstantExpression);
115
                $this->processIntegerConstantExpression($expression);
116
                break;
117
            case ExpressionKind::IsType():
118
                assert($expression instanceof  IIsTypeExpression);
119
                $this->processIsTypeExpression($expression);
120
                break;
121
            case ExpressionKind::ParameterReference():
122
                assert($expression instanceof  IParameterReferenceExpression);
123
                $this->processParameterReferenceExpression($expression);
124
                break;
125
            case ExpressionKind::LabeledExpressionReference():
126
                assert($expression instanceof  ILabeledExpressionReferenceExpression);
127
                $this->processLabeledExpressionReferenceExpression($expression);
128
                break;
129
            case ExpressionKind::Labeled():
130
                assert($expression instanceof  ILabeledExpression);
131
                $this->processLabeledExpression($expression);
132
                break;
133
            case ExpressionKind::Null():
134
                assert($expression instanceof  INullExpression);
135
                $this->processNullConstantExpression($expression);
136
                break;
137
            case ExpressionKind::Path():
138
                assert($expression instanceof  IPathExpression);
139
                $this->processPathExpression($expression);
140
                break;
141
            case ExpressionKind::PropertyReference():
142
                assert($expression instanceof  IPropertyReferenceExpression);
143
                $this->processPropertyReferenceExpression($expression);
144
                break;
145
            case ExpressionKind::Record():
146
                assert($expression instanceof  IRecordExpression);
147
                $this->processRecordExpression($expression);
148
                break;
149
            case ExpressionKind::StringConstant():
150
                assert($expression instanceof  IStringConstantExpression);
151
                $this->processStringConstantExpression($expression);
152
                break;
153
            case ExpressionKind::TimeConstant():
154
                assert($expression instanceof  ITimeConstantExpression);
155
                $this->processTimeConstantExpression($expression);
156
                break;
157
            case ExpressionKind::ValueTermReference():
158
                assert($expression instanceof  IPropertyReferenceExpression);
159
                $this->processPropertyReferenceExpression($expression);
160
                break;
161
            case ExpressionKind::None():
162
                $this->processExpression($expression);
163
                break;
164
            default:
165
                throw new InvalidOperationException(
166
                    StringConst::UnknownEnumVal_TermKind($expression->getExpressionKind()->getKey())
167
                );
168
        }
169
    }
170
    /**
171
     * @param IPropertyConstructor[] $constructor
172
     */
173
    public function visitPropertyConstructors(array $constructor): void
174
    {
175
        /** @var EdmModelVisitor $this */
176
        self::visitCollection($constructor, [$this, 'processPropertyConstructor']);
177
    }
178
}
179