update lock clucknut
All checks were successful
All checks were successful
This commit is contained in:
@@ -10,8 +10,10 @@
|
||||
|
||||
use function array_filter;
|
||||
use function array_map;
|
||||
use function assert;
|
||||
use function count;
|
||||
use function is_a;
|
||||
use function reset;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
@@ -63,10 +65,26 @@ public function has(string $className): bool
|
||||
public function filter(callable $callback): self
|
||||
{
|
||||
return new self(
|
||||
...array_filter($this->attributes, $callback)
|
||||
...array_filter($this->attributes, $callback),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param class-string $className
|
||||
*/
|
||||
public function firstOf(string $className): AttributeDefinition
|
||||
{
|
||||
assert($this->has($className));
|
||||
|
||||
$filtered = array_filter(
|
||||
$this->attributes,
|
||||
static fn (AttributeDefinition $attribute) => is_a($attribute->class->type->className(), $className, true),
|
||||
);
|
||||
|
||||
/** @var AttributeDefinition */
|
||||
return reset($filtered);
|
||||
}
|
||||
|
||||
public function merge(self $other): self
|
||||
{
|
||||
$clone = clone $this;
|
||||
|
||||
@@ -7,16 +7,16 @@
|
||||
use CuyZ\Valinor\Type\ObjectType;
|
||||
|
||||
/** @internal */
|
||||
final class ClassDefinition
|
||||
final readonly class ClassDefinition
|
||||
{
|
||||
public function __construct(
|
||||
/** @var class-string */
|
||||
public readonly string $name,
|
||||
public readonly ObjectType $type,
|
||||
public readonly Attributes $attributes,
|
||||
public readonly Properties $properties,
|
||||
public readonly Methods $methods,
|
||||
public readonly bool $isFinal,
|
||||
public readonly bool $isAbstract,
|
||||
public string $name,
|
||||
public ObjectType $type,
|
||||
public Attributes $attributes,
|
||||
public Properties $properties,
|
||||
public Methods $methods,
|
||||
public bool $isFinal,
|
||||
public bool $isAbstract,
|
||||
) {}
|
||||
}
|
||||
|
||||
@@ -9,22 +9,22 @@
|
||||
use CuyZ\Valinor\Utility\TypeHelper;
|
||||
|
||||
/** @internal */
|
||||
final class FunctionDefinition
|
||||
final readonly class FunctionDefinition
|
||||
{
|
||||
public function __construct(
|
||||
/** @var non-empty-string */
|
||||
public readonly string $name,
|
||||
public string $name,
|
||||
/** @var non-empty-string */
|
||||
public readonly string $signature,
|
||||
public readonly Attributes $attributes,
|
||||
public string $signature,
|
||||
public Attributes $attributes,
|
||||
/** @var non-empty-string|null */
|
||||
public readonly ?string $fileName,
|
||||
public ?string $fileName,
|
||||
/** @var class-string|null */
|
||||
public readonly ?string $class,
|
||||
public readonly bool $isStatic,
|
||||
public readonly bool $isClosure,
|
||||
public readonly Parameters $parameters,
|
||||
public readonly Type $returnType,
|
||||
public ?string $class,
|
||||
public bool $isStatic,
|
||||
public bool $isClosure,
|
||||
public Parameters $parameters,
|
||||
public Type $returnType,
|
||||
) {}
|
||||
|
||||
public function forCallable(callable $callable): self
|
||||
|
||||
@@ -5,16 +5,11 @@
|
||||
namespace CuyZ\Valinor\Definition;
|
||||
|
||||
/** @internal */
|
||||
final class FunctionObject
|
||||
final readonly class FunctionObject
|
||||
{
|
||||
public readonly FunctionDefinition $definition;
|
||||
|
||||
/** @var callable */
|
||||
public readonly mixed $callback;
|
||||
|
||||
public function __construct(FunctionDefinition $definition, callable $callback)
|
||||
{
|
||||
$this->definition = $definition;
|
||||
$this->callback = $callback;
|
||||
}
|
||||
public function __construct(
|
||||
public FunctionDefinition $definition,
|
||||
/** @var callable */
|
||||
public mixed $callback,
|
||||
) {}
|
||||
}
|
||||
|
||||
@@ -7,17 +7,17 @@
|
||||
use CuyZ\Valinor\Type\Type;
|
||||
|
||||
/** @internal */
|
||||
final class MethodDefinition
|
||||
final readonly class MethodDefinition
|
||||
{
|
||||
public function __construct(
|
||||
/** @var non-empty-string */
|
||||
public readonly string $name,
|
||||
public string $name,
|
||||
/** @var non-empty-string */
|
||||
public readonly string $signature,
|
||||
public readonly Attributes $attributes,
|
||||
public readonly Parameters $parameters,
|
||||
public readonly bool $isStatic,
|
||||
public readonly bool $isPublic,
|
||||
public readonly Type $returnType
|
||||
public string $signature,
|
||||
public Attributes $attributes,
|
||||
public Parameters $parameters,
|
||||
public bool $isStatic,
|
||||
public bool $isPublic,
|
||||
public Type $returnType
|
||||
) {}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
use IteratorAggregate;
|
||||
use Traversable;
|
||||
|
||||
use function count;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
|
||||
@@ -8,20 +8,22 @@
|
||||
use CuyZ\Valinor\Type\Types\Generics;
|
||||
use CuyZ\Valinor\Utility\TypeHelper;
|
||||
|
||||
use function assert;
|
||||
|
||||
/** @internal */
|
||||
final class ParameterDefinition
|
||||
final readonly class ParameterDefinition
|
||||
{
|
||||
public function __construct(
|
||||
/** @var non-empty-string */
|
||||
public readonly string $name,
|
||||
public string $name,
|
||||
/** @var non-empty-string */
|
||||
public readonly string $signature,
|
||||
public readonly Type $type,
|
||||
public readonly Type $nativeType,
|
||||
public readonly bool $isOptional,
|
||||
public readonly bool $isVariadic,
|
||||
public readonly mixed $defaultValue,
|
||||
public readonly Attributes $attributes
|
||||
public string $signature,
|
||||
public Type $type,
|
||||
public Type $nativeType,
|
||||
public bool $isOptional,
|
||||
public bool $isVariadic,
|
||||
public mixed $defaultValue,
|
||||
public Attributes $attributes
|
||||
) {}
|
||||
|
||||
public function forCallable(callable $callable): self
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
use function array_map;
|
||||
use function array_values;
|
||||
use function count;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
use IteratorAggregate;
|
||||
use Traversable;
|
||||
|
||||
use function count;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
|
||||
@@ -7,18 +7,18 @@
|
||||
use CuyZ\Valinor\Type\Type;
|
||||
|
||||
/** @internal */
|
||||
final class PropertyDefinition
|
||||
final readonly class PropertyDefinition
|
||||
{
|
||||
public function __construct(
|
||||
/** @var non-empty-string */
|
||||
public readonly string $name,
|
||||
public string $name,
|
||||
/** @var non-empty-string */
|
||||
public readonly string $signature,
|
||||
public readonly Type $type,
|
||||
public readonly Type $nativeType,
|
||||
public readonly bool $hasDefaultValue,
|
||||
public readonly mixed $defaultValue,
|
||||
public readonly bool $isPublic,
|
||||
public readonly Attributes $attributes
|
||||
public string $signature,
|
||||
public Type $type,
|
||||
public Type $nativeType,
|
||||
public bool $hasDefaultValue,
|
||||
public mixed $defaultValue,
|
||||
public bool $isPublic,
|
||||
public Attributes $attributes
|
||||
) {}
|
||||
}
|
||||
|
||||
@@ -6,13 +6,11 @@
|
||||
|
||||
use CuyZ\Valinor\Cache\Cache;
|
||||
use CuyZ\Valinor\Cache\CacheEntry;
|
||||
use CuyZ\Valinor\Cache\TypeFilesWatcher;
|
||||
use CuyZ\Valinor\Definition\ClassDefinition;
|
||||
use CuyZ\Valinor\Definition\Repository\Cache\Compiler\ClassDefinitionCompiler;
|
||||
use CuyZ\Valinor\Definition\Repository\ClassDefinitionRepository;
|
||||
use CuyZ\Valinor\Type\ObjectType;
|
||||
use CuyZ\Valinor\Utility\Reflection\Reflection;
|
||||
|
||||
use function is_string;
|
||||
|
||||
/** @internal */
|
||||
final class CompiledClassDefinitionRepository implements ClassDefinitionRepository
|
||||
@@ -21,6 +19,7 @@ public function __construct(
|
||||
private ClassDefinitionRepository $delegate,
|
||||
/** @var Cache<ClassDefinition> */
|
||||
private Cache $cache,
|
||||
private TypeFilesWatcher $filesWatcher,
|
||||
private ClassDefinitionCompiler $compiler,
|
||||
) {}
|
||||
|
||||
@@ -38,31 +37,11 @@ public function for(ObjectType $type): ClassDefinition
|
||||
$class = $this->delegate->for($type);
|
||||
|
||||
$code = 'fn () => ' . $this->compiler->compile($class);
|
||||
$filesToWatch = $this->filesToWatch($type);
|
||||
$filesToWatch = fn () => $this->filesWatcher->for($type);
|
||||
|
||||
$this->cache->set($key, new CacheEntry($code, $filesToWatch));
|
||||
|
||||
/** @var ClassDefinition */
|
||||
return $this->cache->get($key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list<non-empty-string>
|
||||
*/
|
||||
private function filesToWatch(ObjectType $type): array
|
||||
{
|
||||
$reflection = Reflection::class($type->className());
|
||||
|
||||
$fileNames = [];
|
||||
|
||||
do {
|
||||
$fileName = $reflection->getFileName();
|
||||
|
||||
if (is_string($fileName)) {
|
||||
$fileNames[] = $fileName;
|
||||
}
|
||||
} while ($reflection = $reflection->getParentClass());
|
||||
|
||||
return $fileNames;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
use CuyZ\Valinor\Cache\Cache;
|
||||
use CuyZ\Valinor\Cache\CacheEntry;
|
||||
use CuyZ\Valinor\Cache\TypeFilesWatcher;
|
||||
use CuyZ\Valinor\Definition\FunctionDefinition;
|
||||
use CuyZ\Valinor\Definition\Repository\Cache\Compiler\FunctionDefinitionCompiler;
|
||||
use CuyZ\Valinor\Definition\Repository\FunctionDefinitionRepository;
|
||||
@@ -18,6 +19,7 @@ public function __construct(
|
||||
private FunctionDefinitionRepository $delegate,
|
||||
/** @var Cache<FunctionDefinition> */
|
||||
private Cache $cache,
|
||||
private TypeFilesWatcher $filesWatcher,
|
||||
private FunctionDefinitionCompiler $compiler,
|
||||
) {}
|
||||
|
||||
@@ -37,7 +39,7 @@ public function for(callable $function): FunctionDefinition
|
||||
$definition = $this->delegate->for($function);
|
||||
|
||||
$code = 'fn () => ' . $this->compiler->compile($definition);
|
||||
$filesToWatch = $definition->fileName ? [$definition->fileName] : [];
|
||||
$filesToWatch = fn () => $this->filesWatcher->for($function);
|
||||
|
||||
$this->cache->set($key, new CacheEntry($code, $filesToWatch));
|
||||
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
namespace CuyZ\Valinor\Definition\Repository\Cache\Compiler;
|
||||
|
||||
use CuyZ\Valinor\Definition\ClassDefinition;
|
||||
use CuyZ\Valinor\Definition\MethodDefinition;
|
||||
use CuyZ\Valinor\Definition\PropertyDefinition;
|
||||
|
||||
use function array_map;
|
||||
use function implode;
|
||||
@@ -39,14 +37,14 @@ public function compile(ClassDefinition $value): string
|
||||
$type = $this->typeCompiler->compile($value->type);
|
||||
|
||||
$properties = array_map(
|
||||
fn (PropertyDefinition $property) => $this->propertyCompiler->compile($property),
|
||||
$this->propertyCompiler->compile(...),
|
||||
iterator_to_array($value->properties)
|
||||
);
|
||||
|
||||
$properties = implode(', ', $properties);
|
||||
|
||||
$methods = array_map(
|
||||
fn (MethodDefinition $method) => $this->methodCompiler->compile($method),
|
||||
$this->methodCompiler->compile(...),
|
||||
iterator_to_array($value->methods)
|
||||
);
|
||||
|
||||
|
||||
@@ -5,8 +5,10 @@
|
||||
namespace CuyZ\Valinor\Definition\Repository\Cache\Compiler;
|
||||
|
||||
use CuyZ\Valinor\Definition\FunctionDefinition;
|
||||
use CuyZ\Valinor\Definition\ParameterDefinition;
|
||||
|
||||
use function array_map;
|
||||
use function implode;
|
||||
use function iterator_to_array;
|
||||
use function var_export;
|
||||
|
||||
/** @internal */
|
||||
@@ -29,7 +31,7 @@ public function __construct()
|
||||
public function compile(FunctionDefinition $value): string
|
||||
{
|
||||
$parameters = array_map(
|
||||
fn (ParameterDefinition $parameter) => $this->parameterCompiler->compile($parameter),
|
||||
$this->parameterCompiler->compile(...),
|
||||
iterator_to_array($value->parameters)
|
||||
);
|
||||
|
||||
|
||||
@@ -5,8 +5,10 @@
|
||||
namespace CuyZ\Valinor\Definition\Repository\Cache\Compiler;
|
||||
|
||||
use CuyZ\Valinor\Definition\MethodDefinition;
|
||||
use CuyZ\Valinor\Definition\ParameterDefinition;
|
||||
|
||||
use function array_map;
|
||||
use function implode;
|
||||
use function iterator_to_array;
|
||||
use function var_export;
|
||||
|
||||
/** @internal */
|
||||
@@ -30,7 +32,7 @@ public function compile(MethodDefinition $method): string
|
||||
$attributes = $this->attributesCompiler->compile($method->attributes);
|
||||
|
||||
$parameters = array_map(
|
||||
fn (ParameterDefinition $parameter) => $this->parameterCompiler->compile($parameter),
|
||||
$this->parameterCompiler->compile(...),
|
||||
iterator_to_array($method->parameters)
|
||||
);
|
||||
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
|
||||
use CuyZ\Valinor\Definition\ParameterDefinition;
|
||||
|
||||
use function is_object;
|
||||
use function serialize;
|
||||
use function var_export;
|
||||
|
||||
/** @internal */
|
||||
final class ParameterDefinitionCompiler
|
||||
{
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
|
||||
use CuyZ\Valinor\Definition\PropertyDefinition;
|
||||
|
||||
use function var_export;
|
||||
|
||||
/** @internal */
|
||||
final class PropertyDefinitionCompiler
|
||||
{
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
use function array_keys;
|
||||
use function array_map;
|
||||
use function implode;
|
||||
use function str_ends_with;
|
||||
use function var_export;
|
||||
|
||||
/** @internal */
|
||||
@@ -94,7 +95,7 @@ public function compile(Type $type): string
|
||||
case $type instanceof IntersectionType:
|
||||
case $type instanceof UnionType:
|
||||
$subTypes = array_map(
|
||||
fn (Type $subType) => $this->compile($subType),
|
||||
$this->compile(...),
|
||||
$type->types()
|
||||
);
|
||||
|
||||
@@ -106,7 +107,7 @@ public function compile(Type $type): string
|
||||
'int' => "$class::integer()",
|
||||
default => (function () use ($type, $class) {
|
||||
$types = array_map(
|
||||
fn (Type $subType) => $this->compile($subType),
|
||||
$this->compile(...),
|
||||
$type->types,
|
||||
);
|
||||
|
||||
@@ -172,7 +173,7 @@ public function compile(Type $type): string
|
||||
return "new $class('{$type->className()}', [$generics])";
|
||||
case $type instanceof ClassStringType:
|
||||
$subTypes = implode(', ', array_map(
|
||||
fn (Type $subType) => $this->compile($subType),
|
||||
$this->compile(...),
|
||||
$type->subTypes(),
|
||||
));
|
||||
|
||||
@@ -192,7 +193,7 @@ public function compile(Type $type): string
|
||||
case $type instanceof CallableType:
|
||||
$returnType = $this->compile($type->returnType);
|
||||
$parameters = implode(', ', array_map(
|
||||
fn (Type $subType) => $this->compile($subType),
|
||||
$this->compile(...),
|
||||
$type->parameters,
|
||||
));
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ public function for(Reflector $reflection): array
|
||||
$attributes = [];
|
||||
|
||||
foreach ($reflection->getAttributes() as $key => $attribute) {
|
||||
if (! $this->attributeIsAllowed($attribute) || ! $this->attributeCanBeInstantiated($attribute)) {
|
||||
if (! $this->attributeCanBeInstantiated($attribute) || ! $this->attributeIsAllowed($attribute)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
use CuyZ\Valinor\Definition\PropertyDefinition;
|
||||
use CuyZ\Valinor\Definition\Repository\AttributesRepository;
|
||||
use CuyZ\Valinor\Definition\Repository\ClassDefinitionRepository;
|
||||
use CuyZ\Valinor\Definition\Repository\Reflection\TypeResolver\ClassGenericResolver;
|
||||
use CuyZ\Valinor\Definition\Repository\Reflection\TypeResolver\ClassImportedTypeAliasResolver;
|
||||
use CuyZ\Valinor\Definition\Repository\Reflection\TypeResolver\ClassLocalTypeAliasResolver;
|
||||
use CuyZ\Valinor\Definition\Repository\Reflection\TypeResolver\ClassParentTypeResolver;
|
||||
use CuyZ\Valinor\Definition\Repository\Reflection\TypeResolver\ClassGenericResolver;
|
||||
use CuyZ\Valinor\Definition\Repository\Reflection\TypeResolver\ReflectionTypeResolver;
|
||||
use CuyZ\Valinor\Mapper\Object\Constructor;
|
||||
use CuyZ\Valinor\Type\ObjectType;
|
||||
@@ -30,6 +30,7 @@
|
||||
use ReflectionMethod;
|
||||
use ReflectionProperty;
|
||||
|
||||
use function array_count_values;
|
||||
use function array_filter;
|
||||
use function array_keys;
|
||||
use function array_map;
|
||||
|
||||
@@ -21,8 +21,6 @@
|
||||
use ReflectionParameter;
|
||||
|
||||
use function array_map;
|
||||
use function str_ends_with;
|
||||
use function str_starts_with;
|
||||
|
||||
/** @internal */
|
||||
final class ReflectionFunctionDefinitionRepository implements FunctionDefinitionRepository
|
||||
@@ -68,8 +66,6 @@ public function for(callable $function): FunctionDefinition
|
||||
$class = $reflection->getClosureScopeClass();
|
||||
$returnType = $returnTypeResolver->resolveReturnTypeFor($reflection);
|
||||
$nativeReturnType = $returnTypeResolver->resolveNativeReturnTypeFor($reflection);
|
||||
// PHP8.2 use `ReflectionFunction::isAnonymous()`
|
||||
$isClosure = $name === '{closure}' || str_ends_with($name, '\\{closure}') || str_starts_with($name, '{closure:');
|
||||
|
||||
if ($returnType instanceof UnresolvableType) {
|
||||
$returnType = $returnType->forFunctionReturnType($signature);
|
||||
@@ -84,7 +80,7 @@ public function for(callable $function): FunctionDefinition
|
||||
$reflection->getFileName() ?: null,
|
||||
$class?->name,
|
||||
$reflection->getClosureThis() === null,
|
||||
$isClosure,
|
||||
$reflection->isAnonymous(),
|
||||
new Parameters(...$parameters),
|
||||
$returnType,
|
||||
))->forCallable($function);
|
||||
@@ -95,8 +91,7 @@ public function for(callable $function): FunctionDefinition
|
||||
*/
|
||||
private function signature(ReflectionFunction $reflection): string
|
||||
{
|
||||
// PHP8.2 use `ReflectionFunction::isAnonymous()`
|
||||
if ($reflection->name === '{closure}' || str_ends_with($reflection->name, '\\{closure}') || str_starts_with($reflection->name, '{closure:')) {
|
||||
if ($reflection->isAnonymous()) {
|
||||
$startLine = $reflection->getStartLine();
|
||||
$endLine = $reflection->getEndLine();
|
||||
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
use CuyZ\Valinor\Type\Types\UnresolvableType;
|
||||
use CuyZ\Valinor\Utility\Reflection\Reflection;
|
||||
|
||||
use function array_shift;
|
||||
|
||||
/** @internal */
|
||||
final class ClassGenericResolver
|
||||
{
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
|
||||
namespace CuyZ\Valinor\Definition\Repository\Reflection\TypeResolver;
|
||||
|
||||
use CuyZ\Valinor\Type\ObjectWithGenericType;
|
||||
use CuyZ\Valinor\Type\ObjectType;
|
||||
use CuyZ\Valinor\Type\ObjectWithGenericType;
|
||||
use CuyZ\Valinor\Type\Parser\Factory\TypeParserFactory;
|
||||
use CuyZ\Valinor\Type\Parser\VacantTypeAssignerParser;
|
||||
use CuyZ\Valinor\Type\Type;
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
|
||||
use function array_map;
|
||||
use function array_values;
|
||||
use function assert;
|
||||
use function count;
|
||||
|
||||
/** @internal */
|
||||
final class ClassParentTypeResolver
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
use CuyZ\Valinor\Utility\Reflection\Annotations;
|
||||
use ReflectionParameter;
|
||||
|
||||
use function array_search;
|
||||
|
||||
/** @internal */
|
||||
final class ParameterTypeResolver
|
||||
{
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
use ReflectionType;
|
||||
use ReflectionUnionType;
|
||||
|
||||
use function implode;
|
||||
use function trim;
|
||||
|
||||
/** @internal */
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
use ReflectionClass;
|
||||
use ReflectionFunctionAbstract;
|
||||
|
||||
use function array_key_exists;
|
||||
use function current;
|
||||
use function key;
|
||||
use function next;
|
||||
|
||||
/** @internal */
|
||||
final class TemplateResolver
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user