From af60c205e616e1beaed6ad24e9a831b035af354a Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 26 Sep 2025 15:45:00 +0700 Subject: [PATCH 1/2] [NodeTypeResolver] Handle ArrayType with intersection string on AccessoryNonEmptyArrayTypeCorrector --- .../AccessoryNonEmptyArrayTypeCorrector.php | 7 +++++++ src/NodeTypeResolver/NodeTypeResolver.php | 7 ------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyArrayTypeCorrector.php b/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyArrayTypeCorrector.php index 4c7b0bb32bc..a729c59ba6c 100644 --- a/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyArrayTypeCorrector.php +++ b/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyArrayTypeCorrector.php @@ -8,6 +8,7 @@ use PHPStan\Type\ArrayType; use PHPStan\Type\IntersectionType; use PHPStan\Type\MixedType; +use PHPStan\Type\StringType; use PHPStan\Type\Type; final class AccessoryNonEmptyArrayTypeCorrector @@ -26,6 +27,12 @@ public function correct(Type $mainType): Type if ($type instanceof NonEmptyArrayType) { return new ArrayType(new MixedType(), new MixedType()); } + + if ($type instanceof ArrayType + && $type->getIterableValueType() instanceof IntersectionType + && ($type->getIterableValueType()->isString()->yes())) { + return new ArrayType(new MixedType(), new StringType()); + } } return $mainType; diff --git a/src/NodeTypeResolver/NodeTypeResolver.php b/src/NodeTypeResolver/NodeTypeResolver.php index 9baa9932767..6cde992ec83 100644 --- a/src/NodeTypeResolver/NodeTypeResolver.php +++ b/src/NodeTypeResolver/NodeTypeResolver.php @@ -34,13 +34,11 @@ use PHPStan\Type\Constant\ConstantBooleanType; use PHPStan\Type\Constant\ConstantStringType; use PHPStan\Type\ErrorType; -use PHPStan\Type\IntegerType; use PHPStan\Type\MixedType; use PHPStan\Type\NeverType; use PHPStan\Type\NullType; use PHPStan\Type\ObjectType; use PHPStan\Type\ObjectWithoutClassType; -use PHPStan\Type\StringType; use PHPStan\Type\ThisType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; @@ -180,11 +178,6 @@ public function getType(Node $node): Type } } - // correction for explode() that always returns array - if ($node instanceof FuncCall && $node->name instanceof Name && $node->name->toString() === 'explode') { - return new ArrayType(new IntegerType(), new StringType()); - } - if ($node instanceof Ternary) { $ternaryType = $this->resolveTernaryType($node); if (! $ternaryType instanceof MixedType) { From e5ef6c64c4cdd5a99e0e15dd2f0057193651c0f3 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 26 Sep 2025 15:46:12 +0700 Subject: [PATCH 2/2] [NodeTypeResolver] Handle ArrayType with intersection string on AccessoryNonEmptyArrayTypeCorrector --- .../NodeTypeCorrector/AccessoryNonEmptyArrayTypeCorrector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyArrayTypeCorrector.php b/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyArrayTypeCorrector.php index a729c59ba6c..d3fcd962cc8 100644 --- a/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyArrayTypeCorrector.php +++ b/src/NodeTypeResolver/NodeTypeCorrector/AccessoryNonEmptyArrayTypeCorrector.php @@ -30,7 +30,7 @@ public function correct(Type $mainType): Type if ($type instanceof ArrayType && $type->getIterableValueType() instanceof IntersectionType - && ($type->getIterableValueType()->isString()->yes())) { + && $type->getIterableValueType()->isString()->yes()) { return new ArrayType(new MixedType(), new StringType()); } }