@@ -68,19 +68,34 @@ public function resolveDefinition(Definition $def): void
6868 }
6969
7070
71+ private function getDefinition ($ name ): Definition
72+ {
73+ return $ name === ContainerBuilder::THIS_SERVICE
74+ ? $ this ->currentService
75+ : $ this ->builder ->getDefinition ($ name );
76+ }
77+
78+
7179 public function resolveServiceType (string $ name ): ?string
7280 {
73- $ def = $ this ->builder -> getDefinition ($ name );
81+ $ def = $ this ->getDefinition ($ name );
7482 if (!$ def ->getType ()) {
7583 $ this ->resolveDefinition ($ def );
7684 }
7785 return $ def ->getType ();
7886 }
7987
8088
89+ private function resolveReferenceType (Reference $ reference ): ?string
90+ {
91+ return $ reference ->isName ()
92+ ? $ this ->resolveServiceType ($ reference ->getValue ())
93+ : $ reference ->getValue ();
94+ }
95+
96+
8197 public function resolveEntityType ($ entity ): ?string
8298 {
83- $ definitions = $ this ->builder ->getDefinitions ();
8499 $ entity = $ this ->normalizeEntity ($ entity instanceof Statement ? $ entity ->getEntity () : $ entity );
85100
86101 if (is_array ($ entity )) {
@@ -111,11 +126,7 @@ public function resolveEntityType($entity): ?string
111126 return $ type ;
112127
113128 } elseif ($ entity instanceof Reference) { // alias or factory
114- if (!$ entity ->isName ()) { // @\Class
115- return $ entity ->getValue ();
116- }
117- $ service = $ entity ->getName ();
118- return $ definitions [$ service ]->getImplement () ?: $ this ->resolveServiceType ($ service );
129+ return $ this ->resolveReferenceType ($ entity );
119130
120131 } elseif (is_string ($ entity )) { // class
121132 if (!class_exists ($ entity )) {
@@ -151,7 +162,6 @@ public function completeStatement(Statement $statement, Definition $currentServi
151162
152163 $ entity = $ this ->normalizeEntity ($ statement ->getEntity ());
153164 $ arguments = $ this ->convertReferences ($ statement ->arguments );
154- $ definitions = $ this ->builder ->getDefinitions ();
155165
156166 switch (true ) {
157167 case is_string ($ entity ) && Strings::contains ($ entity , '? ' ): // PHP literal
@@ -177,7 +187,7 @@ public function completeStatement(Statement $statement, Definition $currentServi
177187
178188 case $ entity instanceof Reference:
179189 $ params = [];
180- foreach ($ definitions [ $ entity ->getName ()] ->parameters as $ k => $ v ) {
190+ foreach ($ this -> getDefinition ( $ entity ->getName ()) ->parameters as $ k => $ v ) {
181191 $ params [] = preg_replace ('#\w+\z# ' , '\$$0 ' , (is_int ($ k ) ? $ v : $ k )) . (is_int ($ k ) ? '' : ' = ' . PhpHelpers::dump ($ v ));
182192 }
183193 $ rm = new \ReflectionFunction (eval ('return function( ' . implode (', ' , $ params ) . ') {}; ' ));
@@ -214,7 +224,7 @@ public function completeStatement(Statement $statement, Definition $currentServi
214224 } elseif (
215225 $ type = !$ entity [0 ] instanceof Reference || $ entity [1 ] === 'create '
216226 ? $ this ->resolveEntityType ($ entity [0 ])
217- : $ definitions [ $ entity [0 ]->getName ()]-> getType ( )
227+ : $ this -> resolveServiceType ( $ entity [0 ]->getName ())
218228 ) {
219229 $ rc = new ReflectionClass ($ type );
220230 if ($ rc ->hasMethod ($ entity [1 ])) {
@@ -319,7 +329,10 @@ public function normalizeReference($arg): ?Reference
319329 return null ;
320330 }
321331 if ($ service === ContainerBuilder::THIS_SERVICE ) {
322- $ service = $ this ->currentService ->getName ();
332+ if (current (array_keys ($ this ->builder ->getDefinitions (), $ this ->currentService , true ))) {
333+ return new Reference ($ this ->currentService ->getName ());
334+ }
335+ return new Reference (ContainerBuilder::THIS_SERVICE );
323336 }
324337 if (Strings::contains ($ service , '\\' )) {
325338 try {
@@ -402,8 +415,8 @@ private function convertReferences(array $arguments): array
402415 if (!isset ($ pair [1 ])) { // @service
403416 $ val = new Reference ($ pair [0 ]);
404417 } elseif (preg_match ('#^[A-Z][A-Z0-9_]*\z# ' , $ pair [1 ], $ m )) { // @service::CONSTANT
405- $ ref = $ this ->normalizeReference (new Reference ($ pair [0 ]));
406- $ val = ContainerBuilder::literal ($ this -> builder -> getDefinition ( $ ref -> getName ())-> getType () . ':: ' . $ pair [1 ]);
418+ $ type = $ this ->resolveReferenceType (new Reference ($ pair [0 ]));
419+ $ val = ContainerBuilder::literal ($ type . ':: ' . $ pair [1 ]);
407420 } else { // @service::property
408421 $ val = new Statement ([new Reference ($ pair [0 ]), '$ ' . $ pair [1 ]]);
409422 }
0 commit comments