@goast/kotlin 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -30,11 +30,11 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
30
30
  }
31
31
  generateApiInterfaceFileContent(ctx, builder) {
32
32
  builder
33
- .apply((builder) => this.generateApiInterfaceAnnotations(ctx, builder))
33
+ .append((builder) => this.generateApiInterfaceAnnotations(ctx, builder))
34
34
  .ensureCurrentLineEmpty()
35
- .apply((builder) => this.generateApiInterfaceSignature(ctx, builder))
35
+ .append((builder) => this.generateApiInterfaceSignature(ctx, builder))
36
36
  .append(' ')
37
- .parenthesizeMultiline('{}', (builder) => this.generateApiInterfaceContent(ctx, builder));
37
+ .parenthesize('{}', (builder) => this.generateApiInterfaceContent(ctx, builder), { multiline: true });
38
38
  }
39
39
  generateApiInterfaceAnnotations(ctx, builder) {
40
40
  builder
@@ -48,23 +48,25 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
48
48
  }
49
49
  generateApiInterfaceContent(ctx, builder) {
50
50
  builder
51
- .apply((builder) => this.generateApiInterfaceDelegateAccessor(ctx, builder))
51
+ .append((builder) => this.generateApiInterfaceDelegateAccessor(ctx, builder))
52
52
  .ensurePreviousLineEmpty()
53
- .apply((builder) => this.generateApiInterfaceMethods(ctx, builder));
53
+ .append((builder) => this.generateApiInterfaceMethods(ctx, builder));
54
54
  }
55
55
  generateApiInterfaceDelegateAccessor(ctx, builder) {
56
56
  builder.appendLine(`fun getDelegate(): ${this.getApiDelegateInterfaceName(ctx)} = object : ${this.getApiDelegateInterfaceName(ctx)} {}`);
57
57
  }
58
58
  generateApiInterfaceMethods(ctx, builder) {
59
- builder.forEach(ctx.service.endpoints, (builder, endpoint) => builder.ensurePreviousLineEmpty().apply((builder) => this.generateApiInterfaceMethod(ctx, builder, endpoint)));
59
+ builder.forEach(ctx.service.endpoints, (builder, endpoint) => builder.ensurePreviousLineEmpty().append((builder) => this.generateApiInterfaceMethod(ctx, builder, endpoint)));
60
60
  }
61
61
  generateApiInterfaceMethod(ctx, builder, endpoint) {
62
62
  builder
63
- .apply((builder) => this.generateApiInterfaceMethodAnnnotations(ctx, builder, endpoint))
63
+ .append((builder) => this.generateApiInterfaceMethodAnnnotations(ctx, builder, endpoint))
64
64
  .ensureCurrentLineEmpty()
65
- .apply((builder) => this.generateApiInterfaceMethodSignature(ctx, builder, endpoint))
65
+ .append((builder) => this.generateApiInterfaceMethodSignature(ctx, builder, endpoint))
66
66
  .append(' ')
67
- .parenthesizeMultiline('{}', (builder) => this.generateApiInterfaceMethodContent(ctx, builder, endpoint));
67
+ .parenthesize('{}', (builder) => this.generateApiInterfaceMethodContent(ctx, builder, endpoint), {
68
+ multiline: true,
69
+ });
68
70
  }
69
71
  generateApiInterfaceMethodAnnnotations(ctx, builder, endpoint) {
70
72
  var _a, _b, _c;
@@ -75,7 +77,7 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
75
77
  ['description', this.toStringLiteral(ctx, (_b = endpoint.description) === null || _b === void 0 ? void 0 : _b.trim())],
76
78
  [
77
79
  'responses',
78
- (builder) => builder.parenthesizeMultiline('[]', (builder) => builder.forEachSeparated(endpoint.responses, ',\n', (builder, response) => builder
80
+ (builder) => builder.parenthesize('[]', (builder) => builder.forEach(endpoint.responses, (builder, response) => builder
79
81
  .append('ApiResponse')
80
82
  .addImport('ApiResponse', 'io.swagger.v3.oas.annotations.responses')
81
83
  .parenthesize('()', (builder) => {
@@ -83,7 +85,7 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
83
85
  return builder
84
86
  .append(`responseCode = ${this.toStringLiteral(ctx, (_a = response.statusCode) === null || _a === void 0 ? void 0 : _a.toString())}, `)
85
87
  .append(`description = ${this.toStringLiteral(ctx, (_b = response.description) === null || _b === void 0 ? void 0 : _b.trim())}`);
86
- }))),
88
+ }), { separator: ',\n' }), { multiline: true }),
87
89
  endpoint.responses.length > 0,
