From 766b17f5c7d9d98e5bbbd76b7ba57163a4deb32d Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Tue, 8 Sep 2026 18:12:45 +0200 Subject: [PATCH] [CodeQuality] Fix TypedPropertyFromColumnTypeRector numeric default on decimal/bigint string type Doctrine decimal and bigint map to a PHP string. A numeric default like 0 stays an int, producing a fatal 'Cannot use int as default value for property of type string'. Convert the numeric default to its string form, eg: 0 to '0'. Fixes rectorphp/rector#9894 Claude-Session: https://claude.ai/code/session_018nXn7xBmuX9jrY8zZqgAxp --- .../Fixture/decimal_default_value.php.inc | 31 +++++++++++++++++++ .../TypedPropertyFromColumnTypeRector.php | 23 ++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 rules-tests/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector/Fixture/decimal_default_value.php.inc diff --git a/rules-tests/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector/Fixture/decimal_default_value.php.inc b/rules-tests/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector/Fixture/decimal_default_value.php.inc new file mode 100644 index 00000000..338e7d56 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector/Fixture/decimal_default_value.php.inc @@ -0,0 +1,31 @@ + +----- + diff --git a/rules/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector.php b/rules/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector.php index d2f99d4b..3ff9f1e6 100644 --- a/rules/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector.php +++ b/rules/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector.php @@ -5,9 +5,13 @@ namespace Rector\Doctrine\CodeQuality\Rector\Property; use PhpParser\Node; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; +use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Property; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\MixedType; +use PHPStan\Type\StringType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; use PHPStan\Type\UnionType; @@ -112,6 +116,9 @@ public function refactor(Node $node): Property|null $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + // Doctrine "decimal"/"bigint" map to string; keep a numeric default valid as string, eg: 0 to '0' + $this->refactorNumericDefaultToString($node, $propertyType); + if ($propertyType instanceof UnionType) { $this->propertyTypeDecorator->decoratePropertyUnionType($propertyType, $typeNode, $node, $phpDocInfo); return $node; @@ -121,6 +128,22 @@ public function refactor(Node $node): Property|null return $node; } + private function refactorNumericDefaultToString(Property $property, Type $propertyType): void + { + $bareType = TypeCombinator::removeNull($propertyType); + if (! $bareType instanceof StringType) { + return; + } + + $propertyItem = $property->props[0]; + $default = $propertyItem->default; + if (! $default instanceof Int_ && ! $default instanceof Float_) { + return; + } + + $propertyItem->default = new String_((string) $default->value); + } + private function hasUntypedParentProperty(ClassReflection $classReflection, Property $property): bool { $propertyName = $this->getName($property);