Skip to content
Snippets Groups Projects
Commit ca0b881d authored by Johannes Mey's avatar Johannes Mey
Browse files

generate aspect for non-grammar parts of the transformation. support enums.

parent 0b5fdf59
No related branches found
No related tags found
No related merge requests found
AttributeGrammar : Grammar ::= Aspect*;
Aspect <Name:String> ::= Attribute* InterTypeDeclaration* ;
abstract Attribute ;
abstract InterTypeDeclaration ;
TypeDeclaration : InterTypeDeclaration ::= <String:Content>;
aspect EcoreToAspect {
}
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");
}
}
aspect EcoreToDataTypes {
coll java.util.Collection<EEnum> EPackage.enums() [new java.util.ArrayList<>()] with add root EPackage;
EEnum contributes this to EPackage.enums();
}
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) {
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment