From 750b5f9f0abe04fdb73028348f2d1865a157bd87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=A1=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BA=D0=BE=D0=B2?= Date: Sat, 13 Dec 2025 12:03:58 +0400 Subject: [PATCH 1/2] Add support for `open-resource` --- src/PseudoTypes/OpenResource.php | 36 +++++++++++++++++++++ src/TypeResolver.php | 2 ++ src/Types/Resource_.php | 2 +- tests/unit/PseudoTypes/OpenResourceTest.php | 32 ++++++++++++++++++ tests/unit/TypeResolverTest.php | 2 ++ 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/PseudoTypes/OpenResource.php create mode 100644 tests/unit/PseudoTypes/OpenResourceTest.php diff --git a/src/PseudoTypes/OpenResource.php b/src/PseudoTypes/OpenResource.php new file mode 100644 index 00000000..a2e8fe73 --- /dev/null +++ b/src/PseudoTypes/OpenResource.php @@ -0,0 +1,36 @@ + ArrayKey::class, 'non-empty-array' => NonEmptyArray::class, 'resource' => Resource_::class, + 'open-resource' => OpenResource::class, 'void' => Void_::class, 'null' => Null_::class, 'scalar' => Scalar::class, diff --git a/src/Types/Resource_.php b/src/Types/Resource_.php index 1998ee0a..46ad7770 100644 --- a/src/Types/Resource_.php +++ b/src/Types/Resource_.php @@ -20,7 +20,7 @@ * * @psalm-immutable */ -final class Resource_ implements Type +class Resource_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. diff --git a/tests/unit/PseudoTypes/OpenResourceTest.php b/tests/unit/PseudoTypes/OpenResourceTest.php new file mode 100644 index 00000000..e73195de --- /dev/null +++ b/tests/unit/PseudoTypes/OpenResourceTest.php @@ -0,0 +1,32 @@ +assertEquals(new Resource_(), $type->underlyingType()); + } + + public function testToString(): void + { + $this->assertSame('open-resource', (string) (new OpenResource())); + } +} diff --git a/tests/unit/TypeResolverTest.php b/tests/unit/TypeResolverTest.php index 04c92c09..9c0ed309 100644 --- a/tests/unit/TypeResolverTest.php +++ b/tests/unit/TypeResolverTest.php @@ -56,6 +56,7 @@ use phpDocumentor\Reflection\PseudoTypes\ObjectShape; use phpDocumentor\Reflection\PseudoTypes\ObjectShapeItem; use phpDocumentor\Reflection\PseudoTypes\OffsetAccess; +use phpDocumentor\Reflection\PseudoTypes\OpenResource; use phpDocumentor\Reflection\PseudoTypes\PositiveInteger; use phpDocumentor\Reflection\PseudoTypes\PrivatePropertiesOf; use phpDocumentor\Reflection\PseudoTypes\PropertiesOf; @@ -663,6 +664,7 @@ public function provideKeywords(): array ['false', Boolean::class], ['false', False_::class], ['resource', Resource_::class], + ['open-resource', OpenResource::class], ['null', Null_::class], ['callable', Callable_::class], ['callable-string', CallableString::class], From a668e9ae34ee58311d982852dde7ab953ce6c4d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=A1=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BA=D0=BE=D0=B2?= Date: Sat, 13 Dec 2025 12:06:55 +0400 Subject: [PATCH 2/2] Add support for `closed-resource` --- src/PseudoTypes/ClosedResource.php | 36 +++++++++++++++++++ src/TypeResolver.php | 2 ++ tests/unit/PseudoTypes/ClosedResourceTest.php | 32 +++++++++++++++++ tests/unit/TypeResolverTest.php | 2 ++ 4 files changed, 72 insertions(+) create mode 100644 src/PseudoTypes/ClosedResource.php create mode 100644 tests/unit/PseudoTypes/ClosedResourceTest.php diff --git a/src/PseudoTypes/ClosedResource.php b/src/PseudoTypes/ClosedResource.php new file mode 100644 index 00000000..bb7dce1f --- /dev/null +++ b/src/PseudoTypes/ClosedResource.php @@ -0,0 +1,36 @@ + NonEmptyArray::class, 'resource' => Resource_::class, 'open-resource' => OpenResource::class, + 'closed-resource' => ClosedResource::class, 'void' => Void_::class, 'null' => Null_::class, 'scalar' => Scalar::class, diff --git a/tests/unit/PseudoTypes/ClosedResourceTest.php b/tests/unit/PseudoTypes/ClosedResourceTest.php new file mode 100644 index 00000000..d9c435f5 --- /dev/null +++ b/tests/unit/PseudoTypes/ClosedResourceTest.php @@ -0,0 +1,32 @@ +assertEquals(new Resource_(), $type->underlyingType()); + } + + public function testToString(): void + { + $this->assertSame('closed-resource', (string) (new ClosedResource())); + } +} diff --git a/tests/unit/TypeResolverTest.php b/tests/unit/TypeResolverTest.php index 9c0ed309..8576cf76 100644 --- a/tests/unit/TypeResolverTest.php +++ b/tests/unit/TypeResolverTest.php @@ -20,6 +20,7 @@ use phpDocumentor\Reflection\PseudoTypes\ArrayShapeItem; use phpDocumentor\Reflection\PseudoTypes\CallableString; use phpDocumentor\Reflection\PseudoTypes\ClassString; +use phpDocumentor\Reflection\PseudoTypes\ClosedResource; use phpDocumentor\Reflection\PseudoTypes\Conditional; use phpDocumentor\Reflection\PseudoTypes\ConditionalForParameter; use phpDocumentor\Reflection\PseudoTypes\ConstExpression; @@ -665,6 +666,7 @@ public function provideKeywords(): array ['false', False_::class], ['resource', Resource_::class], ['open-resource', OpenResource::class], + ['closed-resource', ClosedResource::class], ['null', Null_::class], ['callable', Callable_::class], ['callable-string', CallableString::class],