@@ -70,17 +70,24 @@ public function resolveDefinition(Definition $def): void
7070
7171 public function resolveServiceType (string $ name ): ?string
7272 {
73- $ def = $ this ->builder -> getDefinition ($ name );
73+ $ def = $ this ->getDefinition ($ name );
7474 if (!$ def ->getType ()) {
7575 $ this ->resolveDefinition ($ def );
7676 }
7777 return $ def ->getType ();
7878 }
7979
8080
81+ private function resolveReferenceType (Reference $ reference ): ?string
82+ {
83+ return $ reference ->isName ()
84+ ? $ this ->resolveServiceType ($ reference ->getValue ())
85+ : $ reference ->getValue ();
86+ }
87+
88+
8189 public function resolveEntityType ($ entity ): ?string
8290 {
83- $ definitions = $ this ->builder ->getDefinitions ();
8491 $ entity = $ this ->normalizeEntity ($ entity instanceof Statement ? $ entity ->getEntity () : $ entity );
8592
8693 if (is_array ($ entity )) {
@@ -111,11 +118,7 @@ public function resolveEntityType($entity): ?string
111118 return $ type ;
112119
113120 } 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 );
121+ return $ this ->resolveReferenceType ($ entity );
119122
120123 } elseif (is_string ($ entity )) { // class
121124 if (!class_exists ($ entity )) {
@@ -151,7 +154,6 @@ public function completeStatement(Statement $statement, Definition $currentServi
151154
152155 $ entity = $ this ->normalizeEntity ($ statement ->getEntity ());
153156 $ arguments = $ this ->convertReferences ($ statement ->arguments );
154- $ definitions = $ this ->builder ->getDefinitions ();
155157
156158 switch (true ) {
157159 case is_string ($ entity ) && Strings::contains ($ entity , '? ' ): // PHP literal
@@ -177,7 +179,7 @@ public function completeStatement(Statement $statement, Definition $currentServi
177179
178180 case $ entity instanceof Reference:
179181 $ params = [];
180- foreach ($ definitions [ $ entity ->getName ()] ->parameters as $ k => $ v ) {
182+ foreach ($ this -> getDefinition ( $ entity ->getName ()) ->parameters as $ k => $ v ) {
181183 $ params [] = preg_replace ('#\w+\z# ' , '\$$0 ' , (is_int ($ k ) ? $ v : $ k )) . (is_int ($ k ) ? '' : ' = ' . PhpHelpers::dump ($ v ));
182184 }
183185 $ rm = new \ReflectionFunction (eval ('return function( ' . implode (', ' , $ params ) . ') {}; ' ));
@@ -214,7 +216,7 @@ public function completeStatement(Statement $statement, Definition $currentServi
214216 } elseif (
215217 $ type = !$ entity [0 ] instanceof Reference || $ entity [1 ] === 'create '
216218 ? $ this ->resolveEntityType ($ entity [0 ])
217- : $ definitions [ $ entity [0 ]->getName ()]-> getType ( )
219+ : $ this -> resolveServiceType ( $ entity [0 ]->getName ())
218220 ) {
219221 $ rc = new ReflectionClass ($ type );
220222 if ($ rc ->hasMethod ($ entity [1 ])) {
@@ -307,13 +309,16 @@ private function normalizeEntity($entity)
307309
308310
309311 /**
310- * Tries to convert Reference to named and checks service existence.
312+ * Tries to convert Reference to named (or 'self') and checks service existence.
311313 */
312314 public function normalizeReference (Reference $ ref ): Reference
313315 {
314316 $ service = $ ref ->getValue ();
315317 if ($ service === Reference::SELF ) {
316- $ service = $ this ->currentService ->getName ();
318+ if (in_array ($ this ->currentService , $ this ->builder ->getDefinitions (), true )) {
319+ return new Reference ($ this ->currentService ->getName ());
320+ }
321+ return new Reference (Reference::SELF );
317322
318323 } elseif (Strings::contains ($ service , '\\' )) {
319324 try {
@@ -333,6 +338,14 @@ public function normalizeReference(Reference $ref): Reference
333338 }
334339
335340
341+ private function getDefinition ($ name ): Definition
342+ {
343+ return $ name === Reference::SELF
344+ ? $ this ->currentService
345+ : $ this ->builder ->getDefinition ($ name );
346+ }
347+
348+
336349 /**
337350 * Resolves service name by type.
338351 */
@@ -396,8 +409,8 @@ private function convertReferences(array $arguments): array
396409 if (!isset ($ pair [1 ])) { // @service
397410 $ val = new Reference ($ pair [0 ]);
398411 } elseif (preg_match ('#^[A-Z][A-Z0-9_]*\z# ' , $ pair [1 ], $ m )) { // @service::CONSTANT
399- $ ref = $ this ->normalizeReference (new Reference ($ pair [0 ]));
400- $ val = ContainerBuilder::literal ($ this -> builder -> getDefinition ( $ ref -> getName ())-> getType () . ':: ' . $ pair [1 ]);
412+ $ type = $ this ->resolveReferenceType (new Reference ($ pair [0 ]));
413+ $ val = ContainerBuilder::literal ($ type . ':: ' . $ pair [1 ]);
401414 } else { // @service::property
402415 $ val = new Statement ([new Reference ($ pair [0 ]), '$ ' . $ pair [1 ]]);
403416 }
0 commit comments