Skip to content

Commit

Permalink
perf: Remove type guesser from TypeResolver.
Browse files Browse the repository at this point in the history
  • Loading branch information
priyadi committed Jan 17, 2024
1 parent f4dc3d5 commit 1aa32bf
Show file tree
Hide file tree
Showing 10 changed files with 64 additions and 54 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
* perf: Use flyweight pattern for `TypeFactory`
* perf(`TypeCheck`): Improve `isVariableInstanceOf`.
* perf(`ScalarToScalarTransformer`): Optimize.
* perf: Remove type guesser from `TypeResolver`.

## 0.5.14

Expand Down
1 change: 0 additions & 1 deletion config/services.php
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,6 @@
->set(ObjectToObjectTransformer::class)
->args([
'$propertyAccessor' => service('rekalogika.mapper.property_access_lite'),
'$typeResolver' => service('rekalogika.mapper.type_resolver'),
'$objectMappingResolver' => service('rekalogika.mapper.object_mapping_resolver'),
])
->tag('rekalogika.mapper.transformer', ['priority' => -900]);
Expand Down
5 changes: 3 additions & 2 deletions src/MainTransformer/MainTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
use Rekalogika\Mapper\TransformerRegistry\TransformerRegistryInterface;
use Rekalogika\Mapper\TypeResolver\TypeResolverInterface;
use Rekalogika\Mapper\Util\TypeCheck;
use Rekalogika\Mapper\Util\TypeGuesser;
use Symfony\Component\PropertyInfo\Type;

class MainTransformer implements MainTransformerInterface
Expand Down Expand Up @@ -86,7 +87,7 @@ public function transform(
}
} else {
if (count($targetTypes) === 0) {
$targetTypes = [$this->typeResolver->guessTypeFromVariable($target)];
$targetTypes = [TypeGuesser::guessTypeFromVariable($target)];
}
}