88
90
  ],
89
91
  ])
@@ -101,13 +103,15 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
101
103
  generateApiInterfaceMethodSignature(ctx, builder, endpoint) {
102
104
  builder
103
105
  .append(`suspend fun ${(0, core_1.toCasing)(endpoint.name, 'camel')}`)
104
- .parenthesizeMultiline('()', (builder) => this.generateApiInterfaceMethodParameters(ctx, builder, endpoint))
106
+ .parenthesize('()', (builder) => this.generateApiInterfaceMethodParameters(ctx, builder, endpoint), {
107
+ multiline: true,
108
+ })
105
109
  .append(': ')
106
- .apply((builder) => this.generateApiInterfaceMethodReturnType(ctx, builder, endpoint));
110
+ .append((builder) => this.generateApiInterfaceMethodReturnType(ctx, builder, endpoint));
107
111
  }
108
112
  generateApiInterfaceMethodParameters(ctx, builder, endpoint) {
109
113
  const parameters = this.getAllParameters(ctx, endpoint);
110
- builder.forEachSeparated(parameters, ',\n', (builder, parameter) => this.generateApiInterfaceMethodParameter(ctx, builder, endpoint, parameter));
114
+ builder.forEach(parameters, (builder, parameter) => this.generateApiInterfaceMethodParameter(ctx, builder, endpoint, parameter), { separator: ',\n' });
111
115
  }
112
116
  generateApiInterfaceMethodReturnType(ctx, builder, endpoint) {
113
117
  var _a, _b;
@@ -115,9 +119,9 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
115
119
  }
116
120
  generateApiInterfaceMethodParameter(ctx, builder, endpoint, parameter) {
117
121
  builder
118
- .apply((builder) => this.generateApiInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter))
122
+ .append((builder) => this.generateApiInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter))
119
123
  .ensureCurrentLineEmpty()
120
- .apply((builder) => this.generateApiInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter));
124
+ .append((builder) => this.generateApiInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter));
121
125
  }
122
126
  generateApiInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter) {
123
127
  var _a, _b, _c, _d, _e, _f, _g, _h;
@@ -158,16 +162,20 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
158
162
  }
159
163
  }
160
164
  generateApiInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter) {
165
+ var _a;
161
166
  builder
162
167
  .append((0, core_1.toCasing)(parameter.name, 'camel'))
163
168
  .append(': ')
164
- .apply((builder) => this.generateTypeUsage(ctx, builder, parameter.schema));
169
+ .append((builder) => this.generateTypeUsage(ctx, builder, parameter.schema))
170
+ .append(!parameter.required && !((_a = parameter.schema) === null || _a === void 0 ? void 0 : _a.nullable) ? '?' : '');
165
171
  }
166
172
  generateApiInterfaceMethodContent(ctx, builder, endpoint) {
167
173
  const parameters = this.getAllParameters(ctx, endpoint);
168
174
  builder
169
175
  .append(`return getDelegate().${(0, core_1.toCasing)(endpoint.name, 'camel')}(`)
170
- .forEachSeparated(parameters, ', ', (builder, parameter) => builder.append((0, core_1.toCasing)(parameter.name, 'camel')))
176
+ .forEach(parameters, (builder, parameter) => builder.append((0, core_1.toCasing)(parameter.name, 'camel')), {
177
+ separator: ', ',
178
+ })
171
179
  .append(')');
172
180
  }
173
181
  generateApiControllerFile(ctx, dirPath, packageName) {
@@ -182,11 +190,11 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
182
190
  }
183
191
  generateApiControllerFileContent(ctx, builder) {
184
192
  builder
185
- .apply((builder) => this.generateApiControllerAnnotations(ctx, builder))
193
+ .append((builder) => this.generateApiControllerAnnotations(ctx, builder))
186
194
  .ensureCurrentLineEmpty()
187
- .apply((builder) => this.generateApiControllerSignature(ctx, builder))
195
+ .append((builder) => this.generateApiControllerSignature(ctx, builder))
188
196
  .append(' ')
189
- .parenthesizeMultiline('{}', (builder) => this.generateApiControllerContent(ctx, builder));
197
+ .parenthesize('{}', (builder) => this.generateApiControllerContent(ctx, builder), { multiline: true });
190
198
  }
191
199
  generateApiControllerAnnotations(ctx, builder) {
192
200
  builder
@@ -202,7 +210,7 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
202
210
  builder
203
211
  .append('class ')
204
212
  .append(this.getApiControllerName(ctx))
205
- .parenthesizeMultiline('()', (builder) => this.generateApiControllerParameters(ctx, builder))
213
+ .parenthesize('()', (builder) => this.generateApiControllerParameters(ctx, builder), { multiline: true })
206
214
  .append(' : ')
207
215
  .append(this.getApiInterfaceName(ctx));
208
216
  }
