From 3b204cb6f27e75e3fd0e7e5672fa4b2c86181d6d Mon Sep 17 00:00:00 2001 From: Martin Herndl Date: Thu, 2 Jun 2022 12:55:21 +0200 Subject: [PATCH] Specify optional array keys in `ConfigReturnTypeExtension` --- src/Composer/PHPStan/ConfigReturnTypeExtension.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Composer/PHPStan/ConfigReturnTypeExtension.php b/src/Composer/PHPStan/ConfigReturnTypeExtension.php index fc1de219e..574d7f921 100644 --- a/src/Composer/PHPStan/ConfigReturnTypeExtension.php +++ b/src/Composer/PHPStan/ConfigReturnTypeExtension.php @@ -123,19 +123,23 @@ final class ConfigReturnTypeExtension implements DynamicMethodReturnTypeExtensio if (isset($def['properties'])) { $keyNames = []; $valTypes = []; + $optionalKeys = []; + $propIndex = 0; foreach ($def['properties'] as $propName => $propdef) { $keyNames[] = new ConstantStringType($propName); $valType = $this->parseType($propdef, $path.'.'.$propName); if (!isset($def['required']) || !in_array($propName, $def['required'], true)) { $valType = TypeCombinator::addNull($valType); + $optionalKeys[] = $propIndex; } $valTypes[] = $valType; + $propIndex++; } if ($addlPropType !== null) { $types[] = new ArrayType(TypeCombinator::union(new StringType(), ...$keyNames), TypeCombinator::union($addlPropType, ...$valTypes)); } else { - $types[] = new ConstantArrayType($keyNames, $valTypes); + $types[] = new ConstantArrayType($keyNames, $valTypes, [0], $optionalKeys); } } else { $types[] = new ArrayType(new StringType(), $addlPropType ?? new MixedType());