diff --git a/src/Scaffolding/ReconstituteConstructor.php b/src/Scaffolding/ReconstituteConstructor.php index 8059191e4fe3ed76b89887ddcfa8546443629141..43c2fe6319821a376b4ca778532710a05eed83a0 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]); } }