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