From ae1d4a1b4632ff3db546377f8f9c344a0fc2634d Mon Sep 17 00:00:00 2001 From: Priyadi Iman Nurcahyo <1102197+priyadi@users.noreply.github.com> Date: Thu, 11 Jan 2024 13:24:22 +0700 Subject: [PATCH] Move potentially expensive TypeUtil call to TypeResolver --- src/MainTransformer.php | 3 +-- src/ObjectCache/ObjectCache.php | 11 +++++------ src/TypeResolver/TypeResolver.php | 18 +++++++++++++++++- src/TypeResolver/TypeResolverInterface.php | 16 +++++++++++++++- src/Util/TypeUtil.php | 3 +++ 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/MainTransformer.php b/src/MainTransformer.php index d8471fe..e74f215 100644 --- a/src/MainTransformer.php +++ b/src/MainTransformer.php @@ -25,7 +25,6 @@ use Rekalogika\Mapper\ObjectCache\ObjectCache; use Rekalogika\Mapper\ObjectCache\ObjectCacheFactoryInterface; use Rekalogika\Mapper\TypeResolver\TypeResolverInterface; -use Rekalogika\Mapper\Util\TypeUtil; use Symfony\Component\PropertyInfo\Type; class MainTransformer implements MainTransformerInterface @@ -87,7 +86,7 @@ public function transform( // init vars - $targetType = TypeUtil::getSimpleTypes($targetType); + $targetType = $this->typeResolver->getSimpleTypes($targetType); $sourceType = $this->typeResolver->guessTypeFromVariable($source); foreach ($targetType as $singleTargetType) { diff --git a/src/ObjectCache/ObjectCache.php b/src/ObjectCache/ObjectCache.php index c8e0b3f..3cc7e86 100644 --- a/src/ObjectCache/ObjectCache.php +++ b/src/ObjectCache/ObjectCache.php @@ -17,7 +17,6 @@ use Rekalogika\Mapper\Exception\CircularReferenceException; use Rekalogika\Mapper\Exception\LogicException; use Rekalogika\Mapper\TypeResolver\TypeResolverInterface; -use Rekalogika\Mapper\Util\TypeUtil; use Symfony\Component\PropertyInfo\Type; final class ObjectCache @@ -64,7 +63,7 @@ public function preCache(mixed $source, Type $targetType): void return; } - if (!TypeUtil::isSimpleType($targetType)) { + if (!$this->typeResolver->isSimpleType($targetType)) { throw new LogicException('Target type must be simple type'); } @@ -85,7 +84,7 @@ private function isPreCached(mixed $source, Type $targetType): bool return false; } - if (!TypeUtil::isSimpleType($targetType)) { + if (!$this->typeResolver->isSimpleType($targetType)) { throw new LogicException('Target type must be simple type'); } @@ -100,7 +99,7 @@ private function removePrecache(mixed $source, Type $targetType): void return; } - if (!TypeUtil::isSimpleType($targetType)) { + if (!$this->typeResolver->isSimpleType($targetType)) { throw new LogicException('Target type must be simple type'); } @@ -121,7 +120,7 @@ public function containsTarget(mixed $source, Type $targetType): bool return false; } - if (!TypeUtil::isSimpleType($targetType)) { + if (!$this->typeResolver->isSimpleType($targetType)) { throw new LogicException('Target type must be simple type'); } @@ -144,7 +143,7 @@ public function getTarget(mixed $source, Type $targetType): mixed throw new CachedTargetObjectNotFoundException(); } - if (!TypeUtil::isSimpleType($targetType)) { + if (!$this->typeResolver->isSimpleType($targetType)) { throw new LogicException('Target type must be simple type'); } diff --git a/src/TypeResolver/TypeResolver.php b/src/TypeResolver/TypeResolver.php index 3015094..b691fde 100644 --- a/src/TypeResolver/TypeResolver.php +++ b/src/TypeResolver/TypeResolver.php @@ -21,7 +21,7 @@ class TypeResolver implements TypeResolverInterface { - public static function guessTypeFromVariable(mixed $variable): Type + public function guessTypeFromVariable(mixed $variable): Type { if (is_object($variable)) { return TypeFactory::objectOfClass($variable::class); @@ -66,6 +66,22 @@ public function getTypeString(Type|MixedType $type): string return TypeUtil::getTypeString($type); } + public function isSimpleType(Type $type): bool + { + return TypeUtil::isSimpleType($type); + } + + /** + * Gets all the possible simple types from a Type + * + * @param Type|array $type + * @return array + */ + public function getSimpleTypes(Type|array $type): array + { + return TypeUtil::getSimpleTypes($type); + } + public function getApplicableTypeStrings(array|Type|MixedType $type): array { if ($type instanceof MixedType) { diff --git a/src/TypeResolver/TypeResolverInterface.php b/src/TypeResolver/TypeResolverInterface.php index 9013dfc..1685ab4 100644 --- a/src/TypeResolver/TypeResolverInterface.php +++ b/src/TypeResolver/TypeResolverInterface.php @@ -21,10 +21,24 @@ interface TypeResolverInterface /** * Guesses the type of the given variable. */ - public static function guessTypeFromVariable(mixed $variable): Type; + public function guessTypeFromVariable(mixed $variable): Type; public function getTypeString(Type|MixedType $type): string; + /** + * Gets all the possible simple types from a Type + * + * @param Type|array $type + * @return array + */ + public function getSimpleTypes(Type|array $type): array; + + /** + * Simple Type is a type that is not nullable, and does not have more + * than one key type or value type. + */ + public function isSimpleType(Type $type): bool; + /** * Example: If the variable type is * 'IteratorAggregate>', then this method diff --git a/src/Util/TypeUtil.php b/src/Util/TypeUtil.php index 88ddfab..da0603f 100644 --- a/src/Util/TypeUtil.php +++ b/src/Util/TypeUtil.php @@ -15,6 +15,7 @@ use DaveLiddament\PhpLanguageExtensions\Friend; use DaveLiddament\PhpLanguageExtensions\NamespaceVisibility; +use Rekalogika\Mapper\Contracts\TypeMapping; use Rekalogika\Mapper\Exception\InvalidArgumentException; use Rekalogika\Mapper\Exception\MapperReturnsUnexpectedValueException; use Rekalogika\Mapper\Model\MixedType; @@ -33,6 +34,7 @@ private function __construct() * Simple Type is a type that is not nullable, and does not have more * than one key type or value type. */ + #[Friend(TypeResolver::class, TypeUtilTest::class)] public static function isSimpleType(Type $type): bool { if ($type->isNullable()) { @@ -69,6 +71,7 @@ public static function isSimpleType(Type $type): bool * @param Type|array $type * @return array */ + #[Friend(TypeMapping::class, TypeResolver::class)] public static function getSimpleTypes(Type|array $type, bool $withParents = false): array { if (!is_array($type)) {