Skip to content

Commit f8520cd

Browse files
authored
Merge pull request #281 from RafalSumislawski/issue/203-missing-isclass-check
Partially fix #203
2 parents 6844874 + 5ef7e67 commit f8520cd

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

Diff for: swagger/src/main/scala/org/http4s/rho/swagger/TypeBuilder.scala

+8-4
Original file line numberDiff line numberDiff line change
@@ -136,17 +136,21 @@ object TypeBuilder {
136136
}
137137

138138
private[this] def isObjectEnum(sym: Symbol): Boolean =
139-
sym.asClass.isSealed && sym.asClass.knownDirectSubclasses.forall { symbol =>
139+
sym.isClass && sym.asClass.isSealed && sym.asClass.knownDirectSubclasses.forall { symbol =>
140140
symbol.isModuleClass && symbol.asClass.isCaseClass
141141
}
142142

143143
private def modelToSwagger(tpe: Type, sfs: SwaggerFormats): Option[ModelImpl] =
144144
try {
145145
val TypeRef(_, sym: Symbol, tpeArgs: List[Type]) = tpe
146+
val constructor = tpe.member(termNames.CONSTRUCTOR)
147+
val typeSignature = if(constructor.owner == tpe.termSymbol) {
148+
constructor.typeSignature
149+
} else {
150+
constructor.typeSignatureIn(tpe)
151+
}
146152
val props: Map[String, Property] =
147-
tpe
148-
.member(termNames.CONSTRUCTOR)
149-
.typeSignature
153+
typeSignature
150154
.paramLists
151155
.flatten
152156
.map(paramSymToProp(sym, tpeArgs, sfs))

Diff for: swagger/src/test/scala/org/http4s/rho/swagger/TypeBuilderSpec.scala

+24
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import fs2.Stream
99
import org.http4s.rho.swagger.models.AbstractProperty
1010
import org.specs2.execute.Result
1111
import org.specs2.mutable.Specification
12+
import shapeless.{:+:, CNil}
1213

1314
import scala.reflect.runtime.universe.{TypeTag, typeOf, typeTag}
1415

@@ -52,6 +53,13 @@ package object model {
5253
sealed trait LowerLevelSealedTrait extends TopLevelSealedTrait
5354
case class Value2() extends LowerLevelSealedTrait
5455
case class Value3() extends LowerLevelSealedTrait
56+
57+
trait Outer[T]{
58+
case class Inner(t: T)
59+
}
60+
object OuterInt extends Outer[Int]
61+
62+
type ShapelessIntOrString = Int :+: String :+: CNil
5563
}
5664

5765
class TypeBuilderSpec extends Specification {
@@ -401,6 +409,22 @@ class TypeBuilderSpec extends Specification {
401409
modelOf[FooEither] must not(throwA[StackOverflowError])
402410
modelOf[FooEither].size must_== 1
403411
}
412+
413+
"Build a model for a class using type parameters of an outer class" in {
414+
val ms = modelOf[OuterInt.Inner]
415+
ms.size must_== 1
416+
val m = ms.head
417+
val t = m.properties.get("t")
418+
t should not be empty
419+
t.get.`type` must_== "integer"
420+
t.get.format must beSome("int32")
421+
}
422+
423+
"Build a model for shapless coproduct (:+:)" in {
424+
val ms = modelOf[ShapelessIntOrString]
425+
ms.size must_!== 0
426+
// It won't be a fully correct model.
427+
}
404428
}
405429

406430
"DataType" should {

0 commit comments

Comments
 (0)