Completed
Pull Request — master (#328)
by Nikola
03:49
created

OrPointcut   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 52
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 37.5%

Importance

Changes 0
Metric Value
wmc 10
lcom 1
cbo 3
dl 0
loc 52
ccs 6
cts 16
cp 0.375
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
A matches() 0 5 2
B matchPart() 0 14 7
1
<?php
2
/*
3
 * Go! AOP framework
4
 *
5
 * @copyright Copyright 2013, Lisachenko Alexander <[email protected]>
6
 *
7
 * This source file is subject to the license that is bundled
8
 * with this source code in the file LICENSE.
9
 */
10
11
namespace Go\Aop\Pointcut;
12
13
use Go\Aop\Pointcut;
14
use Go\Aop\PointFilter;
15
use Go\Aop\Support\OrPointFilter;
16
17
/**
18
 * Signature method pointcut checks method signature (modifiers and name) to match it
19
 */
20
class OrPointcut extends AndPointcut
21
{
22
23
    /**
24
     * Signature method matcher constructor
25
     *
26
     * @param Pointcut $first First filter
27
     * @param Pointcut $second Second filter
28
     */
29 2
    public function __construct(Pointcut $first, Pointcut $second)
30
    {
31 2
        $this->first  = $first;
32 2
        $this->second = $second;
33 2
        $this->kind   = $first->getKind() | $second->getKind();
34
35 2
        $this->classFilter = new OrPointFilter($first->getClassFilter(), $second->getClassFilter());
36 2
    }
37
38
    /**
39
     * Performs matching of point of code
40
     *
41
     * @param mixed $point Specific part of code, can be any Reflection class
42
     * @param null|mixed $context Related context, can be class or namespace
43
     * @param null|string|object $instance Invocation instance or string for static calls
44
     * @param null|array $arguments Dynamic arguments for method
45
     *
46
     * @return bool
47
     */
48
    public function matches($point, $context = null, $instance = null, array $arguments = null)
49
    {
50
        return $this->matchPart($this->first, $point, $context, $instance, $arguments)
51
            || $this->matchPart($this->second, $point, $context, $instance, $arguments);
52
    }
53
54
    /**
55
     * @inheritDoc
56
     */
57
    protected function matchPart(Pointcut $pointcut, $point, $context = null, $instance = null, array $arguments = null)
58
    {
59
        $pointcutKind = $pointcut->getKind();
60
        // We need to recheck filter kind one more time, because of OR syntax
61
        switch (true) {
62
            case ($point instanceof \ReflectionMethod && ($pointcutKind & PointFilter::KIND_METHOD)):
63
            case ($point instanceof \ReflectionProperty && ($pointcutKind & PointFilter::KIND_PROPERTY)):
64
            case ($point instanceof \ReflectionClass && ($pointcutKind & PointFilter::KIND_CLASS)):
65
                return parent::matchPart($pointcut, $point, $context, $instance, $arguments);
0 ignored issues
show
Bug introduced by
It seems like $point can also be of type object<ReflectionClass>; however, Go\Aop\Pointcut\AndPointcut::matchPart() does only seem to accept object<ReflectionMethod>...ect<ReflectionProperty>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
66
67
            default:
68
                return false;
69
        }
70
    }
71
}
72