From 032f7fee18bd992c04a951a3f3c94878564c1d60 Mon Sep 17 00:00:00 2001 From: Pascal Heidmann Date: Mon, 14 Mar 2022 17:36:47 +0100 Subject: [PATCH 1/3] [allow-dynamic-calls] Fix cases where we don't have a class name yet to fall back to default return type of enums --- src/EnumDynamicReturnTypeExtension.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/EnumDynamicReturnTypeExtension.php b/src/EnumDynamicReturnTypeExtension.php index ab05196..59f5214 100644 --- a/src/EnumDynamicReturnTypeExtension.php +++ b/src/EnumDynamicReturnTypeExtension.php @@ -3,6 +3,7 @@ namespace MabeEnumPHPStan; use MabeEnum\Enum; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PHPStan\Analyser\Scope; @@ -81,6 +82,9 @@ public function getTypeFromStaticMethodCall( StaticCall $staticCall, Scope $scope ): Type { + if ($staticCall->class instanceof Expr) { + return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType(); + } $callClass = $staticCall->class->toString(); // Can't detect possible types on static::*() From bc0a19b330c5c4cf500d65655607688d6bdf8ac1 Mon Sep 17 00:00:00 2001 From: Pascal Heidmann Date: Tue, 15 Mar 2022 09:44:05 +0100 Subject: [PATCH 2/3] [allow-dynamic-calls] Add test case for edge case "use class-string for static access" --- tests/integration/data/EnumGetValuesReturnType.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/integration/data/EnumGetValuesReturnType.php b/tests/integration/data/EnumGetValuesReturnType.php index 52aa347..3b06584 100644 --- a/tests/integration/data/EnumGetValuesReturnType.php +++ b/tests/integration/data/EnumGetValuesReturnType.php @@ -6,6 +6,15 @@ class Example { + /** @var class-string */ + protected $enumClass = Enum::class; + + /** @return array */ + public function getDynamicValues(): array + { + return $this->enumClass::getValues(); + } + /** @return array */ public static function baseMethodValid(): array { From 4c84136d7b92814c303b1c667f00b92a3aaa3257 Mon Sep 17 00:00:00 2001 From: Pascal Heidmann Date: Tue, 15 Mar 2022 09:46:51 +0100 Subject: [PATCH 3/3] [allow-dynamic-calls] Fix lines for test case --- .../data/EnumGetValuesReturnType-3.json | 10 +++++----- .../data/EnumGetValuesReturnType-7.json | 15 ++++++++++----- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/tests/integration/data/EnumGetValuesReturnType-3.json b/tests/integration/data/EnumGetValuesReturnType-3.json index d813153..0699bc3 100644 --- a/tests/integration/data/EnumGetValuesReturnType-3.json +++ b/tests/integration/data/EnumGetValuesReturnType-3.json @@ -1,22 +1,22 @@ [ { "message": "Method MabeEnum\\PHPStan\\tests\\integration\\data\\EnumGetValuesReturnType\\Example::staticMethodFail() should return array but returns array.", - "line": 24, + "line": 33, "ignorable": true }, { "message": "Method MabeEnum\\PHPStan\\tests\\integration\\data\\EnumGetValuesReturnType\\Example::objectMethodFail() should return array but returns array.", - "line": 36, + "line": 45, "ignorable": true }, { "message": "Method MabeEnum\\PHPStan\\tests\\integration\\data\\EnumGetValuesReturnType\\MyEnum::selfGetValuesFail() should return array but returns array.", - "line": 54, + "line": 63, "ignorable": true }, { "message": "Method MabeEnum\\PHPStan\\tests\\integration\\data\\EnumGetValuesReturnType\\MyInheritedEnum::inheritSelfGetValuesFail() should return array but returns array.", - "line": 77, + "line": 86, "ignorable": true } -] \ No newline at end of file +] diff --git a/tests/integration/data/EnumGetValuesReturnType-7.json b/tests/integration/data/EnumGetValuesReturnType-7.json index 3ced2eb..b84e7cb 100644 --- a/tests/integration/data/EnumGetValuesReturnType-7.json +++ b/tests/integration/data/EnumGetValuesReturnType-7.json @@ -1,12 +1,17 @@ [ { - "message": "Method MabeEnum\\PHPStan\\tests\\integration\\data\\EnumGetValuesReturnType\\MyEnum::staticGetValuesFail() should return array but returns array.", - "line": 60, + "message": "Method MabeEnum\\PHPStan\\tests\\integration\\data\\EnumGetValuesReturnType\\Example::getDynamicValues() should return array but returns array|bool|float|int|string|null>.", + "line": 15, "ignorable": true }, { - "message": "Method MabeEnum\\PHPStan\\tests\\integration\\data\\EnumGetValuesReturnType\\MyInheritedEnum::inheritStaticGetValuesFail() should return array but returns array.", - "line": 83, + "message": "Method MabeEnum\\PHPStan\\tests\\integration\\data\\EnumGetValuesReturnType\\MyEnum::staticGetValuesFail() should return array but returns array|bool|float|int|string|null>.", + "line": 69, + "ignorable": true + }, + { + "message": "Method MabeEnum\\PHPStan\\tests\\integration\\data\\EnumGetValuesReturnType\\MyInheritedEnum::inheritStaticGetValuesFail() should return array but returns array|bool|float|int|string|null>.", + "line": 92, "ignorable": true } -] \ No newline at end of file +]