Expand Down Expand Up @@ -119,7 +120,7 @@ public function transform(

// guess the source type

$sourceTypes = [$this->typeResolver->guessTypeFromVariable($source)];
$sourceTypes = [TypeGuesser::guessTypeFromVariable($source)];

// gets simple target types from the provided target type

Expand Down
1 change: 0 additions & 1 deletion src/MapperFactory/MapperFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,6 @@ protected function getObjectToObjectTransformer(): TransformerInterface
if (null === $this->objectToObjectTransformer) {
$this->objectToObjectTransformer = new ObjectToObjectTransformer(
propertyAccessor: $this->getPropertyAccessor(),
typeResolver: $this->getTypeResolver(),
objectMappingResolver: $this->getObjectMappingResolver(),
);
}
Expand Down
5 changes: 2 additions & 3 deletions src/Transformer/ObjectToObjectTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@
use Rekalogika\Mapper\Transformer\Exception\UnableToWriteException;
use Rekalogika\Mapper\Transformer\ObjectMappingResolver\Contracts\ObjectMapping;
use Rekalogika\Mapper\Transformer\ObjectMappingResolver\Contracts\ObjectMappingResolverInterface;
use Rekalogika\Mapper\TypeResolver\TypeResolverInterface;
use Rekalogika\Mapper\Util\TypeCheck;
use Rekalogika\Mapper\Util\TypeFactory;
use Rekalogika\Mapper\Util\TypeGuesser;
use Symfony\Component\PropertyAccess\Exception\AccessException;
use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException;
use Symfony\Component\PropertyAccess\Exception\UnexpectedTypeException;
Expand All @@ -45,7 +45,6 @@ final class ObjectToObjectTransformer implements TransformerInterface, MainTrans

public function __construct(
private PropertyAccessorInterface $propertyAccessor,
private TypeResolverInterface $typeResolver,
private ObjectMappingResolverInterface $objectMappingResolver,
) {
}
Expand All @@ -67,7 +66,7 @@ public function transform(
throw new InvalidArgumentException(sprintf('The source must be an object, "%s" given.', get_debug_type($source)), context: $context);
}

$sourceType = $this->typeResolver->guessTypeFromVariable($source);
$sourceType = TypeGuesser::guessTypeFromVariable($source);
$sourceClass = $sourceType->getClassName();

if (null === $sourceClass || !\class_exists($sourceClass)) {
Expand Down
7 changes: 0 additions & 7 deletions src/TypeResolver/CachingTypeResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,6 @@ public function __construct(
$this->isSimpleTypeCache = new \WeakMap();
}

// cheap. so we don't cache

public function guessTypeFromVariable(mixed $variable): Type
{
return $this->decorated->guessTypeFromVariable($variable);
}

// can be expensive in a loop. we cache using a weakmap

/**
Expand Down
34 changes: 0 additions & 34 deletions src/TypeResolver/TypeResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,46 +13,12 @@

namespace Rekalogika\Mapper\TypeResolver;

use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Rekalogika\Mapper\Transformer\Contracts\MixedType;
use Rekalogika\Mapper\Util\TypeFactory;
use Rekalogika\Mapper\Util\TypeUtil;
use Symfony\Component\PropertyInfo\Type;

class TypeResolver implements TypeResolverInterface
{
public function guessTypeFromVariable(mixed $variable): Type
{
$type = get_debug_type($variable);

if ($type === 'array') {
return TypeFactory::array();
} elseif ($type === 'bool') {
return TypeFactory::bool();
} elseif ($type === 'int') {
return TypeFactory::int();
} elseif ($type === 'float') {
return TypeFactory::float();
} elseif ($type === 'string') {
return TypeFactory::string();
} elseif ($type === 'null') {
return TypeFactory::null();
}

if (class_exists($type) || interface_exists($type) || \enum_exists($type)) {
return TypeFactory::objectOfClass($type);
}

if (\str_starts_with($type, 'resource')) {
return TypeFactory::resource();
}

throw new InvalidArgumentException(sprintf(
'Cannot determine type of variable "%s"',
get_debug_type($variable),
));
}

public function getTypeString(Type|MixedType $type): string
{
return TypeUtil::getTypeString($type);
Expand Down
5 changes: 0 additions & 5 deletions src/TypeResolver/TypeResolverInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,6 @@

interface TypeResolverInterface
{
/**
* Guesses the type of the given variable.
*/
public function guessTypeFromVariable(mixed $variable): Type;

/**
* Gets the string representation of a Type.
*
Expand Down
56 changes: 56 additions & 0 deletions src/Util/TypeGuesser.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php

declare(strict_types=1);

/*
* This file is part of rekalogika/mapper package.
*
* (c) Priyadi Iman Nurcahyo <https://rekalogika.dev>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Util;

use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Symfony\Component\PropertyInfo\Type;

class TypeGuesser
{
private function __construct()
{
}

public static function guessTypeFromVariable(mixed $variable): Type
{
$type = get_debug_type($variable);

if ($type === 'array') {
return TypeFactory::array();
} elseif ($type === 'bool') {
return TypeFactory::bool();
} elseif ($type === 'int') {
return TypeFactory::int();
} elseif ($type === 'float') {
return TypeFactory::float();
} elseif ($type === 'string') {
return TypeFactory::string();
} elseif ($type === 'null') {
return TypeFactory::null();
}

if (class_exists($type) || interface_exists($type) || \enum_exists($type)) {
return TypeFactory::objectOfClass($type);
}

if (\str_starts_with($type, 'resource')) {
return TypeFactory::resource();
}

throw new InvalidArgumentException(sprintf(
'Cannot determine type of variable "%s"',
get_debug_type($variable),
));
}
}
3 changes: 2 additions & 1 deletion tests/UnitTest/Util/TypeUtilTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use PHPUnit\Framework\TestCase;
use Rekalogika\Mapper\TypeResolver\TypeResolver;
use Rekalogika\Mapper\Util\TypeFactory;
use Rekalogika\Mapper\Util\TypeGuesser;
use Rekalogika\Mapper\Util\TypeUtil;
use Symfony\Component\PropertyInfo\Type;

Expand All @@ -30,7 +31,7 @@ public function testTypeGuess(
?string $className = null
): void {
$typeResolver = new TypeResolver();
$type = $typeResolver->guessTypeFromVariable($object);
$type = TypeGuesser::guessTypeFromVariable($object);

$this->assertSame($builtInType, $type->getBuiltinType());
$this->assertSame($className, $type->getClassName());
Expand Down

0 comments on commit 1aa32bf

Please sign in to comment.