|
12 | 12 |
|
13 | 13 | use OpenCodeModeling\CodeAst\Builder\ClassBuilder; |
14 | 14 | use OpenCodeModeling\CodeAst\Builder\ClassBuilderCollection; |
| 15 | +use OpenCodeModeling\CodeAst\Builder\ClassMethodBuilder; |
15 | 16 | use OpenCodeModeling\CodeAst\Builder\ClassPropertyBuilder; |
16 | 17 | use OpenCodeModeling\CodeAst\Package\ClassInfoList; |
17 | 18 | use OpenCodeModeling\JsonSchemaToPhp\Type\ArrayType; |
@@ -39,23 +40,16 @@ final class ClassGenerator |
39 | 40 | */ |
40 | 41 | private $propertyNameFilter; |
41 | 42 |
|
42 | | - /** |
43 | | - * @var callable |
44 | | - */ |
45 | | - private $methodNameFilter; |
46 | | - |
47 | 43 | public function __construct( |
48 | 44 | ClassInfoList $classInfoList, |
49 | 45 | ValueObjectFactory $valueObjectFactory, |
50 | 46 | callable $classNameFilter, |
51 | | - callable $propertyNameFilter, |
52 | | - callable $methodNameFilter |
| 47 | + callable $propertyNameFilter |
53 | 48 | ) { |
54 | 49 | $this->classInfoList = $classInfoList; |
55 | 50 | $this->valueObjectFactory = $valueObjectFactory; |
56 | 51 | $this->classNameFilter = $classNameFilter; |
57 | 52 | $this->propertyNameFilter = $propertyNameFilter; |
58 | | - $this->methodNameFilter = $methodNameFilter; |
59 | 53 | } |
60 | 54 |
|
61 | 55 | /** |
@@ -172,6 +166,34 @@ public function generateClasses( |
172 | 166 | } |
173 | 167 | } |
174 | 168 |
|
| 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 | + |
175 | 197 | public function generateValueObject(string $className, string $classNamespace, TypeDefinition $definition): ClassBuilder |
176 | 198 | { |
177 | 199 | $classBuilder = $this->valueObjectFactory->classBuilder($definition); |
@@ -204,6 +226,7 @@ public function generateFiles( |
204 | 226 | $classInfo = $this->classInfoList->classInfoForNamespace($previousNamespace); |
205 | 227 | $path = $classInfo->getPath($classBuilder->getNamespace() . '\\' . $classBuilder->getName()); |
206 | 228 | } |
| 229 | + // @phpstan-ignore-next-line |
207 | 230 | $filename = $classInfo->getFilenameFromPathAndName($path, $classBuilder->getName()); |
208 | 231 |
|
209 | 232 | $nodeTraverser = new NodeTraverser(); |
@@ -239,4 +262,13 @@ private function addNamespaceImport(ClassBuilder $classBuilder, TypeDefinition $ |
239 | 262 | break; |
240 | 263 | } |
241 | 264 | } |
| 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 | + } |
242 | 274 | } |
0 commit comments