From 78bb20ddfef0e9d66c1051f8ed3bd8dc3508be36 Mon Sep 17 00:00:00 2001 From: Johannes Mey <johannes.mey@tu-dresden.de> Date: Mon, 11 Mar 2019 13:35:03 +0100 Subject: [PATCH] fi token and enum serialisation and add tests --- src/main/jastadd/Backend.jadd | 24 ++++++++------- src/test/jastadd/Utils.jadd | 16 ++++++---- src/test/jastadd/serializer/Serializer.relast | 15 +++++++++- .../org/jastadd/relast/tests/Serializer.java | 30 +++++++++++++++++++ 4 files changed, 67 insertions(+), 18 deletions(-) diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd index 9b0fce8..f4f4322 100644 --- a/src/main/jastadd/Backend.jadd +++ b/src/main/jastadd/Backend.jadd @@ -84,6 +84,8 @@ aspect BackendAspect { public void Program.generateAspect(StringBuilder sb) { sb.append("import java.util.ArrayList;\n"); sb.append("import java.util.Collections;\n"); + sb.append("import java.time.Instant;\n"); + sb.append("import java.time.Period;\n"); sb.append("aspect RelAstAPI {\n"); for (TypeDecl td: getTypeDecls()) { @@ -1034,15 +1036,15 @@ aspect Serializer { case "String": sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "());\n"); break; - case "java.time.Instant": - sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "()).toString());\n"); + case "Instant": + sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "().toString());\n"); break; - case "java.time.Period": - sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "()).toString());\n"); + case "Period": + sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "().toString());\n"); break; default: // assume that the type is an enum. there is no way of checking this here - sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "()).name());\n"); + sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "().name());\n"); // sb.append("throw new DeserializationException(\"Unable to deserialize child node of type \"" + getTypeUse() + "\"\")") } } @@ -1192,7 +1194,7 @@ aspect Serializer { case "Character": sb.append(ind(indent) + "String chars = children.get(\"" + getID() + "\").asText();\n"); sb.append(ind(indent) + "if (chars.length() == 1) {\n"); - sb.append(ind(indent + 2) + "element.set" + getID() + "(chars.charAt(0))\n"); + sb.append(ind(indent + 2) + "element.set" + getID() + "(chars.charAt(0));\n"); sb.append(ind(indent) + "} else {\n"); sb.append(ind(indent + 2) + "throw new DeserializationException(\"unable to deserialize char '\" + chars + \"'\");\n"); sb.append(ind(indent) + "}\n"); @@ -1200,15 +1202,15 @@ aspect Serializer { case "String": sb.append(ind(indent) + "element.set" + getID() + "(children.get(\"" + getID() + "\").asText());\n"); break; - case "java.time.Instant": - sb.append(ind(indent) + "element.set" + getID() + "(java.time.Instant.parse(children.get(\"" + getID() + "\").asText()));\n"); + case "Instant": + sb.append(ind(indent) + "element.set" + getID() + "(Instant.parse(children.get(\"" + getID() + "\").asText()));\n"); break; - case "java.time.Period": - sb.append(ind(indent) + "element.set" + getID() + "(java.time.Period.parse(children.get(\"" + getID() + "\").asText()));\n"); + case "Period": + sb.append(ind(indent) + "element.set" + getID() + "(Period.parse(children.get(\"" + getID() + "\").asText()));\n"); break; default: // assume that the type is an enum. there is no way of checking this here - sb.append(ind(indent) + "element.set" + getID() + "Enum.valueOf(" + type + ".getClass(), children.get(\"" + getID() + "\".asText())));\n"); + sb.append(ind(indent) + "element.set" + getID() + "(Enum.valueOf(" + type + ".class, children.get(\"" + getID() + "\").asText()));\n"); // sb.append("throw new DeserializationException(\"Unable to deserialize child node of type \"" + getTypeUse() + "\"\")") } diff --git a/src/test/jastadd/Utils.jadd b/src/test/jastadd/Utils.jadd index d7acb1b..e0e012f 100644 --- a/src/test/jastadd/Utils.jadd +++ b/src/test/jastadd/Utils.jadd @@ -1,9 +1,13 @@ aspect Utils { - public String A.toString() { - return getName(); - } + public String A.toString() { + return getName(); + } - public String B.toString() { - return getName(); - } + public String B.toString() { + return getName(); + } + + public enum Weekday { + MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY + } } \ No newline at end of file diff --git a/src/test/jastadd/serializer/Serializer.relast b/src/test/jastadd/serializer/Serializer.relast index 41c9e62..6bbd44b 100644 --- a/src/test/jastadd/serializer/Serializer.relast +++ b/src/test/jastadd/serializer/Serializer.relast @@ -2,7 +2,20 @@ Root ::= A* B* C; A:NamedElement; B:NamedElement; -C:NamedElement ::= D1:D [D2:D] D3:D* <F1:float> <F2:Float>; +C:NamedElement ::= D1:D [D2:D] D3:D* + <F1:float> <F2:Float> + <DD1:double> <DD2:Double> + <I1:int> <I2:Integer> + <S1:short> <S2:Short> + <L1:long> <L2:Long> + <B1:byte> <B2:Byte> + <O1:boolean> <O2:Boolean> + <C1:char> <C2:Character> + <T1:String> + <T2> + <N:Instant> + <P:Period> + <Day:Weekday>; D:NamedElement; abstract NamedElement ::= <Name>; diff --git a/src/test/java/org/jastadd/relast/tests/Serializer.java b/src/test/java/org/jastadd/relast/tests/Serializer.java index 3289ef2..96a57d4 100644 --- a/src/test/java/org/jastadd/relast/tests/Serializer.java +++ b/src/test/java/org/jastadd/relast/tests/Serializer.java @@ -5,6 +5,8 @@ import serializer.ast.*; import java.io.File; import java.io.IOException; +import java.time.Instant; +import java.time.Period; import static org.assertj.core.api.Assertions.assertThat; @@ -37,6 +39,34 @@ class Serializer { c.setF1(42f); c.setF2(42.13f); + c.setDD1(42.d); + c.setDD2(42.13d); + + c.setI1(23); + c.setI2(42); + c.setS1((short)66); + c.setS2((short)77); + + c.setL1(342l); + c.setL2(5453L); + + c.setB1((byte)5); + c.setB2((byte)'c'); + + c.setO1(true); + c.setO2(false); + + c.setC1('c'); + c.setC2((char)5); + + c.setT1("23"); + c.setT2("dfjsv"); + + c.setN(Instant.now()); + c.setP(Period.ofDays(1)); + + c.setDay(Weekday.FRIDAY); + r.setC(c); // non-containment relations -- GitLab