From 08e6ea11e96734f3fd6aee0e0f763832a1f9eb86 Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Fri, 17 Jul 2020 18:01:38 +0200
Subject: [PATCH] Add defaultFolders, fix some of the empty newlines.

---
 relast2uml.base/src/main/jastadd/Analysis.jrag     | 10 ++++++++++
 relast2uml.base/src/main/jastadd/Navigation.jrag   |  8 ++++++++
 .../org/jastadd/relast2uml/compiler/Compiler.java  | 14 +++++++++-----
 .../src/main/resources/TypeDecl.mustache           |  7 ++++---
 .../org/jastadd/relast2uml/test/CompilerTest.java  |  1 +
 relast2uml.base/src/test/resources/Example.relast  |  2 +-
 6 files changed, 33 insertions(+), 9 deletions(-)

diff --git a/relast2uml.base/src/main/jastadd/Analysis.jrag b/relast2uml.base/src/main/jastadd/Analysis.jrag
index 84a3af2..317cf9d 100644
--- a/relast2uml.base/src/main/jastadd/Analysis.jrag
+++ b/relast2uml.base/src/main/jastadd/Analysis.jrag
@@ -1,2 +1,12 @@
 aspect Analysis {
+  syn lazy Folder GrammarFile.defaultFolder() {
+    Folder result = new Folder();
+    result.setName(new java.io.File(getFileName()).getName().replace(".relast", "").replace(".ast", ""));
+    for (Declaration decl : getDeclarationList()) {
+      if (decl.isTypeDecl() && !decl.asTypeDecl().hasSourceFolder()) {
+        result.addType(decl.asTypeDecl());
+      }
+    }
+    return result;
+  }
 }
diff --git a/relast2uml.base/src/main/jastadd/Navigation.jrag b/relast2uml.base/src/main/jastadd/Navigation.jrag
index a5d0889..09c9ae1 100644
--- a/relast2uml.base/src/main/jastadd/Navigation.jrag
+++ b/relast2uml.base/src/main/jastadd/Navigation.jrag
@@ -13,6 +13,14 @@ aspect Navigation {
   eq Program.getChild().containedFile() = null;
   eq Relast2Uml.getChild().containedFile() = null;
 
+  // --- isTypeDecl (should be in preprocessor) ---
+  syn boolean Declaration.isTypeDecl() = false;
+  eq TypeDecl.isTypeDecl() = true;
+
+  // --- asTypeDecl (should be in preprocessor) ---
+  syn TypeDecl Declaration.asTypeDecl() = null;
+  eq TypeDecl.asTypeDecl() = this;
+
   // --- isTypeComponent (should be in preprocessor) ---
   syn boolean Component.isTypeComponent() = false;
   eq TypeComponent.isTypeComponent() = true;
diff --git a/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java b/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java
index bb60cd8..1e76de8 100644
--- a/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java
+++ b/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java
@@ -1,10 +1,7 @@
 package org.jastadd.relast2uml.compiler;
 
 import beaver.Parser;
-import org.jastadd.relast2uml.ast.ErrorMessage;
-import org.jastadd.relast2uml.ast.GrammarFile;
-import org.jastadd.relast2uml.ast.Program;
-import org.jastadd.relast2uml.ast.Relast2Uml;
+import org.jastadd.relast2uml.ast.*;
 import org.jastadd.relast2uml.compiler.options.CommandLine;
 import org.jastadd.relast2uml.compiler.options.FlagOption;
 import org.jastadd.relast2uml.compiler.options.Option;
@@ -25,6 +22,7 @@ public class Compiler {
 
   private StringOption optionOutputFile;
   private StringOption optionInputRelast2Uml;
+  private FlagOption optionDefaultFolders;
   private FlagOption optionHelp;
   private FlagOption optionVersion;
   private FlagOption optionVerbose;
@@ -165,6 +163,8 @@ public class Compiler {
         "output", "target file to be generated.", "uml.md").makeOptional());
     optionInputRelast2Uml = addOption(new StringOption(
         "inputRelast2Uml", "relast2uml definition file.").makeOptional());
+    optionDefaultFolders = addOption(new FlagOption(
+        "defaultFolders", "Creates a default folder per grammar file."));
     optionHelp = addOption(new FlagOption(
         "help", "Print usage and exit."));
     optionVersion = addOption(new FlagOption(
@@ -193,7 +193,6 @@ public class Compiler {
           inputGrammar.dumpTree(System.out);
         }
         program.addGrammarFile(inputGrammar);
-        inputGrammar.treeResolveAll();
         inputGrammar.setFileName(inputGrammarFileName);
       } catch (IOException | Parser.Exception e) {
         throw new CompilerException("Could not parse grammar file " + inputGrammarFileName, e);
@@ -217,6 +216,11 @@ public class Compiler {
     }
     relast2Uml.setProgram(program);
     relast2Uml.treeResolveAll();
+    if (optionDefaultFolders.isSet()) {
+      for (GrammarFile grammarFile : program.getGrammarFileList()) {
+        relast2Uml.addFolder(grammarFile.defaultFolder());
+      }
+    }
     return relast2Uml;
   }
 
diff --git a/relast2uml.base/src/main/resources/TypeDecl.mustache b/relast2uml.base/src/main/resources/TypeDecl.mustache
index 48eff2c..a72b5dc 100644
--- a/relast2uml.base/src/main/resources/TypeDecl.mustache
+++ b/relast2uml.base/src/main/resources/TypeDecl.mustache
@@ -1,4 +1,5 @@
-{{=<% %>=}}<%#isAbstract%>abstract <%/isAbstract%>class <%name%><%#InnerTokenComponents%><%#first%> {<%/first%>
+{{=<% %>=}}<%#isAbstract%>abstract <%/isAbstract%>class <%name%><%#InnerTokenComponents%><%#first%> {
+<%/first%>
   <%name%>
-<%#last%>}<%/last%>
-<%/InnerTokenComponents%><%={{ }}=%>
+<%#last%>
+}<%/last%><%/InnerTokenComponents%><%={{ }}=%>
diff --git a/relast2uml.base/src/test/java/org/jastadd/relast2uml/test/CompilerTest.java b/relast2uml.base/src/test/java/org/jastadd/relast2uml/test/CompilerTest.java
index 871500b..14de18e 100644
--- a/relast2uml.base/src/test/java/org/jastadd/relast2uml/test/CompilerTest.java
+++ b/relast2uml.base/src/test/java/org/jastadd/relast2uml/test/CompilerTest.java
@@ -35,6 +35,7 @@ public class CompilerTest {
     String[] args = {
         "--output=" + output,
         "--inputRelast2Uml=" + inputRelast2Uml,
+        "--defaultFolders",
         inputGrammar
     };
 
diff --git a/relast2uml.base/src/test/resources/Example.relast b/relast2uml.base/src/test/resources/Example.relast
index a4a05b6..0eb3846 100644
--- a/relast2uml.base/src/test/resources/Example.relast
+++ b/relast2uml.base/src/test/resources/Example.relast
@@ -11,7 +11,7 @@ Funktionsprinzip ::= Dateneingangswert* Verarbeitungsschritt* Datenausgangswert*
 
 abstract Datenquelle;
 // Beispiel für Wert: FB_links, ist_diff, max_diff
-Wert : Datenquelle ::= <Datentyp> ;
+Wert : Datenquelle ::= <Datentyp> <A> <B>;
 
 // Ein Wert, der bei "Dateneingang" steht, z.B. für ReLi: max_Diff oder FB,links
 // Beispiel für Dateneingangswert: Zuordnung, aus welcher Quelle der Wert ausgelesen werden soll
-- 
GitLab