From ca0b881d44858af57a540382cde6d91b19fab773 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Mon, 4 May 2020 10:25:12 +0200
Subject: [PATCH] generate aspect for non-grammar parts of the transformation.
 support enums.

---
 .../jastadd/grammar/AttributeGrammar.relast   |  8 +++
 src/main/jastadd/grammar/EcoreToAspect.jrag   |  3 ++
 .../jastadd/grammar/EcoreToDataTypes.jadd     | 31 ++++++++++++
 .../jastadd/grammar/EcoreToDataTypes.jrag     |  6 +++
 .../java/de/tudresden/inf/st/e2j/Main.java    | 50 ++++++++++++++-----
 .../inf/st/e2j/TransformationTest.java        | 12 +++--
 6 files changed, 93 insertions(+), 17 deletions(-)
 create mode 100644 src/main/jastadd/grammar/AttributeGrammar.relast
 create mode 100644 src/main/jastadd/grammar/EcoreToAspect.jrag
 create mode 100644 src/main/jastadd/grammar/EcoreToDataTypes.jadd
 create mode 100644 src/main/jastadd/grammar/EcoreToDataTypes.jrag

diff --git a/src/main/jastadd/grammar/AttributeGrammar.relast b/src/main/jastadd/grammar/AttributeGrammar.relast
new file mode 100644
index 0000000..37599e9
--- /dev/null
+++ b/src/main/jastadd/grammar/AttributeGrammar.relast
@@ -0,0 +1,8 @@
+AttributeGrammar : Grammar ::= Aspect*;
+
+Aspect <Name:String> ::= Attribute* InterTypeDeclaration* ;
+
+abstract Attribute ;
+abstract InterTypeDeclaration ;
+
+TypeDeclaration : InterTypeDeclaration ::= <String:Content>;
diff --git a/src/main/jastadd/grammar/EcoreToAspect.jrag b/src/main/jastadd/grammar/EcoreToAspect.jrag
new file mode 100644
index 0000000..0808e93
--- /dev/null
+++ b/src/main/jastadd/grammar/EcoreToAspect.jrag
@@ -0,0 +1,3 @@
+aspect EcoreToAspect {
+
+}
diff --git a/src/main/jastadd/grammar/EcoreToDataTypes.jadd b/src/main/jastadd/grammar/EcoreToDataTypes.jadd
new file mode 100644
index 0000000..15d81dc
--- /dev/null
+++ b/src/main/jastadd/grammar/EcoreToDataTypes.jadd
@@ -0,0 +1,31 @@
+aspect EcoreToDataTypes {
+
+  public void EEnum.printJavaEnum(StringBuilder b) {
+    // TODO print enum
+    b.append(indentString(1)).append("public enum ").append(getName()).append(" {\n")
+        .append(indentString(2));
+    boolean first = true;
+    for (EEnumLiteral literal : getELiteralList()) {
+      if (first) {
+        first = false;
+      } else {
+        b.append(",\n").append(indentString(2));
+      }
+      b.append(literal.getName()).append("(\"").append(literal.getLiteral()).append("\", ").append(literal.getValue()).append(")");
+    }
+    b.append(";\n\n")
+        .append(indentString(2)).append("private ").append(getName()).append("(String literal, int value) {\n")
+        .append(indentString(3)).append("this.literal = literal;\n")
+        .append(indentString(3)).append("this.value = value;\n")
+        .append(indentString(2)).append("}\n")
+        .append(indentString(2)).append("public String getLiteral() {\n")
+        .append(indentString(3)).append("return literal;\n")
+        .append(indentString(2)).append("}\n")
+        .append(indentString(2)).append("public int getValue() {\n")
+        .append(indentString(3)).append("return value;\n")
+        .append(indentString(2)).append("}\n")
+        .append(indentString(2)).append("private int value;\n")
+        .append(indentString(2)).append("private String literal;\n")
+        .append(indentString(1)).append("}\n");
+  }
+}
diff --git a/src/main/jastadd/grammar/EcoreToDataTypes.jrag b/src/main/jastadd/grammar/EcoreToDataTypes.jrag
new file mode 100644
index 0000000..a8a5fc8
--- /dev/null
+++ b/src/main/jastadd/grammar/EcoreToDataTypes.jrag
@@ -0,0 +1,6 @@
+aspect EcoreToDataTypes {
+
+  coll java.util.Collection<EEnum> EPackage.enums() [new java.util.ArrayList<>()] with add root EPackage;
+  EEnum contributes this to EPackage.enums();
+
+}
diff --git a/src/main/java/de/tudresden/inf/st/e2j/Main.java b/src/main/java/de/tudresden/inf/st/e2j/Main.java
index 11bdb72..d08caba 100644
--- a/src/main/java/de/tudresden/inf/st/e2j/Main.java
+++ b/src/main/java/de/tudresden/inf/st/e2j/Main.java
@@ -1,8 +1,6 @@
 package de.tudresden.inf.st.e2j;
 
