1616use OpenCodeModeling \CodeAst \Builder \ClassMethodBuilder ;
1717use OpenCodeModeling \CodeAst \Builder \ClassPropertyBuilder ;
1818use OpenCodeModeling \CodeAst \Code \ClassConstGenerator ;
19+ use OpenCodeModeling \CodeAst \Package \ClassInfo ;
1920use OpenCodeModeling \CodeAst \Package \ClassInfoList ;
2021use OpenCodeModeling \JsonSchemaToPhp \Type \ArrayType ;
2122use OpenCodeModeling \JsonSchemaToPhp \Type \ObjectType ;
@@ -59,7 +60,7 @@ public function __construct(
5960 * @param ClassBuilderCollection $classBuilderCollection Collection for other classes
6061 * @param TypeSet $typeSet
6162 * @param string $srcFolder Source folder for namespace imports
62- * @param string|null $className Class name of other classes
63+ * @param string|null $className Class name is used from $classBuilder if not set
6364 * @return void
6465 */
6566 public function generateClasses (
@@ -79,6 +80,7 @@ public function generateClasses(
7980 ) {
8081 $ type = $ refType ->first ();
8182 }
83+ $ className = $ className ?: $ classBuilder ->getName ();
8284
8385 switch (true ) {
8486 case $ type instanceof ObjectType:
@@ -117,7 +119,12 @@ public function generateClasses(
117119 $ propertyClassName
118120 );
119121 $ classBuilder ->addNamespaceImport ($ classNamespace . '\\' . $ propertyClassName );
120- $ classBuilder ->addProperty (ClassPropertyBuilder::fromScratch ($ propertyPropertyName , $ propertyClassName ));
122+ $ classBuilder ->addProperty (
123+ ClassPropertyBuilder::fromScratch (
124+ $ propertyPropertyName ,
125+ $ propertyType ->isNullable () ? ('? ' . $ propertyClassName ) : $ propertyClassName
126+ )
127+ );
121128 break ;
122129 case $ propertyType instanceof ReferenceType:
123130 if ($ propertyRefType = $ propertyType ->resolvedType ()) {
@@ -132,7 +139,10 @@ public function generateClasses(
132139 $ classBuilder ->addNamespaceImport ($ classNamespace . '\\' . $ propertyClassName );
133140 }
134141 $ classBuilder ->addProperty (
135- ClassPropertyBuilder::fromScratch ($ propertyPropertyName , $ propertyClassName )
142+ ClassPropertyBuilder::fromScratch (
143+ $ propertyPropertyName ,
144+ $ propertyType ->isNullable () ? ('? ' . $ propertyClassName ) : $ propertyClassName
145+ )
136146 );
137147 break ;
138148 case $ propertyType instanceof ScalarType:
@@ -143,7 +153,7 @@ public function generateClasses(
143153 $ classBuilder ->addProperty (
144154 ClassPropertyBuilder::fromScratch (
145155 $ propertyPropertyName ,
146- $ propertyClassName
156+ $ propertyType -> isNullable () ? ( ' ? ' . $ propertyClassName ) : $ propertyClassName
147157 )
148158 );
149159 break ;
@@ -246,15 +256,23 @@ public function generateValueObject(string $className, string $classNamespace, T
246256 * @param ClassBuilderCollection $classBuilderCollection
247257 * @param Parser $parser
248258 * @param PrettyPrinterAbstract $printer
259+ * @param callable|null $currentFileAst Callable to return current file AST, if null, file will be overwritten
249260 * @return array<string, string> List of filename => code
250261 */
251262 public function generateFiles (
252263 ClassBuilderCollection $ classBuilderCollection ,
253264 Parser $ parser ,
254- PrettyPrinterAbstract $ printer
265+ PrettyPrinterAbstract $ printer ,
266+ callable $ currentFileAst = null
255267 ): array {
256268 $ files = [];
257269
270+ if ($ currentFileAst === null ) {
271+ $ currentFileAst = static function (ClassBuilder $ classBuilder , ClassInfo $ classInfo ) {
272+ return [];
273+ };
274+ }
275+
258276 $ previousNamespace = '__invalid//namespace__ ' ;
259277
260278 foreach ($ classBuilderCollection as $ classBuilder ) {
@@ -269,7 +287,10 @@ public function generateFiles(
269287 $ nodeTraverser = new NodeTraverser ();
270288 $ classBuilder ->injectVisitors ($ nodeTraverser , $ parser );
271289
272- $ files [$ filename ] = $ printer ->prettyPrintFile ($ nodeTraverser ->traverse ([]));
290+ $ files [$ filename ] = $ printer ->prettyPrintFile (
291+ // @phpstan-ignore-next-line
292+ $ nodeTraverser ->traverse ($ currentFileAst ($ classBuilder , $ classInfo ))
293+ );
273294 }
274295
275296 return $ files ;
0 commit comments