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'));