-import de.tudresden.inf.st.e2j.jastadd.model.EObject;
-import de.tudresden.inf.st.e2j.jastadd.model.EPackage;
-import de.tudresden.inf.st.e2j.jastadd.model.Grammar;
+import de.tudresden.inf.st.e2j.jastadd.model.*;
 import de.tudresden.inf.st.e2j.parser.EcoreParser;
 import de.tudresden.inf.st.e2j.parser.XMIParseException;
 
@@ -11,6 +9,7 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Collection;
 import java.util.List;
 
 public class Main {
@@ -27,7 +26,16 @@ public class Main {
 
   }
 
-  private static void transformFile(String sourceFileName, String targetFileName) {
+  public static void transformFile(String sourceFileName, String targetFileName) {
+
+    if (targetFileName.endsWith(".relast")) {
+      targetFileName = targetFileName.substring(0, targetFileName.length() - 7);
+    }
+
+    System.out.println(targetFileName);
+
+    String grammarFileName = targetFileName + ".relast";
+    String aspectFileName = targetFileName + ".ecore.jadd";
 
     List<EObject> ePackages = null;
 
@@ -55,7 +63,11 @@ public class Main {
       exitWithError("No ecore packages were parsed.");
     }
 
-    StringBuilder b = new StringBuilder();
+    StringBuilder grammarBuilder = new StringBuilder();
+    StringBuilder aspectBuilder = new StringBuilder();
+
+    // print beginning of aspect
+    aspectBuilder.append("aspect DataTypes {");
 
     for (EObject eObject : ePackages) {
       if (!(eObject instanceof EPackage)) {
@@ -66,22 +78,36 @@ public class Main {
 
       try {
         Grammar grammar = ePackage.getGrammar();
-        grammar.print(b);
+        grammar.print(grammarBuilder);
       } catch (Exception e) {
         exitWithError("Unable to transform Ecore package " + ePackage.getName() + " to grammar.");
       }
-      b.append("\n\n");
-    }
 
-    if (!targetFileName.endsWith(".relast")) {
-      targetFileName += ".relast";
+      Collection<EEnum> enums = ePackage.enums();
+      aspectBuilder.append("// data types\n");
+      for (EEnum e : enums) {
+        e.printJavaEnum(aspectBuilder);
+        aspectBuilder.append("\n");
+      }
+
+      grammarBuilder.append("\n\n");
     }
 
-    try (PrintWriter out = new PrintWriter(targetFileName, StandardCharsets.UTF_8.name())) {
-      out.print(b.toString());
+
+    try (PrintWriter out = new PrintWriter(grammarFileName, StandardCharsets.UTF_8.name())) {
+      out.print(grammarBuilder.toString());
     } catch (FileNotFoundException | UnsupportedEncodingException e) {
       exitWithError("Unable to write relast file");
     }
+
+    // print end of aspect
+    aspectBuilder.append("}");
+
+    try (PrintWriter out = new PrintWriter(aspectFileName, StandardCharsets.UTF_8.name())) {
+      out.print(aspectBuilder.toString());
+    } catch (FileNotFoundException | UnsupportedEncodingException e) {
+      exitWithError("Unable to write aspect file");
+    }
   }
 
   private static void exitWithError(String message) {
diff --git a/src/test/java/de/tudresden/inf/st/e2j/TransformationTest.java b/src/test/java/de/tudresden/inf/st/e2j/TransformationTest.java
index 1f3e109..d2f4b6e 100644
--- a/src/test/java/de/tudresden/inf/st/e2j/TransformationTest.java
+++ b/src/test/java/de/tudresden/inf/st/e2j/TransformationTest.java
@@ -16,12 +16,13 @@ import org.junit.jupiter.params.provider.ArgumentsSource;
 import java.io.*;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
 
 class TransformationTest extends AbstractTest {
 
-  private static Logger logger = LogManager.getLogger(TransformationTest.class);
+  private static final Logger logger = LogManager.getLogger(TransformationTest.class);
 
   @BeforeAll
   static void setUpDirectories() throws IOException {
@@ -103,11 +104,12 @@ class TransformationTest extends AbstractTest {
 
     g.print(b);
 
-    try (PrintWriter out = new PrintWriter(targetFile)) {
-      out.print(b.toString());
-    } catch (FileNotFoundException e) {
-      Assertions.fail("unable to write output file", e);
+    Path sourcePath = Paths.get("src/test/resources/" + sourceFile);
+    if (Files.notExists(sourcePath)) {
+      Assertions.fail("the source file " + sourcePath.toAbsolutePath().getFileName() + " does not exist.");
     }
+
+    Main.transformFile("src/test/resources/" + sourceFile, targetFile);
   }
 
   @Test
-- 
GitLab