laminas / laminas-code

Extensions to the PHP Reflection API, static code scanning, and code generation
https://docs.laminas.dev/laminas-code/
BSD 3-Clause "New" or "Revised" License
1.85k stars 81 forks source link

Promoted properties are losing nullable flag #183

Open Grundik opened 1 year ago

Grundik commented 1 year ago

Bug Report

Q A
Version(s) 4.7.1 (all versions affected since 4.5.0)

Summary

Laminas\Code\Generator\PromotedParameterGenerator#fromParameterGeneratorWithVisibility are losing nullable flag of such parameter.

Current behavior

class Test {
    public function __construct(
        protected ?int $value
    ) {
    }
}

$parameterReflection = new ParameterReflection([Test::class, '__construct'], 0);
$parameterGenerator = PromotedParameterGenerator::fromReflection($parameterReflection);
echo $parameterGenerator->generate();

will echo protected int $value, nullable flag is lost.

How to reproduce

Use snippet above.

Expected behavior

Code above should echo protected ?int $value.

Additional information

https://github.com/laminas/laminas-code/blob/169123b3ede20a9193480c53de2a8194f8c073ec/src/Generator/PromotedParameterGenerator.php#LL73C51-L73C51

    public static function fromParameterGeneratorWithVisibility(ParameterGenerator $generator, string $visibility): self
    {
        $name = $generator->getName();
        $type = $generator->getType(); // <----- this would return "bare" type, without modifiers

Unfortunately, there are no way to get nullable flag from TypeGenerator at all for now. Unsurprisingly it get lost on the way.

Grundik commented 1 year ago

Possible fix: #184