diff --git a/extension.neon b/extension.neon index 3f5c7a2..0554b2c 100644 --- a/extension.neon +++ b/extension.neon @@ -37,6 +37,9 @@ parameters: - Nette\Http\SessionSection - Nette\Security\Identity - Nette\Security\SimpleIdentity + featureToggles: + skipCheckGenericClasses: + - Nette\Utils\ArrayHash earlyTerminatingMethodCalls: Nette\Application\UI\Component: - error diff --git a/stubs/Forms/Container.stub b/stubs/Forms/Container.stub index d7381af..935baa1 100644 --- a/stubs/Forms/Container.stub +++ b/stubs/Forms/Container.stub @@ -5,7 +5,7 @@ namespace Nette\Forms; use Nette\Utils\ArrayHash; /** - * @property ArrayHash $values + * @property ArrayHash $values * @property-read \Iterator $controls * @property-read Form|null $form * @phpstan-implements \ArrayAccess diff --git a/stubs/Utils/ArrayHash.stub b/stubs/Utils/ArrayHash.stub index 59b8b98..cff2bc7 100644 --- a/stubs/Utils/ArrayHash.stub +++ b/stubs/Utils/ArrayHash.stub @@ -3,16 +3,17 @@ namespace Nette\Utils; /** - * @implements \IteratorAggregate - * @implements \ArrayAccess + * @template T + * @implements \IteratorAggregate + * @implements \ArrayAccess */ -class ArrayHash implements \ArrayAccess, \IteratorAggregate +class ArrayHash extends \stdClass implements \ArrayAccess, \IteratorAggregate { /** - * @return \RecursiveArrayIterator + * @return \Iterator */ - public function getIterator(): \RecursiveArrayIterator + public function &getIterator(): \Iterator { // nothing } diff --git a/tests/Type/Nette/ArrayHashStubTest.php b/tests/Type/Nette/ArrayHashStubTest.php new file mode 100644 index 0000000..0c5d19d --- /dev/null +++ b/tests/Type/Nette/ArrayHashStubTest.php @@ -0,0 +1,54 @@ +assertFileAsserts($assertType, $file, ...$args); + } + + public static function getAdditionalConfigFiles(): array + { + return [ + __DIR__ . '/phpstan.neon', + ]; + } + +} diff --git a/tests/Type/Nette/data/array-hash-iterator.php b/tests/Type/Nette/data/array-hash-iterator.php new file mode 100644 index 0000000..3fe8664 --- /dev/null +++ b/tests/Type/Nette/data/array-hash-iterator.php @@ -0,0 +1,17 @@ + $hash + */ +function test(ArrayHash $hash): void +{ + foreach ($hash as $key => $value) { + assertType('(int|string)', $key); + assertType('int', $value); + } +} diff --git a/tests/Type/Nette/data/array-hash.php b/tests/Type/Nette/data/array-hash.php new file mode 100644 index 0000000..c15d257 --- /dev/null +++ b/tests/Type/Nette/data/array-hash.php @@ -0,0 +1,16 @@ + $hash + */ +function test(ArrayHash $hash): void +{ + assertType('Nette\\Utils\\ArrayHash', $hash); + assertType('int|null', $hash['foo']); + assertType('mixed', $hash->foo); +}