aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/annotations/JsonProtocol.scala13
-rw-r--r--src/test/scala/firrtl/JsonProtocolSpec.scala12
2 files changed, 19 insertions, 6 deletions
diff --git a/src/main/scala/firrtl/annotations/JsonProtocol.scala b/src/main/scala/firrtl/annotations/JsonProtocol.scala
index 6908a3a1..24ebc781 100644
--- a/src/main/scala/firrtl/annotations/JsonProtocol.scala
+++ b/src/main/scala/firrtl/annotations/JsonProtocol.scala
@@ -315,12 +315,13 @@ object JsonProtocol extends LazyLogging {
// this used on the first invocation to check all annotations do so
def findTypeHints(classInst: Seq[JValue], requireClassField: Boolean = false): Seq[String] = classInst
.flatMap({
- case JObject(("class", JString(name)) :: fields) => name +: findTypeHints(fields.map(_._2))
- case obj: JObject if requireClassField =>
- throw new InvalidAnnotationJSONException(s"Expected field 'class' not found! $obj")
- case JObject(fields) => findTypeHints(fields.map(_._2))
- case JArray(arr) => findTypeHints(arr)
- case _ => Seq()
+ case JObject(fields) =>
+ val hint = fields.collectFirst { case ("class", JString(name)) => name }
+ if (requireClassField && hint.isEmpty)
+ throw new InvalidAnnotationJSONException(s"Expected field 'class' not found! $fields")
+ hint ++: findTypeHints(fields.map(_._2))
+ case JArray(arr) => findTypeHints(arr)
+ case _ => Seq()
})
.distinct
diff --git a/src/test/scala/firrtl/JsonProtocolSpec.scala b/src/test/scala/firrtl/JsonProtocolSpec.scala
index 0da43204..3e07542b 100644
--- a/src/test/scala/firrtl/JsonProtocolSpec.scala
+++ b/src/test/scala/firrtl/JsonProtocolSpec.scala
@@ -31,6 +31,8 @@ object JsonProtocolTestClasses {
with HasSerializationHints {
def typeHints = Seq(param.getClass)
}
+
+ case class SimpleAnnotation(alpha: String) extends NoTargetAnnotation
}
import JsonProtocolTestClasses._
@@ -68,4 +70,14 @@ class JsonProtocolSpec extends AnyFlatSpec {
val deserAnno = serializeAndDeserialize(anno)
assert(anno == deserAnno)
}
+
+ "JSON object order" should "not affect deserialization" in {
+ val anno = SimpleAnnotation("hello")
+ val serializedAnno = """[{
+ "alpha": "hello",
+ "class": "firrtlTests.JsonProtocolTestClasses$SimpleAnnotation"
+ }]"""
+ val deserAnno = JsonProtocol.deserialize(serializedAnno).head
+ assert(anno == deserAnno)
+ }
}