@@ -219,10 +227,10 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
219
227
  .appendLine(this.getApiDelegateInterfaceName(ctx))
220
228
  .appendLine()
221
229
  .append('init ')
222
- .parenthesizeMultiline('{}', (builder) => builder
230
+ .parenthesize('{}', (builder) => builder
223
231
  .append('this.delegate = Optional.ofNullable(delegate).orElse')
224
232
  .addImport('Optional', 'java.util')
225
- .parenthesize('()', (builder) => builder.append('object : ').append(this.getApiDelegateInterfaceName(ctx)).append(' {}')))
233
+ .parenthesize('()', (builder) => builder.append('object : ').append(this.getApiDelegateInterfaceName(ctx)).append(' {}')), { multiline: true })
226
234
  .appendLine()
227
235
  .appendLine()
228
236
  .appendLine(`override fun getDelegate(): ${this.getApiDelegateInterfaceName(ctx)} = delegate`);
@@ -239,11 +247,11 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
239
247
  }
240
248
  generateApiDelegateInterfaceFileContent(ctx, builder) {
241
249
  builder
242
- .apply((builder) => this.generateApiDelegateInterfaceAnnotations(ctx, builder))
250
+ .append((builder) => this.generateApiDelegateInterfaceAnnotations(ctx, builder))
243
251
  .ensureCurrentLineEmpty()
244
- .apply((builder) => this.generateApiDelegateInterfaceSignature(ctx, builder))
252
+ .append((builder) => this.generateApiDelegateInterfaceSignature(ctx, builder))
245
253
  .append(' ')
246
- .parenthesizeMultiline('{}', (builder) => this.generateApiDelegateInterfaceContent(ctx, builder));
254
+ .parenthesize('{}', (builder) => this.generateApiDelegateInterfaceContent(ctx, builder), { multiline: true });
247
255
  }
248
256
  generateApiDelegateInterfaceAnnotations(ctx, builder) {
249
257
  builder.appendAnnotation('Generated', 'jakarta.annotation', [
@@ -260,15 +268,17 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
260
268
  .addImport('NativeWebRequest', 'org.springframework.web.context.request')
261
269
  .forEach(ctx.service.endpoints, (builder, endpoint) => builder
262
270
  .ensurePreviousLineEmpty()
263
- .apply((builder) => this.generateApiDelegateInterfaceMethod(ctx, builder, endpoint)));
271
+ .append((builder) => this.generateApiDelegateInterfaceMethod(ctx, builder, endpoint)));
264
272
  }
265
273
  generateApiDelegateInterfaceMethod(ctx, builder, endpoint) {
266
274
  builder
267
- .apply((builder) => this.generateApiDelegateInterfaceMethodAnnnotations(ctx, builder, endpoint))
275
+ .append((builder) => this.generateApiDelegateInterfaceMethodAnnnotations(ctx, builder, endpoint))
268
276
  .ensureCurrentLineEmpty()
269
- .apply((builder) => this.generateApiDelegateInterfaceMethodSignature(ctx, builder, endpoint))
277
+ .append((builder) => this.generateApiDelegateInterfaceMethodSignature(ctx, builder, endpoint))
270
278
  .append(' ')
271
- .parenthesizeMultiline('{}', (builder) => this.generateApiDelegateInterfaceMethodContent(ctx, builder, endpoint));
279
+ .parenthesize('{}', (builder) => this.generateApiDelegateInterfaceMethodContent(ctx, builder, endpoint), {
280
+ multiline: true,
281
+ });
272
282
  }
273
283
  generateApiDelegateInterfaceMethodAnnnotations(ctx, builder, endpoint) {
274
284
  // None for now.
@@ -276,13 +286,15 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
276
286
  generateApiDelegateInterfaceMethodSignature(ctx, builder, endpoint) {
277
287
  builder
278
288
  .append(`suspend fun ${(0, core_1.toCasing)(endpoint.name, 'camel')}`)
279
- .parenthesizeMultiline('()', (builder) => this.generateApiDelegateInterfaceMethodParameters(ctx, builder, endpoint))
289
+ .parenthesize('()', (builder) => this.generateApiDelegateInterfaceMethodParameters(ctx, builder, endpoint), {
290
+ multiline: true,
291
+ })
280
292
  .append(': ')
281
- .apply((builder) => this.generateApiDelegateInterfaceMethodReturnType(ctx, builder, endpoint));
293
+ .append((builder) => this.generateApiDelegateInterfaceMethodReturnType(ctx, builder, endpoint));
282
294
  }
283
295
  generateApiDelegateInterfaceMethodParameters(ctx, builder, endpoint) {
284
296
  const parameters = this.getAllParameters(ctx, endpoint);
285
- builder.forEachSeparated(parameters, ',\n', (builder, parameter) => this.generateApiDelegateInterfaceMethodParameter(ctx, builder, endpoint, parameter));
297
+ builder.forEach(parameters, (builder, parameter) => this.generateApiDelegateInterfaceMethodParameter(ctx, builder, endpoint, parameter), { separator: ',\n' });
286
298
  }
287
299
  generateApiDelegateInterfaceMethodReturnType(ctx, builder, endpoint) {
288
300
  var _a, _b;
@@ -290,18 +302,20 @@ class DefaultKotlinSpringControllerGenerator extends file_generator_1.KotlinFile
290
302
  }
291
303
  generateApiDelegateInterfaceMethodParameter(ctx, builder, endpoint, parameter) {
292
304
  builder
293
- .apply((builder) => this.generateApiDelegateInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter))
305
+ .append((builder) => this.generateApiDelegateInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter))
294
306
  .ensureCurrentLineEmpty()
295
- .apply((builder) => this.generateApiDelegateInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter));
307
+ .append((builder) => this.generateApiDelegateInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter));
296
308
  }
