From 5acfddf40e8e85b9928baaae0a43201335cee140 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Pudil?= <me@jiripudil.cz> Date: Mon, 6 Dec 2021 13:42:50 +0100 Subject: [PATCH] generate array type in reconstitute() --- src/Scaffolding/ReconstituteConstructor.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Scaffolding/ReconstituteConstructor.php b/src/Scaffolding/ReconstituteConstructor.php index 8059191..43c2fe6 100644 --- a/src/Scaffolding/ReconstituteConstructor.php +++ b/src/Scaffolding/ReconstituteConstructor.php @@ -5,8 +5,7 @@ namespace Grifart\Tables\Scaffolding; use Grifart\ClassScaffolder\Capabilities\Capability; use Grifart\ClassScaffolder\ClassInNamespace; use Grifart\ClassScaffolder\Definition\ClassDefinition; -use Grifart\ClassScaffolder\Definition\Field; -use Nette\PhpGenerator as Code; +use Nette\PhpGenerator\PhpLiteral; final class ReconstituteConstructor implements Capability { @@ -20,13 +19,21 @@ final class ReconstituteConstructor implements Capability $reconstitute = $classType->addMethod('reconstitute') ->setReturnType('static') - ->setParameters([(new Code\Parameter('values'))->setTypeHint('array')]) ->setStatic(); + $reconstitute->addParameter('values')->setTypeHint('array'); + $fields = $definition->getFields(); - $questionMarks = \implode(', ', array_fill(0, \count($fields), '?')); - $literals = \array_map(function(Field $field): Code\PhpLiteral {return new Code\PhpLiteral("\$values['" . $field->getName() . "']");}, $fields); + $shapeFields = $literals = []; + foreach ($fields as $field) { + $name = $field->getName(); + $type = $field->getType(); + + $shapeFields[] = \sprintf('%s: %s', $name, $type->getDocCommentType($draft->getNamespace())); + $literals[] = new PhpLiteral("\$values['" . $name . "']"); + } - $reconstitute->addBody("return new static($questionMarks);", \array_values($literals)); + $reconstitute->addComment(\sprintf('@param array{%s} $values', \implode(', ', $shapeFields))); + $reconstitute->addBody("return new static(...?);", [$literals]); } } -- GitLab