-
-
Notifications
You must be signed in to change notification settings - Fork 336
/
UnwrapableAnnotationAnalyzer.php
78 lines (64 loc) · 2.48 KB
/
UnwrapableAnnotationAnalyzer.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
declare(strict_types=1);
namespace Rector\PhpAttribute;
use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
use Rector\Core\Php\PhpVersionProvider;
use Rector\Core\ValueObject\PhpVersionFeature;
use Rector\Php80\ValueObject\AnnotationToAttribute;
final class UnwrapableAnnotationAnalyzer
{
/**
* List of annotation classes that can be un-wrapped
* @see https://github.com/doctrine/orm/commit/b6b3c974361d7042e4b7d868fb34daca76bb2a48 - repeatable attributes
* @var string[]
*/
private const UNWRAPEABLE_ANNOTATION_CLASSES = [
'Doctrine\ORM\Mapping\UniqueConstraint',
'Doctrine\ORM\Mapping\JoinColumn',
'Doctrine\ORM\Mapping\Index',
'Doctrine\ORM\Mapping\AttributeOverride',
];
/**
* @var AnnotationToAttribute[]
*/
private array $annotationsToAttributes = [];
/**
* @param AnnotationToAttribute[] $annotationsToAttributes
*/
public function configure(array $annotationsToAttributes): void
{
$this->annotationsToAttributes = $annotationsToAttributes;
}
/**
* @param DoctrineAnnotationTagValueNode[] $doctrineAnnotationTagValueNodes
*/
public function areUnwrappable(array $doctrineAnnotationTagValueNodes): bool
{
foreach ($doctrineAnnotationTagValueNodes as $doctrineAnnotationTagValueNode) {
$annotationClassName = $doctrineAnnotationTagValueNode->identifierTypeNode->getAttribute(
PhpDocAttributeKey::RESOLVED_CLASS
);
$nestedAnnotationToAttribute = $this->matchAnnotationToAttribute($doctrineAnnotationTagValueNode);
// the nested annotation should be convertable
if (! $nestedAnnotationToAttribute instanceof AnnotationToAttribute) {
return false;
}
if (! in_array($annotationClassName, self::UNWRAPEABLE_ANNOTATION_CLASSES, true)) {
return false;
}
}
return true;
}
private function matchAnnotationToAttribute(
DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode
): AnnotationToAttribute|null {
foreach ($this->annotationsToAttributes as $annotationToAttribute) {
if (! $doctrineAnnotationTagValueNode->hasClassName($annotationToAttribute->getTag())) {
continue;
}
return $annotationToAttribute;
}
return null;
}
}