297
309
  generateApiDelegateInterfaceMethodParameterAnnotations(ctx, builder, endpoint, parameter) {
298
310
  // None for now.
299
311
  }
300
312
  generateApiDelegateInterfaceMethodParameterSignature(ctx, builder, endpoint, parameter) {
313
+ var _a;
301
314
  builder
302
315
  .append((0, core_1.toCasing)(parameter.name, 'camel'))
303
316
  .append(': ')
304
- .apply((builder) => this.generateTypeUsage(ctx, builder, parameter.schema));
317
+ .append((builder) => this.generateTypeUsage(ctx, builder, parameter.schema))
318
+ .append(!parameter.required && !((_a = parameter.schema) === null || _a === void 0 ? void 0 : _a.nullable) ? '?' : '');
305
319
  }
306
320
  generateApiDelegateInterfaceMethodContent(ctx, builder, endpoint) {
307
321
  builder
@@ -35,9 +35,9 @@ export class KotlinFileBuilder extends SourceBuilder {
35
35
  allArgs.reduce((c, [key, value]) => { var _a; return c + (key ? key.length + 3 : 0) + ((_a = value === null || value === void 0 ? void 0 : value.length) !== null && _a !== void 0 ? _a : 0); }, 0) > 80;
36
36
  this.parenthesize('()', (builder) => builder
37
37
  .appendLineIf(multiline)
38
- .forEachSeparated(allArgs, multiline ? ',\n' : ', ', (builder, [name, value]) => builder
38
+ .forEach(allArgs, (builder, [name, value]) => builder
39
39
  .append(name ? `${name} = ` : '')
40
- .apply((builder) => (typeof value === 'string' ? builder.append(value) : value(builder))))
40
+ .append((builder) => (typeof value === 'string' ? builder.append(value) : value(builder))), { separator: multiline ? ',\n' : ', ' })
41
41
  .appendLineIf(multiline));
42
42
  }
43
43
  this.appendLine();
@@ -49,11 +49,11 @@ export class KotlinFileBuilder extends SourceBuilder {
49
49
  }
50
50
  toString(addPadding = true) {
51
51
  return new SourceBuilder(this.options)
52
- .applyIf(this.packageName !== undefined, (builder) => builder.appendLine(`package ${this.packageName}`).appendLine())
53
- .apply((builder) => this.imports.writeTo(builder))
54
- .applyIf(addPadding, (builder) => builder.ensurePreviousLineEmpty())
52
+ .if(this.packageName !== undefined, (builder) => builder.appendLine(`package ${this.packageName}`).appendLine())
53
+ .append((builder) => this.imports.writeTo(builder))
54
+ .if(addPadding, (builder) => builder.ensurePreviousLineEmpty())
55
55
  .append(super.toString())
56
- .applyIf(addPadding, (builder) => builder.ensureCurrentLineEmpty())
56
+ .if(addPadding, (builder) => builder.ensureCurrentLineEmpty())
57
57
  .toString();
58
58
  }
59
59
  }
@@ -1,6 +1,6 @@
1
1
  import { dirname } from 'path';
2
2
  import { ensureDirSync, writeFileSync } from 'fs-extra';
