From 544fa3407eaa9a157401d65e9b4737ae9d3147a0 Mon Sep 17 00:00:00 2001 From: leo108 Date: Sat, 8 Feb 2025 18:46:30 +0800 Subject: [PATCH] Add NullType & LiteralBooleanType support to TypeHelper::createTypeFromTypeNode() (#708) --- src/Support/Type/TypeHelper.php | 8 ++++++++ tests/Support/Type/TypeHelperTest.php | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/Support/Type/TypeHelper.php b/src/Support/Type/TypeHelper.php index 7377b982..1cd71c3e 100644 --- a/src/Support/Type/TypeHelper.php +++ b/src/Support/Type/TypeHelper.php @@ -64,6 +64,14 @@ public static function createTypeFromTypeNode(Node $typeNode) ); } + if ($typeNode->name === 'null') { + return new NullType; + } + + if (in_array($typeNode->name, ['true', 'false'])) { + return new LiteralBooleanType($typeNode->name === 'true'); + } + return new ObjectType($typeNode->toString()); } diff --git a/tests/Support/Type/TypeHelperTest.php b/tests/Support/Type/TypeHelperTest.php index 1d7509c0..33bb3895 100644 --- a/tests/Support/Type/TypeHelperTest.php +++ b/tests/Support/Type/TypeHelperTest.php @@ -3,6 +3,7 @@ namespace Dedoc\Scramble\Tests\Support\Type; use Dedoc\Scramble\Support\Type\TypeHelper; +use PhpParser\Node; test('create type from value', function ($value, string $expectedType) { $type = TypeHelper::createTypeFromValue($value); @@ -23,6 +24,28 @@ expect($type->toString())->toBe('list{Dedoc\Scramble\Tests\Support\Type\Foo_TypeHelperTest::Foo, Dedoc\Scramble\Tests\Support\Type\Foo_TypeHelperTest::Bar}'); }); +test('create type from type node', function ($node, string $expectedType) { + $type = TypeHelper::createTypeFromTypeNode($node); + + expect($type->toString())->toBe($expectedType); +})->with([ + [new Node\Identifier('int'), 'int'], + [new Node\Identifier('string'), 'string'], + [new Node\Identifier('bool'), 'boolean'], + [new Node\Identifier('true'), 'boolean(true)'], + [new Node\Identifier('false'), 'boolean(false)'], + [new Node\Identifier('float'), 'float'], + [new Node\Identifier('array'), 'array'], + [new Node\Identifier('null'), 'null'], + [new Node\Name('App\\Models\\User'), 'App\\Models\\User'], + [new Node\NullableType(new Node\Identifier('string')), 'null|string'], + [new Node\UnionType([ + new Node\Identifier('int'), + new Node\Identifier('string'), + new Node\Identifier('null'), + ]), 'int|string|null'], +]); + enum Foo_TypeHelperTest: string { case Foo = 'f';