Skip to content

Commit 25284f4

Browse files
committed
Add support to generate class constants for properties - Close #13
1 parent c0757fd commit 25284f4

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

src/ClassGenerator.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212

1313
use OpenCodeModeling\CodeAst\Builder\ClassBuilder;
1414
use OpenCodeModeling\CodeAst\Builder\ClassBuilderCollection;
15+
use OpenCodeModeling\CodeAst\Builder\ClassConstBuilder;
1516
use OpenCodeModeling\CodeAst\Builder\ClassMethodBuilder;
1617
use OpenCodeModeling\CodeAst\Builder\ClassPropertyBuilder;
18+
use OpenCodeModeling\CodeAst\Code\ClassConstGenerator;
1719
use OpenCodeModeling\CodeAst\Package\ClassInfoList;
1820
use OpenCodeModeling\JsonSchemaToPhp\Type\ArrayType;
1921
use OpenCodeModeling\JsonSchemaToPhp\Type\ObjectType;
@@ -167,6 +169,8 @@ public function generateClasses(
167169
}
168170

169171
/**
172+
* Generation of getter methods for value object are skipped.
173+
*
170174
* @param ClassBuilderCollection $classBuilderCollection
171175
* @param bool $typed
172176
* @param callable $methodNameFilter Filter the property name to your desired method name e.g. with get prefix
@@ -194,6 +198,39 @@ public function addGetterMethods(
194198
}
195199
}
196200

201+
/**
202+
* Generation of constants for value object are skipped.
203+
*
204+
* @param ClassBuilderCollection $classBuilderCollection
205+
* @param callable $constantNameFilter Converts the name to a proper class constant name
206+
* @param callable $constantValueFilter Converts the name to a proper class constant value e.g. snake_case or camelCase
207+
* @param int $visibility Visibility of the class constant
208+
*/
209+
public function addClassConstantsForProperties(
210+
ClassBuilderCollection $classBuilderCollection,
211+
callable $constantNameFilter,
212+
callable $constantValueFilter,
213+
int $visibility = ClassConstGenerator::FLAG_PUBLIC
214+
): void {
215+
foreach ($classBuilderCollection as $classBuilder) {
216+
foreach ($classBuilder->getProperties() as $classPropertyBuilder) {
217+
$constantName = ($constantNameFilter)($classPropertyBuilder->getName());
218+
219+
if ($this->isValueObject($classBuilder)
220+
|| $classBuilder->hasConstant($constantName)) {
221+
continue 2;
222+
}
223+
$classBuilder->addConstant(
224+
ClassConstBuilder::fromScratch(
225+
$constantName,
226+
($constantValueFilter)($classPropertyBuilder->getName()),
227+
$visibility
228+
)
229+
);
230+
}
231+
}
232+
}
233+
197234
public function generateValueObject(string $className, string $classNamespace, TypeDefinition $definition): ClassBuilder
198235
{
199236
$classBuilder = $this->valueObjectFactory->classBuilder($definition);

tests/ClassGeneratorTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,11 @@ public function it_generates_files(): void
117117
$this->assertCount(7, $classBuilderCollection);
118118

119119
$this->classGenerator->addGetterMethods($classBuilderCollection, true, FilterFactory::methodNameFilter());
120+
$this->classGenerator->addClassConstantsForProperties(
121+
$classBuilderCollection,
122+
FilterFactory::constantNameFilter(),
123+
FilterFactory::constantValueFilter()
124+
);
120125

121126
$files = $this->classGenerator->generateFiles($classBuilderCollection, $this->parser, $this->printer);
122127

@@ -310,6 +315,8 @@ private function assertOrderFile(string $code): void
310315
use Acme\ShippingAddresses;
311316
final class Order
312317
{
318+
public const BILLING_ADDRESS = 'billing_address';
319+
public const SHIPPING_ADDRESSES = 'shipping_addresses';
313320
private Address $billingAddress;
314321
private ShippingAddresses $shippingAddresses;
315322
public function billingAddress() : Address
@@ -467,6 +474,9 @@ private function assertAddressFile(string $code): void
467474
use Acme\State;
468475
final class Address
469476
{
477+
public const STREET_ADDRESS = 'street_address';
478+
public const CITY = 'city';
479+
public const FEDERAL_STATE = 'federal_state';
470480
private StreetAddress $streetAddress;
471481
private City $city;
472482
private State $federalState;
@@ -500,6 +510,9 @@ private function assertBillingAddressFile(string $code): void
500510
use Acme\State;
501511
final class BillingAddress
502512
{
513+
public const STREET_ADDRESS = 'street_address';
514+
public const CITY = 'city';
515+
public const FEDERAL_STATE = 'federal_state';
503516
private StreetAddress $streetAddress;
504517
private City $city;
505518
private State $federalState;

0 commit comments

Comments
 (0)