3
- import { resolveAnyOfAndAllOf, toCasing } from '@goast/core';
3
+ import { getSchemaReference, resolveAnyOfAndAllOf, toCasing, } from '@goast/core';
4
4
  import { KotlinFileBuilder } from '../../file-builder';
5
5
  import { KotlinFileGenerator } from '../file-generator';
6
6
  export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
@@ -28,7 +28,7 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
28
28
  }
29
29
  }
30
30
  if (this.shouldGenerateTypeDeclaration(ctx, ctx.schema)) {
31
- const typeName = this.getDeclarationTypeName(ctx);
31
+ const typeName = this.getDeclarationTypeName(ctx, ctx.schema);
32
32
  const packageName = ctx.config.packageName + ctx.config.packageSuffix;
33
33
  const filePath = `${ctx.config.outputDir}/${packageName.replace(/\./g, '/')}/${typeName}.kt`;
34
34
  console.log(`Generating model ${packageName}.${typeName} to ${filePath}...`);
@@ -49,8 +49,9 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
49
49
  generateFileContent(ctx, builder) {
50
50
  let schema = ctx.schema;
51
51
  if (schema.kind === 'oneOf') {
52
- schema = ctx.config.oneOfBehavior === 'treat-as-any-of'
53
- ? Object.assign(Object.assign({}, schema), { kind: 'combined', anyOf: schema.oneOf, allOf: [], oneOf: undefined }) : Object.assign(Object.assign({}, schema), { kind: 'combined', allOf: schema.oneOf, anyOf: [], oneOf: undefined });
52
+ schema =
53
+ ctx.config.oneOfBehavior === 'treat-as-any-of'
54
+ ? Object.assign(Object.assign({}, schema), { kind: 'combined', anyOf: schema.oneOf, allOf: [], oneOf: undefined }) : Object.assign(Object.assign({}, schema), { kind: 'combined', allOf: schema.oneOf, anyOf: [], oneOf: undefined });
54
55
  ctx.schema = schema;
55
56
  }
56
57
  if (schema.kind === 'object' || schema.kind === 'combined') {
@@ -69,6 +70,20 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
69
70
  this.generateType(ctx, builder, schema);
70
71
  }
71
72
  }
73
+ generateTypeUsage(ctx, builder, schema) {
74
+ schema = getSchemaReference(schema, ['description']);
75
+ if (this.shouldGenerateTypeDeclaration(ctx, schema)) {
76
+ const name = this.getDeclarationTypeName(ctx, schema);
77
+ const packageName = ctx.config.packageName + ctx.config.packageSuffix;
78
+ if (packageName) {
79
+ builder.addImport(name, packageName);
80
+ }
81
+ builder.append(name);
82
+ }
83
+ else {
84
+ this.generateType(ctx, builder, schema);
85
+ }
86
+ }
72
87
  generateObjectType(ctx, builder, schema) {
73
88
  if (schema.properties.size === 0) {
74
89
  if (schema.additionalProperties) {
@@ -92,13 +107,13 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
92
107
  }
93
108
  generateObjectInterface(ctx, builder, schema) {
94
109
  builder
95
- .apply((builder) => this.generateDocumentation(ctx, builder, schema))
110
+ .append((builder) => this.generateDocumentation(ctx, builder, schema))
96
111
  .ensureCurrentLineEmpty()
97
- .apply((builder) => this.generateObjectInterfaceAnnotations(ctx, builder, schema))
112
+ .append((builder) => this.generateObjectInterfaceAnnotations(ctx, builder, schema))
98
113
  .ensureCurrentLineEmpty()
99
- .apply((builder) => this.generateObjectInterfaceSignature(ctx, builder, schema))
114
+ .append((builder) => this.generateObjectInterfaceSignature(ctx, builder, schema))
100
115
  .append(' ')
101
- .parenthesizeMultiline('{}', (builder) => this.generateObjectInterfaceMembers(ctx, builder, schema));
116
+ .parenthesize('{}', (builder) => this.generateObjectInterfaceMembers(ctx, builder, schema), { multiline: true });
102
117
  }
103
118
  generateObjectInterfaceAnnotations(ctx, builder, schema) {
104
119
  if (schema.discriminator) {
@@ -110,66 +125,64 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
110
125
  ]);
111
126
  const entries = Object.entries(schema.discriminator.mapping);
112
127
  if (entries.length > 0) {
113
- builder.appendAnnotation('JsonSubTypes', 'com.fasterxml.jackson.annotation', entries.map(([value, schema]) => (builder) => {
114
- const schemaResult = ctx.getSchemaResult(schema);
115
- builder
116
- .append(`JsonSubTypes.Type(value = ${schemaResult.typeName}::class, name = ${this.toStringLiteral(ctx, value)})`)
117
- .addImport(schemaResult.typeName, schemaResult.packageName);
118
- }));
128
+ builder.appendAnnotation('JsonSubTypes', 'com.fasterxml.jackson.annotation', entries.map(([value, schema]) => (builder) => builder.append('JsonSubTypes.Type(value = ', (builder) => this.generateTypeUsage(ctx, builder, schema), `::class, name = ${this.toStringLiteral(ctx, value)})`)));
119
129
  }
120
130
  }
121
131
  }
122
132
  generateObjectInterfaceSignature(ctx, builder, schema) {
123
- builder.append('interface ').append(this.getDeclarationTypeName(ctx));
133
+ builder.append('interface ').append(this.getDeclarationTypeName(ctx, schema));
124
134
  }
125
135
  generateObjectInterfaceMembers(ctx, builder, schema) {
126
136
  builder.forEach(this.sortProperties(ctx, schema, schema.properties.values()), (builder, property) => builder
127
137
  .ensurePreviousLineEmpty()
128
- .apply((builder) => this.generateJsonPropertyAnnotation(ctx, builder, schema, property, 'get'))
138
+ .append((builder) => this.generateJsonPropertyAnnotation(ctx, builder, schema, property, 'get'))
129
139
  .ensureCurrentLineEmpty()
130
140
  .append(`val ${toCasing(property.name, 'camel')}: `)
131
- .apply((builder) => this.generateType(ctx, builder, property.schema))
132
- .applyIf(!schema.required.has(property.name), (builder) => builder.appendIf(!property.schema.nullable, '?').append(' = null')));
141
+ .append((builder) => this.generateTypeUsage(ctx, builder, property.schema))
142
+ .if(!schema.required.has(property.name), (builder) => builder.appendIf(!property.schema.nullable, '?').append(' = null')));
133
143
  }
