@@ -210,27 +210,34 @@ object TypeBuilder {
210
210
ArrayProperty (items = itemProperty)
211
211
} else if (tpe.isOption)
212
212
typeToProperty(tpe.typeArgs.head, sfs).withRequired(false )
213
- else if (tpe.isAnyVal && ! tpe.isPrimitive)
214
- typeToProperty(
215
- ptSym.asClass.primaryConstructor.asMethod.paramLists.flatten.head.typeSignature,
216
- sfs
217
- )
218
- else if (isCaseClass(ptSym) || (isSumType(ptSym) && ! isObjectEnum(ptSym)))
219
- RefProperty (tpe.simpleName)
220
- else
221
- DataType .fromType(tpe) match {
222
- case DataType .ValueDataType (name, format, qName) =>
223
- AbstractProperty (`type` = name, description = qName, format = format)
224
- case DataType .ComplexDataType (name, qName) =>
225
- AbstractProperty (`type` = name, description = qName)
226
- case DataType .ContainerDataType (name, _, _) =>
227
- AbstractProperty (`type` = name)
228
- case DataType .EnumDataType (enums) =>
229
- StringProperty (enums = enums)
213
+ else if (tpe.isAnyVal && ! tpe.isPrimitive && ptSym.isClass) {
214
+ val symbolOption = ptSym.asClass.primaryConstructor.asMethod.paramLists.flatten.headOption
215
+ symbolOption match {
216
+ case Some (symbol) =>
217
+ typeToProperty(
218
+ symbol.typeSignature,
219
+ sfs
220
+ )
221
+ case None => dataTypeFromType(tpe)
230
222
}
223
+ } else if (isCaseClass(ptSym) || (isSumType(ptSym) && ! isObjectEnum(ptSym)))
224
+ RefProperty (tpe.simpleName)
225
+ else dataTypeFromType(tpe)
231
226
}
232
227
)
233
228
229
+ private def dataTypeFromType (tpe : Type )(implicit showType : ShowType ): Property =
230
+ DataType .fromType(tpe) match {
231
+ case DataType .ValueDataType (name, format, qName) =>
232
+ AbstractProperty (`type` = name, description = qName, format = format)
233
+ case DataType .ComplexDataType (name, qName) =>
234
+ AbstractProperty (`type` = name, description = qName)
235
+ case DataType .ContainerDataType (name, _, _) =>
236
+ AbstractProperty (`type` = name)
237
+ case DataType .EnumDataType (enums) =>
238
+ StringProperty (enums = enums)
239
+ }
240
+
234
241
sealed trait DataType {
235
242
def name : String
236
243
}
@@ -288,7 +295,6 @@ object TypeBuilder {
288
295
289
296
private [swagger] def fromType (t : Type )(implicit st : ShowType ): DataType = {
290
297
val klass = if (t.isOption && t.typeArgs.nonEmpty) t.typeArgs.head else t
291
-
292
298
if (klass.isNothingOrNull || klass.isUnitOrVoid)
293
299
ComplexDataType (" string" , qualifiedName = Option (klass.fullName))
294
300
else if (isString(klass)) this .String
@@ -312,21 +318,26 @@ object TypeBuilder {
312
318
if (t.typeArgs.nonEmpty) GenArray (fromType(t.typeArgs(1 )))
313
319
else GenArray ()
314
320
} else if (klass <:< typeOf[AnyVal ]) {
315
- fromType(
316
- klass.members
317
- .filter(_.isConstructor)
318
- .flatMap(_.asMethod.paramLists.flatten)
319
- .head
320
- .typeSignature
321
- )
321
+ val klassSymbolOption = klass.members
322
+ .filter(_.isConstructor)
323
+ .flatMap(_.asMethod.paramLists.flatten)
324
+ .headOption
325
+ klassSymbolOption match {
326
+ case Some (symbol) => fromType(symbol.typeSignature)
327
+ case None => fallBackDataTypeFromName(t)
328
+ }
322
329
} else if (isObjectEnum(klass.typeSymbol)) {
323
330
EnumDataType (klass.typeSymbol.asClass.knownDirectSubclasses.map(_.name.toString))
324
331
} else {
325
- val stt = if (t.isOption) t.typeArgs.head else t
326
- ComplexDataType (" string" , qualifiedName = Option (stt.fullName))
332
+ fallBackDataTypeFromName(t)
327
333
}
328
334
}
329
335
336
+ private def fallBackDataTypeFromName (t : Type )(implicit st : ShowType ): DataType = {
337
+ val stt = if (t.isOption) t.typeArgs.head else t
338
+ ComplexDataType (" string" , qualifiedName = Option (stt.fullName))
339
+ }
340
+
330
341
private [this ] val IntTypes =
331
342
Set [Type ](
332
343
typeOf[Int ],
0 commit comments