16
16
use OpenCodeModeling \CodeAst \Builder \ClassMethodBuilder ;
17
17
use OpenCodeModeling \CodeAst \Builder \ClassPropertyBuilder ;
18
18
use OpenCodeModeling \CodeAst \Code \ClassConstGenerator ;
19
+ use OpenCodeModeling \CodeAst \Package \ClassInfo ;
19
20
use OpenCodeModeling \CodeAst \Package \ClassInfoList ;
20
21
use OpenCodeModeling \JsonSchemaToPhp \Type \ArrayType ;
21
22
use OpenCodeModeling \JsonSchemaToPhp \Type \ObjectType ;
@@ -59,7 +60,7 @@ public function __construct(
59
60
* @param ClassBuilderCollection $classBuilderCollection Collection for other classes
60
61
* @param TypeSet $typeSet
61
62
* @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
63
64
* @return void
64
65
*/
65
66
public function generateClasses (
@@ -79,6 +80,7 @@ public function generateClasses(
79
80
) {
80
81
$ type = $ refType ->first ();
81
82
}
83
+ $ className = $ className ?: $ classBuilder ->getName ();
82
84
83
85
switch (true ) {
84
86
case $ type instanceof ObjectType:
@@ -117,7 +119,12 @@ public function generateClasses(
117
119
$ propertyClassName
118
120
);
119
121
$ 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
+ );
121
128
break ;
122
129
case $ propertyType instanceof ReferenceType:
123
130
if ($ propertyRefType = $ propertyType ->resolvedType ()) {
@@ -132,7 +139,10 @@ public function generateClasses(
132
139
$ classBuilder ->addNamespaceImport ($ classNamespace . '\\' . $ propertyClassName );
133
140
}
134
141
$ classBuilder ->addProperty (
135
- ClassPropertyBuilder::fromScratch ($ propertyPropertyName , $ propertyClassName )
142
+ ClassPropertyBuilder::fromScratch (
143
+ $ propertyPropertyName ,
144
+ $ propertyType ->isNullable () ? ('? ' . $ propertyClassName ) : $ propertyClassName
145
+ )
136
146
);
137
147
break ;
138
148
case $ propertyType instanceof ScalarType:
@@ -143,7 +153,7 @@ public function generateClasses(
143
153
$ classBuilder ->addProperty (
144
154
ClassPropertyBuilder::fromScratch (
145
155
$ propertyPropertyName ,
146
- $ propertyClassName
156
+ $ propertyType -> isNullable () ? ( ' ? ' . $ propertyClassName ) : $ propertyClassName
147
157
)
148
158
);
149
159
break ;
@@ -246,15 +256,23 @@ public function generateValueObject(string $className, string $classNamespace, T
246
256
* @param ClassBuilderCollection $classBuilderCollection
247
257
* @param Parser $parser
248
258
* @param PrettyPrinterAbstract $printer
259
+ * @param callable|null $currentFileAst Callable to return current file AST, if null, file will be overwritten
249
260
* @return array<string, string> List of filename => code
250
261
*/
251
262
public function generateFiles (
252
263
ClassBuilderCollection $ classBuilderCollection ,
253
264
Parser $ parser ,
254
- PrettyPrinterAbstract $ printer
265
+ PrettyPrinterAbstract $ printer ,
266
+ callable $ currentFileAst = null
255
267
): array {
256
268
$ files = [];
257
269
270
+ if ($ currentFileAst === null ) {
271
+ $ currentFileAst = static function (ClassBuilder $ classBuilder , ClassInfo $ classInfo ) {
272
+ return [];
273
+ };
274
+ }
275
+
258
276
$ previousNamespace = '__invalid//namespace__ ' ;
259
277
260
278
foreach ($ classBuilderCollection as $ classBuilder ) {
@@ -269,7 +287,10 @@ public function generateFiles(
269
287
$ nodeTraverser = new NodeTraverser ();
270
288
$ classBuilder ->injectVisitors ($ nodeTraverser , $ parser );
271
289
272
- $ files [$ filename ] = $ printer ->prettyPrintFile ($ nodeTraverser ->traverse ([]));
290
+ $ files [$ filename ] = $ printer ->prettyPrintFile (
291
+ // @phpstan-ignore-next-line
292
+ $ nodeTraverser ->traverse ($ currentFileAst ($ classBuilder , $ classInfo ))
293
+ );
273
294
}
274
295
275
296
return $ files ;
0 commit comments