134
144
  generateObjectDataClass(ctx, builder, schema) {
135
- const inheritedSchemas = schema.inheritedSchemas.filter((x) => this.shouldGenerateTypeDeclaration(ctx, x) && !x.isNameGenerated).filter((item, index, self) => self.indexOf(item) === index);
145
+ const inheritedSchemas = schema.inheritedSchemas
146
+ .filter((x) => this.shouldGenerateTypeDeclaration(ctx, x) && !x.isNameGenerated)
147
+ .filter((item, index, self) => self.indexOf(item) === index);
136
148
  builder
137
- .apply((builder) => this.generateDocumentation(ctx, builder, schema))
149
+ .append((builder) => this.generateDocumentation(ctx, builder, schema))
138
150
  .append('data class ')
139
- .append(this.getDeclarationTypeName(ctx))
140
- .parenthesizeMultilineIf(schema.properties.size > 0, '()', (builder) => builder.forEachSeparated(this.sortProperties(ctx, schema, schema.properties.values()), ',\n', (builder, property) => builder
151
+ .append(this.getDeclarationTypeName(ctx, schema))
152
+ .parenthesizeIf(schema.properties.size > 0, '()', (builder) => builder.forEach(this.sortProperties(ctx, schema, schema.properties.values()), (builder, property) => builder
141
153
  .ensurePreviousLineEmpty()
142
- .apply((builder) => this.generateObjectDataClassParameterAnnotations(ctx, builder, schema, property))
154
+ .append((builder) => this.generateObjectDataClassParameterAnnotations(ctx, builder, schema, property))
143
155
  .appendIf(inheritedSchemas.some((x) => this.hasProperty(ctx, x, property.name)), 'override ')
144
156
  .append(`val ${toCasing(property.name, 'camel')}: `)
145
- .apply((builder) => this.generateType(ctx, builder, property.schema))
146
- .applyIf(!schema.required.has(property.name), (builder) => builder.appendIf(!property.schema.nullable, '?').append(' = null'))))
147
- .applyIf(inheritedSchemas.length > 0, (builder) => builder
157
+ .append((builder) => this.generateTypeUsage(ctx, builder, property.schema))
158
+ .if(!schema.required.has(property.name), (builder) => builder.appendIf(!property.schema.nullable, '?').append(' = null')), { separator: ',\n' }), { multiline: true })
159
+ .if(inheritedSchemas.length > 0, (builder) => builder
148
160
  .append(' : ')
149
- .forEachSeparated(inheritedSchemas, ', ', (builder, schema) => builder.append(toCasing(schema.name, 'pascal'))) // TODO: Calling generateType here will lead to endless loop
150
- )
161
+ .forEach(inheritedSchemas, (builder, schema) => this.generateTypeUsage(ctx, builder, schema), {
162
+ separator: ', ',
163
+ }))
151
164
  .append(' ')
152
- .parenthesizeMultilineIf(schema.additionalProperties !== undefined && schema.additionalProperties !== false, '{}', (builder) => builder.applyIf(schema.additionalProperties !== undefined && schema.additionalProperties !== false, (builder) => builder
165
+ .parenthesizeIf(schema.additionalProperties !== undefined && schema.additionalProperties !== false, '{}', (builder) => builder.if(schema.additionalProperties !== undefined && schema.additionalProperties !== false, (builder) => builder
153
166
  .appendLine('@JsonIgnore')
154
167
  .addImport('JsonIgnore', 'com.fasterxml.jackson.annotation')
155
168
  .append('val additionalProperties: Mutable')
156
- .apply((builder) => this.generateMapType(ctx, builder, schema))
169
+ .append((builder) => this.generateMapType(ctx, builder, schema))
157
170
  .appendLine(' = mutableMapOf()')
158
171
  .appendLine()
159
172
  .appendLine('@JsonAnySetter')
160
173
  .addImport('JsonAnySetter', 'com.fasterxml.jackson.annotation')
161
174
  .append('fun set')
162
- .parenthesize('()', (builder) => builder.append('name: String, value: ').applyIfElse(schema.additionalProperties === true, (builder) => builder.append('Any?'), (builder) => this.generateType(ctx, builder, schema.additionalProperties)))
175
+ .parenthesize('()', (builder) => builder.append('name: String, value: ').if(schema.additionalProperties === true, (builder) => builder.append('Any?'), (builder) => this.generateTypeUsage(ctx, builder, schema.additionalProperties)))
163
176
  .append(' ')
164
- .parenthesizeMultiline('{}', 'this.additionalProperties[name] = value')
177
+ .parenthesize('{}', 'this.additionalProperties[name] = value', { multiline: true })
165
178
  .appendLine()
166
179
  .appendLine()
167
180
  .appendLine('@JsonAnyGetter')
168
181
  .addImport('JsonAnyGetter', 'com.fasterxml.jackson.annotation')
169
182
  .append('fun getMap(): ')
170
- .apply((builder) => this.generateMapType(ctx, builder, schema))
183
+ .append((builder) => this.generateMapType(ctx, builder, schema))
171
184
  .append(' ')
172
- .parenthesizeMultiline('{}', 'return this.additionalProperties')));
185
+ .parenthesize('{}', 'return this.additionalProperties', { multiline: true })), { multiline: true });
173
186
  }
