Skip to content

Commit c0757fd

Browse files
committed
Add support to generate getter methods - Close #13
1 parent a004669 commit c0757fd

File tree

2 files changed

+74
-8
lines changed

2 files changed

+74
-8
lines changed

src/ClassGenerator.php

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
use OpenCodeModeling\CodeAst\Builder\ClassBuilder;
1414
use OpenCodeModeling\CodeAst\Builder\ClassBuilderCollection;
15+
use OpenCodeModeling\CodeAst\Builder\ClassMethodBuilder;
1516
use OpenCodeModeling\CodeAst\Builder\ClassPropertyBuilder;
1617
use OpenCodeModeling\CodeAst\Package\ClassInfoList;
1718
use OpenCodeModeling\JsonSchemaToPhp\Type\ArrayType;
@@ -39,23 +40,16 @@ final class ClassGenerator
3940
*/
4041
private $propertyNameFilter;
4142

42-
/**
43-
* @var callable
44-
*/
45-
private $methodNameFilter;
46-
4743
public function __construct(
4844
ClassInfoList $classInfoList,
4945
ValueObjectFactory $valueObjectFactory,
5046
callable $classNameFilter,
51-
callable $propertyNameFilter,
52-
callable $methodNameFilter
47+
callable $propertyNameFilter
5348
) {
5449
$this->classInfoList = $classInfoList;
5550
$this->valueObjectFactory = $valueObjectFactory;
5651
$this->classNameFilter = $classNameFilter;
5752
$this->propertyNameFilter = $propertyNameFilter;
58-
$this->methodNameFilter = $methodNameFilter;
5953
}
6054

6155
/**
@@ -172,6 +166,34 @@ public function generateClasses(
172166
}
173167
}
174168

169+
/**
170+
* @param ClassBuilderCollection $classBuilderCollection
171+
* @param bool $typed
172+
* @param callable $methodNameFilter Filter the property name to your desired method name e.g. with get prefix
173+
*/
174+
public function addGetterMethods(
175+
ClassBuilderCollection $classBuilderCollection,
176+
bool $typed,
177+
callable $methodNameFilter
178+
): void {
179+
foreach ($classBuilderCollection as $classBuilder) {
180+
foreach ($classBuilder->getProperties() as $classPropertyBuilder) {
181+
$methodName = ($methodNameFilter)($classPropertyBuilder->getName());
182+
183+
if ($this->isValueObject($classBuilder)
184+
|| $classBuilder->hasMethod($methodName)) {
185+
continue 2;
186+
}
187+
$classBuilder->addMethod(
188+
ClassMethodBuilder::fromScratch($methodName, $typed)
189+
->setReturnType($classPropertyBuilder->getType())
190+
->setReturnTypeDocBlockHint($classPropertyBuilder->getTypeDocBlockHint())
191+
->setBody('return $this->' . $classPropertyBuilder->getName() . ';')
192+
);
193+
}
194+
}
195+
}
196+
175197
public function generateValueObject(string $className, string $classNamespace, TypeDefinition $definition): ClassBuilder
176198
{
177199
$classBuilder = $this->valueObjectFactory->classBuilder($definition);
@@ -204,6 +226,7 @@ public function generateFiles(
204226
$classInfo = $this->classInfoList->classInfoForNamespace($previousNamespace);
205227
$path = $classInfo->getPath($classBuilder->getNamespace() . '\\' . $classBuilder->getName());
206228
}
229+
// @phpstan-ignore-next-line
207230
$filename = $classInfo->getFilenameFromPathAndName($path, $classBuilder->getName());
208231

209232
$nodeTraverser = new NodeTraverser();
@@ -239,4 +262,13 @@ private function addNamespaceImport(ClassBuilder $classBuilder, TypeDefinition $
239262
break;
240263
}
241264
}
265+
266+
private function isValueObject(ClassBuilder $classBuilder): bool
267+
{
268+
return $classBuilder->hasMethod('fromItems')
269+
|| $classBuilder->hasMethod('toString')
270+
|| $classBuilder->hasMethod('toInt')
271+
|| $classBuilder->hasMethod('toFloat')
272+
|| $classBuilder->hasMethod('toBool');
273+
}
242274
}

tests/ClassGeneratorTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ public function it_generates_files(): void
116116

117117
$this->assertCount(7, $classBuilderCollection);
118118

119+
$this->classGenerator->addGetterMethods($classBuilderCollection, true, FilterFactory::methodNameFilter());
120+
119121
$files = $this->classGenerator->generateFiles($classBuilderCollection, $this->parser, $this->printer);
120122

121123
$this->assertCount(7, $files);
@@ -310,6 +312,14 @@ final class Order
310312
{
311313
private Address $billingAddress;
312314
private ShippingAddresses $shippingAddresses;
315+
public function billingAddress() : Address
316+
{
317+
return $this->billingAddress;
318+
}
319+
public function shippingAddresses() : ShippingAddresses
320+
{
321+
return $this->shippingAddresses;
322+
}
313323
}
314324
PHP;
315325
$this->assertSame($expected, $code);
@@ -460,6 +470,18 @@ final class Address
460470
private StreetAddress $streetAddress;
461471
private City $city;
462472
private State $federalState;
473+
public function streetAddress() : StreetAddress
474+
{
475+
return $this->streetAddress;
476+
}
477+
public function city() : City
478+
{
479+
return $this->city;
480+
}
481+
public function federalState() : State
482+
{
483+
return $this->federalState;
484+
}
463485
}
464486
PHP;
465487
$this->assertSame($expected, $code);
@@ -481,6 +503,18 @@ final class BillingAddress
481503
private StreetAddress $streetAddress;
482504
private City $city;
483505
private State $federalState;
506+
public function streetAddress() : StreetAddress
507+
{
508+
return $this->streetAddress;
509+
}
510+
public function city() : City
511+
{
512+
return $this->city;
513+
}
514+
public function federalState() : State
515+
{
516+
return $this->federalState;
517+
}
484518
}
485519
PHP;
486520
$this->assertSame($expected, $code);

0 commit comments

Comments
 (0)