@@ -184,14 +184,15 @@ public function resolveType(Nette\DI\Resolver $resolver): void
184184 if (!$ this ->getType ()) {
185185 throw new ServiceCreationException ('Factory and type are missing in definition of service. ' );
186186 }
187- $ this ->setFactory ($ this ->getType (), ( $ factory = $ this ->getFactory ()) ? $ factory ->arguments : []);
187+ $ this ->setFactory ($ this ->getType (), $ this ->factory ->arguments ?? []);
188188
189189 } elseif (!$ this ->getType ()) {
190- $ type = $ resolver ->resolveEntityType ($ this ->getFactory ());
191- if ($ type ) {
192- $ this ->setType ($ type );
193- $ resolver ->addDependency (new \ReflectionClass ($ type ));
190+ $ type = $ resolver ->resolveEntityType ($ this ->factory );
191+ if (!$ type ) {
192+ throw new ServiceCreationException ('Unknown service type, specify it or declare return type of factory. ' );
194193 }
194+ $ this ->setType ($ type );
195+ $ resolver ->addDependency (new \ReflectionClass ($ type ));
195196 }
196197
197198 // auto-disable autowiring for aliases
@@ -203,33 +204,31 @@ public function resolveType(Nette\DI\Resolver $resolver): void
203204
204205 public function complete (Nette \DI \Resolver $ resolver ): void
205206 {
206- $ entity = $ this ->getFactory () ->getEntity ();
207- $ serviceRef = $ entity instanceof Reference ? $ resolver -> normalizeReference ( $ entity ) : null ;
208- $ factory = $ serviceRef && ! $ this -> getFactory ()-> arguments && ! $ this -> getSetup ()
209- ? new Statement ([new Reference (Nette \DI \ContainerBuilder::THIS_CONTAINER ), 'getService ' ], [$ serviceRef ->getValue ()])
210- : $ this -> getFactory ();
207+ $ entity = $ this ->factory ->getEntity ();
208+ if ( $ entity instanceof Reference && ! $ this -> factory -> arguments && ! $ this -> setup ) {
209+ $ ref = $ resolver -> normalizeReference ( $ entity );
210+ $ this -> setFactory ([new Reference (Nette \DI \ContainerBuilder::THIS_CONTAINER ), 'getService ' ], [$ ref ->getValue ()]);
211+ }
211212
212- $ this ->setFactory ( $ resolver ->completeStatement ($ factory) );
213+ $ this ->factory = $ resolver ->completeStatement ($ this -> factory );
213214
214- $ setups = $ this ->getSetup ();
215- foreach ($ setups as &$ setup ) {
215+ foreach ($ this ->setup as &$ setup ) {
216216 if (is_string ($ setup ->getEntity ()) && strpbrk ($ setup ->getEntity (), ':@? \\' ) === false ) { // auto-prepend @self
217217 $ setup = new Statement ([new Reference (Reference::SELF ), $ setup ->getEntity ()], $ setup ->arguments );
218218 }
219219 $ setup = $ resolver ->completeStatement ($ setup , true );
220220 }
221- $ this ->setSetup ($ setups );
222221 }
223222
224223
225224 public function generateMethod (Nette \PhpGenerator \Method $ method , Nette \DI \PhpGenerator $ generator ): void
226225 {
227- $ entity = $ this ->getFactory () ->getEntity ();
228- $ code = '$service = ' . $ generator ->formatStatement ($ this ->getFactory () ) . "; \n" ;
226+ $ entity = $ this ->factory ->getEntity ();
227+ $ code = '$service = ' . $ generator ->formatStatement ($ this ->factory ) . "; \n" ;
229228 $ type = $ this ->getType ();
230229
231230 if (
232- $ this ->getSetup ()
231+ $ this ->setup
233232 && $ type !== $ entity
234233 && !(is_array ($ entity ) && $ entity [0 ] instanceof Reference && $ entity [0 ]->getValue () === Nette \DI \ContainerBuilder::THIS_CONTAINER )
235234 && !(is_string ($ entity ) && preg_match ('#^[\w \\\\]+\z# ' , $ entity ) && is_subclass_of ($ entity , $ type ))
@@ -240,7 +239,7 @@ public function generateMethod(Nette\PhpGenerator\Method $method, Nette\DI\PhpGe
240239 );
241240 }
242241
243- foreach ($ this ->getSetup () as $ setup ) {
242+ foreach ($ this ->setup as $ setup ) {
244243 $ code .= $ generator ->formatStatement ($ setup ) . "; \n" ;
245244 }
246245
0 commit comments