nette / php-generator

🐘 Generates neat PHP code for you. Supports new PHP 8.3 features.

Home Page:https://doc.nette.org/php-generator

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Promoted Parameters don't have "readonly" when using Factory

WalterWoshid opened this issue · comments

Version: 6.36.0

Bug Description

When using $method = (new Factory)->fromMethodReflection($refMethod); and printing the code with $method->__toString(); the readonly keyword is missing.

Steps To Reproduce

class Number
{
    public function __construct(public readonly int $value) {}
}

$reflectionClass = new \ReflectionClass(Number::class);
$reflectionMethod = $reflectionClass->getMethod('__construct');
$method = (new Factory)->fromMethodReflection($reflectionMethod);
$result = (string)$method;

Expected Behavior

Should include readonly

Possible Solution

Factory::fromParameterReflection():

public function fromParameterReflection(...): Parameter
{
    // ...
    
    if ($from->isPromoted()
        && PHP_VERSION_ID >= 80100
        && ($declaringClass = $from->getDeclaringClass())
        && $declaringClass->hasProperty($from->name)
        && ($property = $declaringClass->getProperty($from->name))
        && $property->isPromoted()
        && !(PHP_VERSION_ID >= 80200 && $from->getDeclaringClass()->isReadOnly())
    ) {
        $param->setReadOnly($property->isReadOnly());
    }

    // ...
}

@dg Thank you!