Skip to content

Commit de371cb

Browse files
authored
Merge pull request #166 from laminas/value_generator_enum_support
Support generating properties, constants and parameter default values with ENUM references
2 parents 27f73dd + 793801d commit de371cb

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

src/Generator/ValueGenerator.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use ArrayObject as SplArrayObject;
66
use Laminas\Code\Exception\InvalidArgumentException;
77
use Laminas\Stdlib\ArrayObject as StdlibArrayObject;
8+
use UnitEnum;
89

910
use function addcslashes;
1011
use function array_keys;
@@ -23,7 +24,6 @@
2324
use function sprintf;
2425
use function str_contains;
2526
use function str_repeat;
26-
use function strpos;
2727

2828
class ValueGenerator extends AbstractGenerator
2929
{
@@ -44,6 +44,7 @@ class ValueGenerator extends AbstractGenerator
4444
public const TYPE_ARRAY_LONG = 'array_long';
4545
public const TYPE_CONSTANT = 'constant';
4646
public const TYPE_NULL = 'null';
47+
public const TYPE_ENUM = 'enum';
4748
public const TYPE_OBJECT = 'object';
4849
public const TYPE_OTHER = 'other';
4950
/**#@-*/
@@ -286,6 +287,7 @@ protected function getValidatedType($type)
286287
self::TYPE_ARRAY_LONG,
287288
self::TYPE_CONSTANT,
288289
self::TYPE_NULL,
290+
self::TYPE_ENUM,
289291
self::TYPE_OBJECT,
290292
self::TYPE_OTHER,
291293
];
@@ -326,6 +328,10 @@ public function getAutoDeterminedType($value)
326328
case 'NULL':
327329
return self::TYPE_NULL;
328330
case 'object':
331+
if ($value instanceof UnitEnum) {
332+
return self::TYPE_ENUM;
333+
}
334+
// enums are typed as objects, so this fall through is intentional
329335
case 'resource':
330336
case 'unknown type':
331337
default:
@@ -440,6 +446,13 @@ public function generate()
440446
}
441447
$output .= $endArray;
442448
break;
449+
case self::TYPE_ENUM:
450+
if (! is_object($value)) {
451+
throw new Exception\RuntimeException('Value is not an object.');
452+
}
453+
454+
$output = sprintf('\%s::%s', $value::class, (string) $value->name);
455+
break;
443456
case self::TYPE_OTHER:
444457
default:
445458
throw new Exception\RuntimeException(sprintf(
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace LaminasTest\Code\Generator\TestAsset;
4+
5+
enum TestEnum
6+
{
7+
case Test1;
8+
case Test2;
9+
}

test/Generator/ValueGeneratorTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
use Laminas\Code\Generator\PropertyValueGenerator;
1313
use Laminas\Code\Generator\ValueGenerator;
1414
use Laminas\Stdlib\ArrayObject as StdlibArrayObject;
15+
use LaminasTest\Code\Generator\TestAsset\TestEnum;
1516
use PHPUnit\Framework\TestCase;
1617

1718
use function fopen;
19+
use function sprintf;
1820
use function str_replace;
1921

2022
/**
@@ -388,6 +390,20 @@ public function testPropertyDefaultValueCanHandleBool()
388390
self::assertNotEquals($valueGenerator1->generate(), $valueGenerator2->generate());
389391
}
390392

393+
public function testPropertyDefaultValueCanHandleEnums(): void
394+
{
395+
$valueGenerator1 = new ValueGenerator(
396+
TestEnum::Test1,
397+
ValueGenerator::TYPE_AUTO,
398+
ValueGenerator::OUTPUT_MULTIPLE_LINE
399+
);
400+
401+
$valueGenerator2 = new ValueGenerator(TestEnum::Test2);
402+
403+
self::assertSame('\LaminasTest\Code\Generator\TestAsset\TestEnum::Test1', $valueGenerator1->generate());
404+
self::assertSame('\LaminasTest\Code\Generator\TestAsset\TestEnum::Test2', $valueGenerator2->generate());
405+
}
406+
391407
/**
392408
* @dataProvider simpleArray
393409
* @param string $type

0 commit comments

Comments
 (0)