From baa918669ef271c0a5950481529395de4034c65e Mon Sep 17 00:00:00 2001 From: Richard van Velzen Date: Tue, 25 Oct 2022 12:04:19 +0200 Subject: [PATCH] Improve RuleLevelHelper::accepts() for constant arrays --- src/Rules/RuleLevelHelper.php | 5 ++++- tests/PHPStan/Levels/data/acceptTypes-5.json | 10 ---------- tests/PHPStan/Levels/data/acceptTypes-7.json | 4 ++-- tests/PHPStan/Levels/data/acceptTypes-8.json | 20 ++++++++++++++++++++ tests/PHPStan/Levels/data/acceptTypes.php | 16 ++++++++++++++++ 5 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/Rules/RuleLevelHelper.php b/src/Rules/RuleLevelHelper.php index 6679a3a9e9..f889d1f20f 100644 --- a/src/Rules/RuleLevelHelper.php +++ b/src/Rules/RuleLevelHelper.php @@ -111,7 +111,10 @@ public function accepts(Type $acceptingType, Type $acceptedType, bool $strictTyp if ( $acceptedType->isArray()->yes() && $acceptingType->isArray()->yes() - && $acceptedType->isConstantArray()->no() + && ( + $acceptedType->isConstantArray()->no() + || !$acceptedType->isIterableAtLeastOnce()->no() + ) && $acceptingType->isConstantArray()->no() ) { return ( diff --git a/tests/PHPStan/Levels/data/acceptTypes-5.json b/tests/PHPStan/Levels/data/acceptTypes-5.json index c9f5fdf981..acd06e6a48 100644 --- a/tests/PHPStan/Levels/data/acceptTypes-5.json +++ b/tests/PHPStan/Levels/data/acceptTypes-5.json @@ -44,16 +44,6 @@ "line": 118, "ignorable": true }, - { - "message": "Parameter #1 $i of method Levels\\AcceptTypes\\Foo::doBarArray() expects array, array given.", - "line": 119, - "ignorable": true - }, - { - "message": "Parameter #1 $i of method Levels\\AcceptTypes\\Foo::doBarArray() expects array, array given.", - "line": 120, - "ignorable": true - }, { "message": "Parameter #1 $callable of method Levels\\AcceptTypes\\Foo::expectCallable() expects callable(): mixed, 'nonexistentFunction' given.", "line": 144, diff --git a/tests/PHPStan/Levels/data/acceptTypes-7.json b/tests/PHPStan/Levels/data/acceptTypes-7.json index 8345aca34c..d9c0b8a45e 100644 --- a/tests/PHPStan/Levels/data/acceptTypes-7.json +++ b/tests/PHPStan/Levels/data/acceptTypes-7.json @@ -20,8 +20,8 @@ "ignorable": true }, { - "message": "Parameter #1 $i of method Levels\\AcceptTypes\\Foo::doBarArray() expects array, array given.", - "line": 131, + "message": "Parameter #1 $i of method Levels\\AcceptTypes\\Foo::doBarArray() expects array, array given.", + "line": 120, "ignorable": true }, { diff --git a/tests/PHPStan/Levels/data/acceptTypes-8.json b/tests/PHPStan/Levels/data/acceptTypes-8.json index 49eddfd569..e1ede8c0c0 100644 --- a/tests/PHPStan/Levels/data/acceptTypes-8.json +++ b/tests/PHPStan/Levels/data/acceptTypes-8.json @@ -14,6 +14,16 @@ "line": 91, "ignorable": true }, + { + "message": "Parameter #1 $i of method Levels\\AcceptTypes\\Foo::doBarArray() expects array, array given.", + "line": 119, + "ignorable": true + }, + { + "message": "Parameter #1 $i of method Levels\\AcceptTypes\\Foo::doBarArray() expects array, array given.", + "line": 131, + "ignorable": true + }, { "message": "Parameter #1 $i of method Levels\\AcceptTypes\\Baz::doBar() expects int, int|null given.", "line": 414, @@ -28,5 +38,15 @@ "message": "Parameter #1 $i of method Levels\\AcceptTypes\\Baz::doBarArray() expects array, array given.", "line": 495, "ignorable": true + }, + { + "message": "Method Levels\\AcceptTypes\\Discussion8209::test1() should return int but returns int|null.", + "line": 771, + "ignorable": true + }, + { + "message": "Method Levels\\AcceptTypes\\Discussion8209::test2() should return array but returns array.", + "line": 779, + "ignorable": true } ] \ No newline at end of file diff --git a/tests/PHPStan/Levels/data/acceptTypes.php b/tests/PHPStan/Levels/data/acceptTypes.php index d16184f062..61b2c1fbbb 100644 --- a/tests/PHPStan/Levels/data/acceptTypes.php +++ b/tests/PHPStan/Levels/data/acceptTypes.php @@ -763,3 +763,19 @@ public function invalidType($invalid) { $imploded = implode('abc', $invalid); } } + +class Discussion8209 +{ + public function test1(?int $id): int + { + return $id; + } + + /** + * @return array + */ + public function test2(?int $id): array + { + return [$id]; + } +}