From d37d389700a3def554c4edbd39dfb9ee9f812a0c Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Fri, 15 Mar 2019 17:09:48 +0100
Subject: [PATCH] add more checks during serialization

---
 src/main/jastadd/Analysis.jrag |  9 +++++++++
 src/main/jastadd/Backend.jadd  | 10 ++++++++++
 2 files changed, 19 insertions(+)

diff --git a/src/main/jastadd/Analysis.jrag b/src/main/jastadd/Analysis.jrag
index 48f1e58..941256e 100644
--- a/src/main/jastadd/Analysis.jrag
+++ b/src/main/jastadd/Analysis.jrag
@@ -118,6 +118,15 @@ aspect ComponentAnalysis {
     // TODO
     return true;
   }
+
+  syn boolean Component.isList() = false;
+  eq ListComponent.isList() = true;
+
+  syn boolean Component.isOpt() = false;
+  eq OptComponent.isOpt() = true;
+
+  syn boolean Component.isNullable() = false;
+  eq TokenComponent.isNullable() = !"float double int short long char byte boolean".contains(getTypeUse().getID());
 }
 
 aspect InstanceSupplier {
diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd
index 528e453..b4d174d 100644
--- a/src/main/jastadd/Backend.jadd
+++ b/src/main/jastadd/Backend.jadd
@@ -1051,10 +1051,20 @@ aspect Serializer {
     sb.append(ind(4) + "g.writeObjectFieldStart(fieldName);\n");
     sb.append(ind(3) + "}\n");
     sb.append(ind(3) + "g.writeStringField(\"" + jsonTypeKey + "\", \"" + getID() + "\");\n");
+    sb.append(ind(3) + "if (__uid() == null) throw new SerializationException(\"The unique identifier of " + getID() + " is missing.\");\n");
     sb.append(ind(3) + "g.writeStringField(\"id\", __uid());\n");
     if (componentsTransitive().size() > 0) {
       sb.append(ind(3) + "g.writeObjectFieldStart(\"children\");\n");
       for (Component child : componentsTransitive()) {
+        if (child.isNullable()) {
+          String componentAccessor = child.getID();
+          if (child.isList()) {
+            componentAccessor += "List";
+          } else if (child.isOpt()) {
+            componentAccessor += "Opt";
+          }
+          sb.append(ind(3) + "if (get" + componentAccessor + "() == null) throw new SerializationException(\"The component " + child.getID() + " of " + getID() + " is missing.\");\n");
+        }
         child.serialize(sb, 3);
       }
       sb.append(ind(3) + "g.writeEndObject(); // children\n");
-- 
GitLab