|
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