diff --git a/src/Type/Pest/HigherOrderExpectationTypeExtension.php b/src/Type/Pest/HigherOrderExpectationTypeExtension.php index 0bde973..0c42f8b 100644 --- a/src/Type/Pest/HigherOrderExpectationTypeExtension.php +++ b/src/Type/Pest/HigherOrderExpectationTypeExtension.php @@ -13,6 +13,7 @@ use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Identifier; use PHPStan\Analyser\Scope; +use PHPStan\Reflection\MissingPropertyFromReflectionException; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ExpressionTypeResolverExtension; use PHPStan\Type\Generic\GenericObjectType; @@ -187,7 +188,11 @@ private function resolvePropertyType(Type $objectType, string $propertyName, Sco return null; } - return $objectType->getProperty($propertyName, $scope)->getReadableType(); + try { + return $objectType->getProperty($propertyName, $scope)->getReadableType(); + } catch (MissingPropertyFromReflectionException) { + return new MixedType; + } } private function isNativeExpectationProperty(string $propertyName): bool diff --git a/tests/Type/Fixtures/MagicPropertyObject.php b/tests/Type/Fixtures/MagicPropertyObject.php new file mode 100644 index 0000000..53ca891 --- /dev/null +++ b/tests/Type/Fixtures/MagicPropertyObject.php @@ -0,0 +1,13 @@ +author; assertType('Pest\Expectations\HigherOrderExpectation, Tests\Type\Fixtures\Author>', $result); } + +function testMagicPropertyDoesNotCrash(): void +{ + $object = new MagicPropertyObject; + $result = expect($object)->name; + assertType('Pest\Expectations\HigherOrderExpectation, mixed>', $result); +} + +function testMagicPropertyChainDoesNotCrash(): void +{ + $object = new MagicPropertyObject; + $result = expect($object)->name->toBe('Nuno'); + assertType('Pest\Expectations\HigherOrderExpectation, Tests\Type\Fixtures\MagicPropertyObject>', $result); +} + +function testUnionWithoutClassPropertyDoesNotCrash(): void +{ + /** @var array|object|null $payload */ + $payload = null; + $result = expect($payload)->currentUser; + assertType('Pest\Expectations\HigherOrderExpectation|object|null>, mixed>', $result); +}