Skip to content

Commit 710cc5c

Browse files
jakublabnoalekitto
authored andcommitted
https://github.com/laminas/laminas-code/pull/145
1 parent 36e88dd commit 710cc5c

11 files changed

+102
-170
lines changed

src/Generator/AttributeGenerator.php

+46-18
Original file line numberDiff line numberDiff line change
@@ -5,50 +5,78 @@
55
namespace Laminas\Code\Generator;
66

77
use Laminas\Code\Generator\AttributeGenerator\AttributeAssembler;
8-
use Laminas\Code\Generator\AttributeGenerator\AttributeAssemblerBag;
9-
use Laminas\Code\Generator\AttributeGenerator\AttributeAssemblerFactory;
10-
use Laminas\Code\Generator\AttributeGenerator\AttributeBuilder;
8+
use Laminas\Code\Generator\AttributeGenerator\AttributePrototype;
9+
use Laminas\Code\Generator\AttributeGenerator\AttributeWithArgumentsAssembler;
10+
use Laminas\Code\Generator\AttributeGenerator\SimpleAttributeAssembler;
11+
use ReflectionAttribute;
1112
use ReflectionClass;
1213

13-
class AttributeGenerator extends AbstractGenerator
14+
final class AttributeGenerator implements GeneratorInterface
1415
{
15-
private function __construct(private AttributeAssemblerBag $attributeAssemblerBag)
16+
private array $assemblers;
17+
18+
private function __construct(AttributeAssembler ...$assembler)
1619
{
20+
$this->assemblers = $assembler;
1721
}
1822

1923
public function generate(): string
2024
{
21-
$generatedAttributes = array_map(fn(AttributeAssembler $attributeAssembler) => $attributeAssembler->__toString(),
22-
$this->attributeAssemblerBag->toArray(),
25+
$generatedAttributes = array_map(fn(AttributeAssembler $attributeAssembler) => $attributeAssembler->assemble(),
26+
$this->assemblers,
2327
);
2428

25-
return implode(self::LINE_FEED, $generatedAttributes);
29+
return implode(AbstractGenerator::LINE_FEED, $generatedAttributes);
2630
}
2731

28-
public static function fromReflection(ReflectionClass $reflectionClass): self
32+
public static function fromPrototype(AttributePrototype ...$attributePrototype): self
2933
{
30-
return new self(AttributeAssemblerFactory::createForClassByReflection($reflectionClass));
34+
$assemblers = [];
35+
36+
foreach ($attributePrototype as $prototype) {
37+
$assemblers[] = self::negotiateAssembler($prototype);
38+
}
39+
40+
return new self(...$assemblers);
3141
}
3242

33-
public static function fromBuilder(AttributeBuilder $attributeBuilder): self
43+
public static function fromReflection(ReflectionClass $reflectionClass): self
3444
{
35-
return new self(AttributeAssemblerFactory::createForClassFromBuilder($attributeBuilder));
45+
$attributes = $reflectionClass->getAttributes();
46+
$assemblers = [];
47+
48+
foreach ($attributes as $attribute) {
49+
$assembler = self::negotiateAssembler($attribute);
50+
51+
$assemblers[] = $assembler;
52+
}
53+
54+
return new self(...$assemblers);
3655
}
3756

3857
public static function fromArray(array $definitions): self
3958
{
40-
$builder = new AttributeBuilder();
59+
$assemblers = [];
4160

4261
foreach ($definitions as $definition) {
4362
@list($attributeName, $attributeArguments) = $definition;
4463

45-
if (!isset($attributeArguments)) {
46-
$attributeArguments = [];
47-
}
64+
$prototype = new AttributePrototype($attributeName, $attributeArguments ?? []);
65+
66+
$assemblers[] = self::negotiateAssembler($prototype);
67+
}
68+
69+
return new self(...$assemblers);
70+
}
71+
72+
private static function negotiateAssembler(ReflectionAttribute|AttributePrototype $reflectionPrototype): AttributeAssembler
73+
{
74+
$hasArguments = !empty($reflectionPrototype->getArguments());
4875

49-
$builder->add($attributeName, $attributeArguments);
76+
if ($hasArguments) {
77+
return new AttributeWithArgumentsAssembler($reflectionPrototype);
5078
}
5179

52-
return self::fromBuilder($builder);
80+
return new SimpleAttributeAssembler($reflectionPrototype);
5381
}
5482
}

src/Generator/AttributeGenerator/AttributeAssembler.php

+2-3
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44

55
namespace Laminas\Code\Generator\AttributeGenerator;
66

7-
use Stringable;
8-
9-
interface AttributeAssembler extends Stringable
7+
interface AttributeAssembler
108
{
9+
public function assemble(): string;
1110
}

src/Generator/AttributeGenerator/AttributeAssemblerBag.php

-23
This file was deleted.

src/Generator/AttributeGenerator/AttributeAssemblerFactory.php

-50
This file was deleted.

src/Generator/AttributeGenerator/AttributeBuilder.php

-29
This file was deleted.

src/Generator/AttributeGenerator/AttributePart.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
namespace Laminas\Code\Generator\AttributeGenerator;
66

77
//TODO Enum in PHP8.1
8+
/**
9+
* @internal
10+
*/
811
final class AttributePart
912
{
1013
public const T_ATTR_START = '#[';
@@ -13,6 +16,6 @@ final class AttributePart
1316
public const T_ATTR_ARGUMENTS_LIST_START = '(';
1417
public const T_ATTR_ARGUMENTS_LIST_END = ')';
1518

16-
public const T_ATTR_ARGUMENTS_LIST_ASSIGN_OPERAND = ':';
19+
public const T_ATTR_ARGUMENTS_LIST_ASSIGN_OPERAND = ': ';
1720
public const T_ATTR_ARGUMENTS_LIST_SEPARATOR = ', ';
1821
}

src/Generator/AttributeGenerator/AttributeWithArgumentsAssembler.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
final class AttributeWithArgumentsAssembler extends AbstractAttributeAssembler
1010
{
11-
public function __toString(): string
11+
public function assemble(): string
1212
{
1313
$attributeName = $this->getName();
1414

@@ -24,7 +24,7 @@ private function generateArguments(string &$output): void
2424
$argumentsList = [];
2525

2626
foreach ($this->getArguments() as $argumentName => $argumentValue) {
27-
$argumentsList[] = $argumentName . ': ' . $this->formatArgumentValue($argumentValue);
27+
$argumentsList[] = $argumentName . AttributePart::T_ATTR_ARGUMENTS_LIST_ASSIGN_OPERAND . $this->formatArgumentValue($argumentValue);
2828
}
2929

3030
$output .= implode(AttributePart::T_ATTR_ARGUMENTS_LIST_SEPARATOR, $argumentsList);

src/Generator/AttributeGenerator/SimpleAttributeAssembler.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function __construct(ReflectionAttribute $attributePrototype)
1616
$this->assertAttributeWithoutArguments();
1717
}
1818

19-
public function __toString(): string
19+
public function assemble(): string
2020
{
2121
$attributeName = $this->getName();
2222

src/Generator/ClassGenerator.php

+7-4
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ public static function fromArray(array $array)
214214
$cg->setDocBlock($docBlock);
215215
break;
216216
case 'attribute':
217-
$generator = $value instanceof AttributeBuilder ? AttributeGenerator::fromBuilder($value) : AttributeGenerator::fromArray($value);
217+
$generator = $value instanceof AttributeGenerator ? $value : AttributeGenerator::fromArray($value);
218218
$cg->setAttributes($generator);
219219
break;
220220
case 'flags':
@@ -247,17 +247,17 @@ public static function fromArray(array $array)
247247
* @psalm-param array<class-string> $interfaces
248248
* @param PropertyGenerator[]|string[]|array[] $properties
249249
* @param MethodGenerator[]|string[]|array[] $methods
250-
* @param DocBlockGenerator $docBlock
251250
*/
252251
public function __construct(
253-
$name = null,
252+
string $name = null,
254253
$namespaceName = null,
255254
$flags = null,
256255
$extends = null,
257256
array $interfaces = [],
258257
array $properties = [],
259258
array $methods = [],
260-
$docBlock = null
259+
DocBlockGenerator $docBlock = null,
260+
AttributeGenerator $attributeGenerator = null,
261261
) {
262262
$this->traitUsageGenerator = new TraitUsageGenerator($this);
263263

@@ -285,6 +285,9 @@ public function __construct(
285285
if ($docBlock !== null) {
286286
$this->setDocBlock($docBlock);
287287
}
288+
if ($attributeGenerator) {
289+
$this->setAttributes($attributeGenerator);
290+
}
288291
}
289292

290293
/**

0 commit comments

Comments
 (0)