99use AutoMapper \Generator \Shared \DiscriminatorStatementsGenerator ;
1010use AutoMapper \MapperContext ;
1111use AutoMapper \Metadata \GeneratorMetadata ;
12+ use AutoMapper \Metadata \Provider ;
1213use AutoMapper \Provider \EarlyReturn ;
1314use PhpParser \Comment ;
1415use PhpParser \Node \Arg ;
@@ -420,10 +421,8 @@ private function initializeTargetFromProvider(GeneratorMetadata $metadata): arra
420421 }
421422
422423 $ variableRegistry = $ metadata ->variableRegistry ;
423- $ statements = [];
424- $ callableName = null ;
425424
426- if ($ metadata ->isProviderFromObjectMapper ) {
425+ if ($ metadata ->provider -> isFromObjectMapper ) {
427426 // When the provider is from the ObjectMapper, we call it with 3 arguments
428427 /*
429428 * $result ?? (new ReflectionClass($metadata->mapperMetadata->target))->newInstanceWithoutConstructor();
@@ -449,58 +448,65 @@ private function initializeTargetFromProvider(GeneratorMetadata $metadata): arra
449448 ];
450449 }
451450
452- if (\is_callable ( $ metadata ->provider , false , $ callableName ) ) {
451+ if ($ metadata ->provider -> type === Provider:: TYPE_CALLABLE ) {
453452 /*
454453 * Get result from callable if available
455454 *
456455 * ```php
457- * $result ??= callable(Target::class, $value, $context, $this->getTargetIdentifiers($value));
456+ * callable(Target::class, $value, $context, $this->getTargetIdentifiers($value));
458457 * ```
459458 */
460- $ statements [] = new Stmt \Expression (
461- new Expr \AssignOp \Coalesce (
462- $ variableRegistry ->getResult (),
463- new Expr \FuncCall (new Name ($ callableName ), $ args ),
464- )
465- );
459+ $ providerExpression = new Expr \FuncCall (new Name ($ metadata ->provider ->value ), $ args );
460+ } elseif ($ metadata ->provider ->type === Provider::TYPE_SERVICE_CALLABLE ) {
461+ /*
462+ * Get result from provider if available
463+ *
464+ * ```php
465+ * $this->serviceLocator->get($metadata->provider)($source, $context);
466+ * ```
467+ */
468+ $ providerExpression = new Expr \FuncCall (new Expr \MethodCall (new Expr \PropertyFetch (new Expr \Variable ('this ' ), 'serviceLocator ' ), 'get ' , [
469+ new Arg (new Scalar \String_ ($ metadata ->provider ->value )),
470+ ]), $ args );
466471 } else {
467472 /*
468473 * Get result from provider if available
469474 *
470475 * ```php
471- * $result ??= $ this->providerRegistry->getProvider ($metadata->provider)->provide($source, $context);
476+ * $this->serviceLocator->get ($metadata->provider)->provide($source, $context);
472477 * ```
473478 */
474- $ statements [] = new Stmt \Expression (
475- new Expr \AssignOp \Coalesce (
476- $ variableRegistry ->getResult (),
477- new Expr \MethodCall (new Expr \MethodCall (new Expr \PropertyFetch (new Expr \Variable ('this ' ), 'serviceLocator ' ), 'get ' , [
478- new Arg (new Scalar \String_ ($ metadata ->provider )),
479- ]), 'provide ' , $ args ),
480- )
481- );
479+ $ providerExpression = new Expr \MethodCall (new Expr \MethodCall (new Expr \PropertyFetch (new Expr \Variable ('this ' ), 'serviceLocator ' ), 'get ' , [
480+ new Arg (new Scalar \String_ ($ metadata ->provider ->value )),
481+ ]), 'provide ' , $ args );
482482 }
483483
484484 /*
485- * Return early if the result is an EarlyReturn instance
485+ * $ result ??= provider(...);
486486 *
487487 * if ($result instanceof EarlyReturn) {
488488 * return $result->value;
489489 * }
490490 * ```
491491 */
492- $ statements [] = new Stmt \If_ (
493- new Expr \Instanceof_ ($ variableRegistry ->getResult (), new Name (EarlyReturn::class)),
494- [
495- 'stmts ' => [
496- new Stmt \Return_ (
497- new Expr \PropertyFetch ($ variableRegistry ->getResult (), 'value ' )
498- ),
499- ],
500- ]
501- );
502-
503- return $ statements ;
492+ return [
493+ new Stmt \Expression (
494+ new Expr \AssignOp \Coalesce (
495+ $ variableRegistry ->getResult (),
496+ $ providerExpression ,
497+ )
498+ ),
499+ new Stmt \If_ (
500+ new Expr \Instanceof_ ($ variableRegistry ->getResult (), new Name (EarlyReturn::class)),
501+ [
502+ 'stmts ' => [
503+ new Stmt \Return_ (
504+ new Expr \PropertyFetch ($ variableRegistry ->getResult (), 'value ' )
505+ ),
506+ ],
507+ ]
508+ ),
509+ ];
504510 }
505511
506512 /**
0 commit comments