From d7c8400083320939214cecd9bef37c49d0b7037d Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 6 Sep 2025 21:06:50 +0700 Subject: [PATCH] [CodeQuality] Handle intersection on OptionalParametersAfterRequiredRector --- .../Fixture/typed_params.php.inc | 8 +++++++ .../OptionalParametersAfterRequiredRector.php | 21 ++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/rules-tests/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector/Fixture/typed_params.php.inc b/rules-tests/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector/Fixture/typed_params.php.inc index c8f5ecaf3cd..244ec16a5a9 100644 --- a/rules-tests/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector/Fixture/typed_params.php.inc +++ b/rules-tests/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector/Fixture/typed_params.php.inc @@ -15,6 +15,10 @@ class TypedParams function run3($optional = 1, null|int $required) { } + + function run4($optional = 1, A&B $required) + { + } } ?> @@ -36,6 +40,10 @@ class TypedParams function run3($optional = 1, null|int $required = null) { } + + function run4($optional = 1, (A&B)|null $required = null) + { + } } ?> diff --git a/rules/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php b/rules/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php index 74706884090..ef8b81f187e 100644 --- a/rules/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php +++ b/rules/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php @@ -85,32 +85,37 @@ public function refactor(Node $node): ClassMethod|Function_|null $hasChanged = true; $param->default = new ConstFetch(new Name('null')); - $paramType = $param->type; - if (! $paramType instanceof Node) { + if (! $param->type instanceof Node) { continue; } - if ($paramType instanceof NullableType) { + if ($param->type instanceof NullableType) { continue; } - if ($paramType instanceof UnionType || $paramType instanceof IntersectionType) { - foreach ($paramType->types as $unionedType) { + if ($param->type instanceof UnionType) { + foreach ($param->type->types as $unionedType) { if ($unionedType instanceof Identifier && $this->isName($unionedType, 'null')) { continue 2; } } - $paramType->types[] = new Identifier('null'); + $param->type->types[] = new Identifier('null'); continue; } - if ($paramType instanceof ComplexType) { + if ($param->type instanceof IntersectionType) { + $param->type = new UnionType([$param->type, new Identifier('null')]); + + continue; + } + + if ($param->type instanceof ComplexType) { continue; } - $param->type = new NullableType($paramType); + $param->type = new NullableType($param->type); } }