From 38f370818b96017a55287392eeae725bed18f73d Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Sun, 8 Jul 2018 18:46:29 +0200
Subject: [PATCH] add option to rename list class. this made it much easier to
 use the generator in the train benchmark.

---
 spec/jastadd/Backend.jadd                     | 43 ++++++++++---------
 .../org/jastadd/relast/compiler/Compiler.java |  8 ++++
 2 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/spec/jastadd/Backend.jadd b/spec/jastadd/Backend.jadd
index f206987..8778063 100644
--- a/spec/jastadd/Backend.jadd
+++ b/spec/jastadd/Backend.jadd
@@ -1,4 +1,7 @@
 aspect BackendAbstractGrammar {
+
+	public static String ASTNode.listClass = "ArrayList";
+
 	public String Program.generateAbstractGrammar() {
 		StringBuilder sb = new StringBuilder();
 		generateAbstractGrammar(sb);
@@ -19,7 +22,7 @@ aspect BackendAbstractGrammar {
 		if (hasSuper()) {
 			sb.append(" : " + getSuper());
 		}
-		
+
 		if (getNumComponent() > 0 || relationComponents().size() > 0) {
 			sb.append(" ::=");
 		}
@@ -56,7 +59,7 @@ aspect BackendAbstractGrammar {
 		return "<" + getImplAttributeName() + ":" + ofTypeDecl() + ">";
 	}
 	public String ManyRelationComponent.generateAbstractGrammar() {
-		return "<" + getImplAttributeName() + ":ArrayList<" + ofTypeDecl() + ">>";
+		return "<" + getImplAttributeName() + ":" + ASTNode.listClass + "<" + ofTypeDecl() + ">>";
 	}
 
 	public String RelationComponent.getImplAttributeName() {
@@ -159,7 +162,7 @@ aspect BackendDirectedAPI {
 	}
 	public void OptionalRelationComponent.generateDirectedAPI(StringBuilder sb) {
 		generateDirectedZeroOneAPI(sb, true);
-		
+
 		generateExtraOptAPI(sb);
 	}
 	public void RelationComponent.generateDirectedZeroOneAPI(StringBuilder sb, boolean optional) {
@@ -184,9 +187,9 @@ aspect BackendDirectedAPI {
 		sb.append(ind(1) + "public void " + toTypeDecl() + ".addTo");
 		sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
 		sb.append(ind(2) + "assertNotNull(o);\n");
-		sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+		sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
 		sb.append(ind(2) + "if (list == null) {\n");
-		sb.append(ind(3) + "list = new ArrayList<>();\n");
+		sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n");
 		sb.append(ind(2) + "}\n");
 		sb.append(ind(2) + "list.add(o);\n");
 		sb.append(ind(2) + "set" + getImplAttributeName() + "(list);\n");
@@ -196,7 +199,7 @@ aspect BackendDirectedAPI {
 		sb.append(ind(1) + "public void " + toTypeDecl() + ".removeFrom");
 		sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
 		sb.append(ind(2) + "assertNotNull(o);\n");
-		sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+		sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
 		sb.append(ind(2) + "if (list != null && list.remove(o)) {\n");
 		sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n");
 		sb.append(ind(2) + "}\n");
@@ -227,7 +230,7 @@ aspect BackendDirectedAPI {
 	public void RelationComponent.generateGetMany(StringBuilder sb) {
 		sb.append(ind(1) + "public java.util.List<" + ofTypeDecl() + "> " + toTypeDecl());
 		sb.append("." + name() + "() {\n");
-		sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> l = get"
+		sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> l = get"
 			+ getImplAttributeName() + "();\n");
 		sb.append(ind(2) + "return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();\n");
 		sb.append(ind(1) + "}\n");
@@ -314,14 +317,14 @@ aspect BackendBidirectionalAPI {
 		sb.append(ind(1) + "public void " + toTypeDecl() + ".addTo");
 		sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
 		sb.append(ind(2) + "assertNotNull(o);\n");
-		sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+		sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
 		sb.append(ind(2) + "if (list == null) {\n");
-		sb.append(ind(3) + "list = new ArrayList<>();\n");
+		sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n");
 		sb.append(ind(2) + "}\n");
-		sb.append(ind(2) + "ArrayList<" + otherSide().ofTypeDecl() + "> list2 = o.get"
+		sb.append(ind(2) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o.get"
 			+ otherSide().getImplAttributeName() + "();\n");
 		sb.append(ind(2) + "if (list2 == null) {\n");
-		sb.append(ind(3) + "list2 = new ArrayList<>();\n");
+		sb.append(ind(3) + "list2 = new "+ ASTNode.listClass + "<>();\n");
 		sb.append(ind(2) + "}\n");
 		sb.append(ind(2) + "list.add(o);\n");
 		sb.append(ind(2) + "list2.add(this);\n");
@@ -333,9 +336,9 @@ aspect BackendBidirectionalAPI {
 		sb.append(ind(1) + "public void " + toTypeDecl() + ".removeFrom");
 		sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
 		sb.append(ind(2) + "assertNotNull(o);\n");
-		sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+		sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
 		sb.append(ind(2) + "if (list != null && list.remove(o)) {\n");
-		sb.append(ind(3) + "ArrayList<" + otherSide().ofTypeDecl() + "> list2 = o.get"
+		sb.append(ind(3) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o.get"
 			+ otherSide().getImplAttributeName() + "();\n");
 		sb.append(ind(3) + "if (list2 != null) list2.remove(this);\n");
 		sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n");
@@ -354,15 +357,15 @@ aspect BackendBidirectionalAPI {
 		sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
 		sb.append(ind(2) + "assertNotNull(o);\n");
 		sb.append(ind(2) + "if (o != null && o.get" + otherSide().getImplAttributeName() + "() != null) {\n");
-		sb.append(ind(3) + "ArrayList<" + ofTypeDecl() + "> list2 = o.get"
+		sb.append(ind(3) + ASTNode.listClass + "<" + ofTypeDecl() + "> list2 = o.get"
 			+ otherSide().getImplAttributeName() + "().get" + getImplAttributeName() + "();\n");
 		sb.append(ind(3) + "if (list2.remove(o))\n");
 		sb.append(ind(4) + "o.get" + otherSide().getImplAttributeName()
 			+ "().set" + getImplAttributeName() + "(list2);\n");
 		sb.append(ind(2) + "}\n");
-		sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+		sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
 		sb.append(ind(2) + "if (list == null) {\n");
-		sb.append(ind(3) + "list = new ArrayList<>();\n");
+		sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n");
 		sb.append(ind(2) + "}\n");
 		sb.append(ind(2) + "list.add(o);\n");
 		sb.append(ind(2) + "set" + getImplAttributeName() + "(list);\n");
@@ -373,7 +376,7 @@ aspect BackendBidirectionalAPI {
 		sb.append(ind(1) + "public void " + toTypeDecl() + ".removeFrom");
 		sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
 		sb.append(ind(2) + "assertNotNull(o);\n");
-		sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+		sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
 		sb.append(ind(2) + "if (list != null && list.remove(o)) {\n");
 		sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n");
 		sb.append(ind(3) + "if (o.get" + otherSide().getImplAttributeName() + "() == this) {\n");
@@ -394,7 +397,7 @@ aspect BackendBidirectionalAPI {
 			sb.append(ind(2) + "assertNotNull(o);\n");
 		}
 		sb.append(ind(2) + "if (get" + getImplAttributeName() + "() != null) {\n");
-		sb.append(ind(3) + "ArrayList<" + toTypeDecl() + "> list2 = get" + getImplAttributeName()
+		sb.append(ind(3) + ASTNode.listClass + "<" + toTypeDecl() + "> list2 = get" + getImplAttributeName()
 			+ "()." + "get" + otherSide().getImplAttributeName() + "();\n");
 		sb.append(ind(3) + "list2.remove(this);\n");
 		sb.append(ind(3) + "get" + getImplAttributeName() + "()." + "set"
@@ -406,10 +409,10 @@ aspect BackendBidirectionalAPI {
 		if (isOpt) {
 			sb.append(ind(2) + "if (o != null) {\n");
 		}
-		sb.append(ind(ind) + "ArrayList<" + toTypeDecl() + "> list = o.get"
+		sb.append(ind(ind) + ASTNode.listClass + "<" + toTypeDecl() + "> list = o.get"
 			+ otherSide().getImplAttributeName() + "();\n");
 		sb.append(ind(ind) + "if (list == null) {\n");
-		sb.append(ind(ind+1) + "list = new ArrayList<>();\n");
+		sb.append(ind(ind+1) + "list = new " + ASTNode.listClass + "<>();\n");
 		sb.append(ind(ind) + "}\n");
 		sb.append(ind(ind) + "list.add(this);\n");
 		sb.append(ind(ind) + "o.set" + otherSide().getImplAttributeName() + "(list);\n");
diff --git a/src/java/org/jastadd/relast/compiler/Compiler.java b/src/java/org/jastadd/relast/compiler/Compiler.java
index a6f8a1d..f5ff3c3 100644
--- a/src/java/org/jastadd/relast/compiler/Compiler.java
+++ b/src/java/org/jastadd/relast/compiler/Compiler.java
@@ -21,6 +21,7 @@ public class Compiler {
 	protected ArrayList<Option<?>> options;
 	protected FlagOption optionWriteToFile;
 	protected FlagOption optionPrintAST;
+	protected StringOption optionListClass;
 	protected CommandLine commandLine;
 
 	public Compiler(String args[]) throws CommandLineException {
@@ -47,6 +48,12 @@ public class Compiler {
 			}
 			System.exit(1);
 		} else {
+
+			if (optionListClass.isSet()) {
+				System.out.println("ListClass is set to " + optionListClass.getValue());
+				p.listClass = optionListClass.getValue();
+			}
+
 			if (optionWriteToFile.isSet()) {
 				File file = new File(filename);
 				String absPath = file.getAbsolutePath();
@@ -76,6 +83,7 @@ public class Compiler {
 	protected void addOptions() {
 		optionWriteToFile = addOption(new FlagOption("file", "write output to files <filename>Gen.ast and <filename>Gen.jadd"));
 		optionPrintAST = addOption(new FlagOption("ast", "print AST"));
+		optionListClass = addOption(new StringOption("listClass", "determine the class name of the nonterminal reference list"));
 	}
 
 	protected <OptionType extends Option<?>> OptionType addOption(OptionType option) {
-- 
GitLab