@@ -27,19 +27,12 @@ class ResolveInstanceofConditionalsPass implements CompilerPassInterface
27
27
*/
28
28
public function process (ContainerBuilder $ container )
29
29
{
30
- $ didProcess = false ;
31
30
foreach ($ container ->getDefinitions () as $ id => $ definition ) {
32
31
if ($ definition instanceof ChildDefinition) {
33
32
// don't apply "instanceof" to children: it will be applied to their parent
34
33
continue ;
35
34
}
36
- if ($ definition !== $ processedDefinition = $ this ->processDefinition ($ container , $ id , $ definition )) {
37
- $ didProcess = true ;
38
- $ container ->setDefinition ($ id , $ processedDefinition );
39
- }
40
- }
41
- if ($ didProcess ) {
42
- $ container ->register ('abstract. ' .__CLASS__ , '' )->setAbstract (true );
35
+ $ container ->setDefinition ($ id , $ this ->processDefinition ($ container , $ id , $ definition ));
43
36
}
44
37
}
45
38
@@ -53,37 +46,56 @@ private function processDefinition(ContainerBuilder $container, $id, Definition
53
46
}
54
47
55
48
$ definition ->setInstanceofConditionals (array ());
56
- $ instanceofParent = null ;
57
- $ parent = 'abstract. ' .__CLASS__ ;
58
- $ shared = null ;
49
+ $ parent = $ shared = null ;
50
+ $ instanceofTags = array ();
59
51
60
52
foreach ($ instanceofConditionals as $ interface => $ instanceofDef ) {
61
53
if ($ interface !== $ class && (!$ container ->getReflectionClass ($ interface ) || !$ container ->getReflectionClass ($ class ))) {
62
54
continue ;
63
55
}
64
56
if ($ interface === $ class || is_subclass_of ($ class , $ interface )) {
65
- $ instanceofParent = clone $ instanceofDef ;
66
- $ instanceofParent ->setAbstract (true )->setInheritTags (true )->setParent ($ parent );
57
+ $ instanceofDef = clone $ instanceofDef ;
58
+ $ instanceofDef ->setAbstract (true )->setInheritTags (false )->setParent ($ parent ?: ' abstract.instanceof. ' . $ id );
67
59
$ parent = 'instanceof. ' .$ interface .'. ' .$ id ;
68
- $ container ->setDefinition ($ parent , $ instanceofParent );
60
+ $ container ->setDefinition ($ parent , $ instanceofDef );
61
+ $ instanceofTags [] = $ instanceofDef ->getTags ();
62
+ $ instanceofDef ->setTags (array ());
69
63
70
- if (isset ($ instanceofParent ->getChanges ()['shared ' ])) {
71
- $ shared = $ instanceofParent ->isShared ();
64
+ if (isset ($ instanceofDef ->getChanges ()['shared ' ])) {
65
+ $ shared = $ instanceofDef ->isShared ();
72
66
}
73
67
}
74
68
}
75
69
76
- if ($ instanceofParent ) {
70
+ if ($ parent ) {
71
+ $ abstract = $ container ->setDefinition ('abstract.instanceof. ' .$ id , $ definition );
72
+
77
73
// cast Definition to ChildDefinition
78
74
$ definition = serialize ($ definition );
79
75
$ definition = substr_replace ($ definition , '53 ' , 2 , 2 );
80
76
$ definition = substr_replace ($ definition , 'Child ' , 44 , 0 );
81
77
$ definition = unserialize ($ definition );
82
- $ definition ->setInheritTags ( true )-> setParent ($ parent );
78
+ $ definition ->setParent ($ parent );
83
79
84
80
if (null !== $ shared && !isset ($ definition ->getChanges ()['shared ' ])) {
85
81
$ definition ->setShared ($ shared );
86
82
}
83
+
84
+ $ i = count ($ instanceofTags );
85
+ while (0 <= --$ i ) {
86
+ foreach ($ instanceofTags [$ i ] as $ k => $ v ) {
87
+ foreach ($ v as $ v ) {
88
+ $ definition ->addTag ($ k , $ v );
89
+ }
90
+ }
91
+ }
92
+
93
+ // reset fields with "merge" behavior
94
+ $ abstract
95
+ ->setArguments (array ())
96
+ ->setMethodCalls (array ())
97
+ ->setTags (array ())
98
+ ->setAbstract (true );
87
99
}
88
100
89
101
return $ definition ;
0 commit comments