From 542904b7eb781139ff0c12e6fc14ee3bc5998d9c Mon Sep 17 00:00:00 2001 From: Marian <42134098+IanDelMar@users.noreply.github.com> Date: Tue, 2 Sep 2025 21:26:43 +0200 Subject: [PATCH] Fix StripslashesFromStringsOnlyDynamicFunctionReturnTypeExtension --- phpcs.xml.dist | 5 +++++ ...sFromStringsOnlyDynamicFunctionReturnTypeExtension.php | 8 +++++++- tests/data/stripslashes-from-strings-only.php | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/phpcs.xml.dist b/phpcs.xml.dist index 4c951c7..1c0af71 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -23,6 +23,11 @@ tests/DynamicConstantTypeTest.php + + + src/StripslashesFromStringsOnlyDynamicFunctionReturnTypeExtension.php + + tests/* diff --git a/src/StripslashesFromStringsOnlyDynamicFunctionReturnTypeExtension.php b/src/StripslashesFromStringsOnlyDynamicFunctionReturnTypeExtension.php index 56a8e43..d6f8039 100644 --- a/src/StripslashesFromStringsOnlyDynamicFunctionReturnTypeExtension.php +++ b/src/StripslashesFromStringsOnlyDynamicFunctionReturnTypeExtension.php @@ -5,6 +5,7 @@ namespace SzepeViktor\PHPStan\WordPress; use PhpParser\Node\Expr\FuncCall; +use PhpParser\Node\UnionType; use PHPStan\Analyser\Scope; use PHPStan\Reflection\FunctionReflection; use PHPStan\Type\Constant\ConstantStringType; @@ -31,10 +32,15 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection, return TypeTraverser::map( $argType, - static function (Type $type): Type { + static function (Type $type, callable $traverse): Type { + if ($type instanceof UnionType) { + return $traverse($type); + } + if ($type instanceof ConstantStringType) { return new ConstantStringType(stripslashes($type->getValue())); } + return $type; } ); diff --git a/tests/data/stripslashes-from-strings-only.php b/tests/data/stripslashes-from-strings-only.php index 9fb7c42..e6ea1ad 100644 --- a/tests/data/stripslashes-from-strings-only.php +++ b/tests/data/stripslashes-from-strings-only.php @@ -16,3 +16,5 @@ assertType('array{}', stripslashes_from_strings_only([])); assertType("array{'foo'}", stripslashes_from_strings_only(['foo'])); assertType("array{'foo\\'s bar'}", stripslashes_from_strings_only(['foo\'s bar'])); + +assertType("'foo\'s bar'|array{'foo\\'s bar'}", stripslashes_from_strings_only(rand(0, 1) === 1 ? ['foo\'s bar'] : 'foo\'s bar'));