From 5661e7c67f3155a641063fe2295b83df45c11a6b Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Fri, 17 Jul 2020 16:56:35 +0200
Subject: [PATCH] Fix jar build, allow multiple grammars, allow typedecls fail
 to resolve.

---
 relast2uml.base/build.gradle                  | 12 +++++++++++
 .../src/main/jastadd/NameResolution.jrag      | 12 ++++++++++-
 .../jastadd/relast2uml/compiler/Compiler.java | 21 +++++++++++++------
 .../compiler/options/StringOption.java        |  9 +++++++-
 4 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/relast2uml.base/build.gradle b/relast2uml.base/build.gradle
index 7c6be02..86db1fe 100644
--- a/relast2uml.base/build.gradle
+++ b/relast2uml.base/build.gradle
@@ -46,6 +46,18 @@ task newVersion() {
     }
 }
 
+jar {
+    manifest {
+        attributes "Main-Class": mainClassName
+    }
+
+    from {
+        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
+    }
+
+    archiveBaseName = 'relast2uml'
+}
+
 sourceSets {
     main {
         java.srcDir "src/gen/java"
diff --git a/relast2uml.base/src/main/jastadd/NameResolution.jrag b/relast2uml.base/src/main/jastadd/NameResolution.jrag
index 0152ba6..e6450fb 100644
--- a/relast2uml.base/src/main/jastadd/NameResolution.jrag
+++ b/relast2uml.base/src/main/jastadd/NameResolution.jrag
@@ -1,2 +1,12 @@
-aspect NameResolution {
+aspect NameResolutionExtended {
+  refine NameResolution eq Program.resolveTypeDecl(String name) {
+    try {
+      return refined(name);
+    } catch (RuntimeException e) {
+      System.err.println(e.getMessage());
+      TypeDecl dummy = new TypeDecl();
+      dummy.setName("(" + name + ")");
+      return dummy;
+    }
+  }
 }
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 a216bd7..bb60cd8 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
@@ -78,7 +78,7 @@ public class Compiler {
       System.out.println("No output output file is set. Assuming '" + output + "'.");
     }
     try {
-      Files.createDirectories(Paths.get(output).getParent());
+      Files.createDirectories(Paths.get(output).toAbsolutePath().getParent());
     } catch (IOException e) {
       throw new CompilerException("Error creating output dir " + Paths.get(output).getParent().toAbsolutePath(), e);
     }
@@ -86,6 +86,9 @@ public class Compiler {
     if (anyRequiredOptionIsUnset()) {
       throw new CompilerException("Aborting due to missing values for required options.");
     }
+    if (commandLine.getArguments().isEmpty()) {
+      throw new CompilerException("No input grammars specified!");
+    }
 
     Relast2Uml relast2uml = parseProgram();
 
@@ -158,11 +161,16 @@ public class Compiler {
   }
 
   private void addOptions() {
-    optionOutputFile = addOption(new StringOption("output", "target file to be generated."));
-    optionInputRelast2Uml = addOption(new StringOption("inputRelast2Uml", "relast2uml definition file."));
-    optionHelp = addOption(new FlagOption("help", "Print usage and exit."));
-    optionVersion = addOption(new FlagOption("help", "Print version and exit."));
-    optionVerbose = addOption(new FlagOption("verbose", "Print more messages while compiling."));
+    optionOutputFile = addOption(new StringOption(
+        "output", "target file to be generated.", "uml.md").makeOptional());
+    optionInputRelast2Uml = addOption(new StringOption(
+        "inputRelast2Uml", "relast2uml definition file.").makeOptional());
+    optionHelp = addOption(new FlagOption(
+        "help", "Print usage and exit."));
+    optionVersion = addOption(new FlagOption(
+        "help", "Print version and exit."));
+    optionVerbose = addOption(new FlagOption(
+        "verbose", "Print more messages while compiling."));
   }
 
   private <OptionType extends Option<?>> OptionType addOption(OptionType option) {
@@ -175,6 +183,7 @@ public class Compiler {
     Relast2Uml relast2Uml;
 
     for (String inputGrammarFileName : commandLine.getArguments()) {
+      printMessage("Parsing " + inputGrammarFileName);
       GrammarFile inputGrammar;
       try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputGrammarFileName))) {
         Relast2UmlScanner scanner = new Relast2UmlScanner(reader);
diff --git a/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/options/StringOption.java b/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/options/StringOption.java
index c75f09e..baa92bc 100644
--- a/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/options/StringOption.java
+++ b/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/options/StringOption.java
@@ -1,6 +1,7 @@
 package org.jastadd.relast2uml.compiler.options;
 
 public class StringOption extends Option<String> {
+  private HasArgument hasArgument;
   private String value;
   private boolean isSet;
 
@@ -12,6 +13,12 @@ public class StringOption extends Option<String> {
     super(name, description);
     value = defaultValue;
     isSet = false;
+    hasArgument = HasArgument.YES;
+  }
+
+  public StringOption makeOptional() {
+    hasArgument = HasArgument.OPTIONAL;
+    return this;
   }
 
   @Override
@@ -21,7 +28,7 @@ public class StringOption extends Option<String> {
 
   @Override
   public Option.HasArgument hasArgument() {
-    return Option.HasArgument.YES;
+    return hasArgument;
   }
 
   @Override
-- 
GitLab