Passed
Push — develop ( 51016a...a9d0b3 )
by Mathieu
02:23
created

AnnotationReader   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 89
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 11
eloc 27
c 1
b 0
f 0
dl 0
loc 89
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A getPropertyAnnotations() 0 5 1
A getMethodAnnotations() 0 5 1
A getAttributeAnnotations() 0 17 4
A getPropertyAnnotation() 0 9 2
A getClassAnnotations() 0 5 1
A getClassAnnotation() 0 7 2
1
<?php
2
3
namespace Neimheadh\SonataAnnotationBundle;
4
5
use Doctrine\Common\Annotations\AnnotationReader as DoctrineAnnotationReader;
6
use ReflectionClass;
7
use ReflectionMethod;
8
use ReflectionProperty;
9
10
/**
11
 * Annotation reading trait.
12
 */
13
class AnnotationReader extends DoctrineAnnotationReader
14
{
15
16
    /**
17
     * {@inheritDoc}
18
     */
19
    public function getClassAnnotations(ReflectionClass $class): array
20
    {
21
        return array_merge(
22
            $this->getAttributeAnnotations($class),
23
            parent::getClassAnnotations($class)
24
        );
25
    }
26
27
    /**
28
     * {@inheritDoc}
29
     */
30
    public function getClassAnnotation(ReflectionClass $class, $annotationName)
31
    {
32
        return current(
33
            $this->getAttributeAnnotations($class, $annotationName)
34
        ) ?: parent::getClassAnnotation(
35
            $class,
36
            $annotationName
37
        );
38
    }
39
40
    /**
41
     * {@inheritDoc}
42
     */
43
    public function getMethodAnnotations(ReflectionMethod $method): array
44
    {
45
        return array_merge(
46
            $this->getAttributeAnnotations($method),
47
            parent::getMethodAnnotations($method)
48
        );
49
    }
50
51
    /**
52
     * {@inheritDoc}
53
     */
54
    public function getPropertyAnnotations(ReflectionProperty $property): array
55
    {
56
        return array_merge(
57
            $this->getAttributeAnnotations($property),
58
            parent::getPropertyAnnotations($property)
59
        );
60
    }
61
62
    /**
63
     * {@inheritDoc}
64
     */
65
    public function getPropertyAnnotation(
66
        ReflectionProperty $property,
67
        $annotationName
68
    ): ?object {
69
        return current(
70
            $this->getAttributeAnnotations($property, $annotationName)
71
        ) ?: parent::getPropertyAnnotation(
72
            $property,
73
            $annotationName
74
        );
75
    }
76
77
    /**
78
     * Get attribute annotations.
79
     *
80
     * @param object  $reflection Reflection element.
81
     * @param ?string $annotation Annotation class.
82
     *
83
     * @return array
84
     */
85
    private function getAttributeAnnotations(
86
        object $reflection,
87
        ?string $annotation = null
88
    ): array {
89
        $annotations = [];
90
91
        if (method_exists($reflection, 'getAttributes')) {
92
            $arguments = $reflection->getAttributes($annotation);
93
94
            foreach ($arguments as $argument) {
95
                if (method_exists($argument, 'newInstance')) {
96
                    $annotations[] = $argument->newInstance();
97
                }
98
            }
99
        }
100
101
        return $annotations;
102
    }
103
104
}