From dc66c8857fec7adaa513b104cadc791ec4c2b09a Mon Sep 17 00:00:00 2001 From: "Wesley W. Terpstra" Date: Mon, 30 Jan 2017 14:25:12 -0800 Subject: [PATCH] diplomacy: be more robust using Java introspection If an error occures, some objects might only be partially initialized. We want to still be able to get nice names for error messages. --- src/main/scala/diplomacy/LazyModule.scala | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/scala/diplomacy/LazyModule.scala b/src/main/scala/diplomacy/LazyModule.scala index 0bb76434..bd721b59 100644 --- a/src/main/scala/diplomacy/LazyModule.scala +++ b/src/main/scala/diplomacy/LazyModule.scala @@ -27,10 +27,15 @@ abstract class LazyModule()(implicit val p: Parameters) m.getName != "children" }.flatMap { m => if (classOf[LazyModule].isAssignableFrom(m.getReturnType)) { - Seq((m.getName, m.invoke(this))) + val obj = m.invoke(this) + if (obj eq null) Seq() else Seq((m.getName, obj)) } else if (classOf[Seq[LazyModule]].isAssignableFrom(m.getReturnType)) { - m.invoke(this).asInstanceOf[Seq[Object]].zipWithIndex.map { case (l, i) => - (m.getName + "_" + i, l) + val obj = m.invoke(this) + if (obj eq null) Seq() else { + val seq = try { obj.asInstanceOf[Seq[Object]] } catch { case _ => null } + if (seq eq null) Seq() else { + seq.zipWithIndex.map { case (l, i) => (m.getName + "_" + i, l) } + } } } else Seq() }