174
187
  generateObjectDataClassParameterAnnotations(ctx, builder, schema, property) {
175
188
  this.generatePropertyValidationAnnotations(ctx, builder, schema, property);
@@ -203,7 +216,9 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
203
216
  builder
204
217
  .append('@Schema')
205
218
  .addImport('Schema', 'io.swagger.v3.oas.annotations.media')
206
- .parenthesizeIf(parts.size > 0, '()', (builder) => builder.forEachSeparated(parts.entries(), ', ', (builder, [key, value]) => builder.append(`${key} = ${value}`)))
219
+ .parenthesizeIf(parts.size > 0, '()', (builder) => builder.forEach(parts.entries(), (builder, [key, value]) => builder.append(`${key} = ${value}`), {
220
+ separator: ', ',
221
+ }))
207
222
  .appendLine();
208
223
  }
209
224
  generateJsonPropertyAnnotation(ctx, builder, schema, property, scope) {
@@ -214,7 +229,7 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
214
229
  .append(this.toStringLiteral(ctx, property.name))
215
230
  .appendIf(schema.required.has(property.name), ', required = true'))
216
231
  .appendLine()
217
- .applyIf(property.schema.custom['exclude-when-null'] === true, (builder) => builder
232
+ .if(property.schema.custom['exclude-when-null'] === true, (builder) => builder
218
233
  .append('@get:JsonInclude')
219
234
  .addImport('JsonInclude', 'com.fasterxml.jackson.annotation')
220
235
  .parenthesize('()', 'JsonInclude.Include.NON_NULL')
@@ -228,22 +243,10 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
228
243
  const propertiesType = schema.additionalProperties;
229
244
  builder
230
245
  .append('Map')
231
- .parenthesize('<>', (builder) => builder.append('String, ').apply((builder) => this.generateType(ctx, builder, propertiesType)));
246
+ .parenthesize('<>', (builder) => builder.append('String, ').append((builder) => this.generateTypeUsage(ctx, builder, propertiesType)));
232
247
  }
233
248
  }
