Skip to content

Commit 4c1bc86

Browse files
authored
edge case test (#173)
* edge-case-test * Update ErasureHelper.scala
1 parent dfb4f68 commit 4c1bc86

File tree

2 files changed

+50
-20
lines changed

2 files changed

+50
-20
lines changed
Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,46 @@
11
package com.github.swagger.scala.converter
22

3+
import org.slf4j.LoggerFactory
4+
35
import scala.reflect.runtime.universe
46
import scala.util.Try
7+
import scala.util.control.NonFatal
58

69
private[converter] object ErasureHelper {
10+
private val logger = LoggerFactory.getLogger(ErasureHelper.getClass)
711

812
def erasedOptionalPrimitives(cls: Class[_]): Map[String, Class[_]] = {
9-
val mirror = universe.runtimeMirror(cls.getClassLoader)
10-
11-
val moduleSymbol = mirror.moduleSymbol(Class.forName(cls.getName))
12-
val ConstructorName = "apply"
13-
val companion: universe.Symbol = moduleSymbol.typeSignature.member(universe.TermName(ConstructorName))
14-
val properties =
15-
Try(companion.asTerm.alternatives.head.asMethod.paramLists.flatten).getOrElse {
16-
val sym = mirror.staticClass(cls.getName)
17-
sym.selfType.members
18-
.filterNot(_.isMethod)
19-
.filterNot(_.isClass)
20-
}
13+
try {
14+
val mirror = universe.runtimeMirror(cls.getClassLoader)
15+
val moduleSymbol = mirror.moduleSymbol(Class.forName(cls.getName))
16+
val ConstructorName = "apply"
17+
val companion: universe.Symbol = moduleSymbol.typeSignature.member(universe.TermName(ConstructorName))
18+
val properties =
19+
Try(companion.asTerm.alternatives.head.asMethod.paramLists.flatten).getOrElse {
20+
val sym = mirror.staticClass(cls.getName)
21+
sym.selfType.members
22+
.filterNot(_.isMethod)
23+
.filterNot(_.isClass)
24+
}
2125

22-
properties.flatMap { prop: universe.Symbol =>
23-
val maybeClass: Option[Class[_]] = prop.typeSignature.typeArgs.headOption.flatMap { signature =>
24-
if (signature.typeSymbol.isClass) {
25-
Option(mirror.runtimeClass(signature.typeSymbol.asClass))
26-
} else None
26+
properties.flatMap { prop: universe.Symbol =>
27+
val maybeClass: Option[Class[_]] = prop.typeSignature.typeArgs.headOption.flatMap { signature =>
28+
if (signature.typeSymbol.isClass) {
29+
Option(mirror.runtimeClass(signature.typeSymbol.asClass))
30+
} else None
31+
}
32+
maybeClass.map(prop.name.toString.trim -> _)
33+
}.toMap
34+
} catch {
35+
case NonFatal(t) => {
36+
if (logger.isDebugEnabled) {
37+
//use this form because of Scala 2.11 & 2.12 compile issue
38+
logger.debug(s"Unable to get type info ${Option(cls.getName).getOrElse("null")}", t)
39+
} else {
40+
logger.info("Unable to get type info {}", Option(cls.getName).getOrElse("null"))
41+
}
42+
Map.empty[String, Class[_]]
2743
}
28-
maybeClass.map(prop.name.toString.trim -> _)
29-
}.toMap
44+
}
3045
}
31-
3246
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.github.swagger.scala.converter
2+
3+
import org.scalatest.flatspec.AnyFlatSpec
4+
import org.scalatest.matchers.should.Matchers
5+
6+
object ErasureHelperTest {
7+
private trait SuperType {
8+
def getFoo: String
9+
}
10+
}
11+
12+
class ErasureHelperTest extends AnyFlatSpec with Matchers {
13+
"ErasureHelper" should "handle MyTrait" in {
14+
ErasureHelper.erasedOptionalPrimitives(classOf[ErasureHelperTest.SuperType]) shouldBe empty
15+
}
16+
}

0 commit comments

Comments
 (0)