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