234
249
  generateType(ctx, builder, schema) {
235
- if (this.shouldGenerateTypeDeclaration(ctx, schema)) {
236
- if (schema === ctx.schema) {
237
- builder.append('Any?');
238
- return;
239
- }
240
- const schemaResult = ctx.getSchemaResult(schema);
241
- builder.append(schemaResult.typeName);
242
- if (schemaResult.packageName) {
243
- builder.addImport(schemaResult.typeName, schemaResult.packageName);
244
- }
245
- return;
246
- }
247
250
  switch (schema.kind) {
248
251
  case 'boolean':
249
252
  builder.append('Boolean');
@@ -320,23 +323,23 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
320
323
  }
321
324
  generateEnum(ctx, builder, schema) {
322
325
  builder
323
- .apply((builder) => this.generateDocumentation(ctx, builder, schema))
326
+ .append((builder) => this.generateDocumentation(ctx, builder, schema))
324
327
  .append('enum class ')
325
- .append(this.getDeclarationTypeName(ctx))
328
+ .append(this.getDeclarationTypeName(ctx, schema))
326
329
  .append('(val value: String) ')
327
- .parenthesizeMultiline('{}', (builder) => {
330
+ .parenthesize('{}', (builder) => {
328
331
  var _a;
329
- return builder.forEachSeparated((_a = schema.enum) !== null && _a !== void 0 ? _a : [], (builder) => builder.appendLine(',').appendLine(), (builder, value) => builder
332
+ return builder.forEach((_a = schema.enum) !== null && _a !== void 0 ? _a : [], (builder, value) => builder
330
333
  .append('@JsonProperty')
331
334
  .addImport('JsonProperty', 'com.fasterxml.jackson.annotation')
332
335
  .parenthesize('()', this.toStringLiteral(ctx, String(value)))
333
336
  .appendLine()
334
337
  .append(toCasing(String(value), 'snake'))
335
- .parenthesize('()', this.toStringLiteral(ctx, String(value))));
336
- });
338
+ .parenthesize('()', this.toStringLiteral(ctx, String(value))), { separator: (builder) => builder.appendLine(',').appendLine() });
339
+ }, { multiline: true });
337
340
  }
338
341
  generateArrayType(ctx, builder, schema) {
339
- builder.append('List').parenthesize('<>', (builder) => builder.applyIfElse(schema.items === undefined, (builder) => builder.append('Any?'), (builder) => this.generateType(ctx, builder, schema.items)));
342
+ builder.append('List').parenthesize('<>', (builder) => builder.if(schema.items === undefined, (builder) => builder.append('Any?'), (builder) => this.generateTypeUsage(ctx, builder, schema.items)));
340
343
  }
341
344
  generateDocumentation(ctx, builder, schema) {
342
345
  var _a, _b;
@@ -345,7 +348,7 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
345
348
  builder
346
349
  .ensurePreviousLineEmpty()
347
350
  .appendLine('/**')
348
- .applyWithLinePrefix(' * ', (builder) => builder
351
+ .appendWithLinePrefix(' * ', (builder) => builder
349
352
  .appendLineIf(!!schema.description, schema.description)
350
353
  .forEach(propertiesWithDescription, (builder, property) => { var _a; return builder.appendLine(`@param ${toCasing(property.name, 'camel')} ${(_a = property.schema.description) === null || _a === void 0 ? void 0 : _a.trim()}`); }))
351
354
  .appendLine(' */');
@@ -372,8 +375,8 @@ export class DefaultKotlinModelGenerator extends KotlinFileGenerator {
372
375
  }
373
376
  return true;
374
377
  }
375
- getDeclarationTypeName(ctx) {
376
- return toCasing(ctx.schema.name, 'pascal');
378
+ getDeclarationTypeName(ctx, schema) {
379
+ return toCasing(schema.name, 'pascal');
377
380
  }
378
381
  sortProperties(ctx, schema, properties) {
379
382
  return [...properties].sort((a, b) => {
@@ -16,7 +16,7 @@ export class KotlinModelsGenerator extends OpenApiSchemasGenerationProviderBase
16
16
  }
17
17
  generateSchema(ctx, schema) {
18
18
  const modelGenerator = this._modelGeneratorFactory.create();
19
- return modelGenerator.generate(Object.assign(Object.assign({}, ctx), { schema, getSchemaResult: (schema) => this.getSchemaResult(ctx, schema) }));
19
+ return modelGenerator.generate(Object.assign(Object.assign({}, ctx), { schema }));
20
20
  }
21
21
  addSchemaResult(ctx, schema, result) {
22
22
  ctx.output.models[schema.id] = result;