From 4fd5ee9cc59cf445e3e99b6672b36a9487620bc7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jesper=20=C3=96qvist?= <jesper.oqvist@cs.lth.se>
Date: Mon, 6 Feb 2017 11:14:06 +0100
Subject: [PATCH] Add attribute statistics option

Added a nonstandard option to write attribute statistics to a CSV file.
---
 ChangeLog                               |  7 +++++++
 src/jastadd/ast/JastAddCodeGen.jadd     | 24 +++++++++++++++++++++++-
 src/java/org/jastadd/Configuration.java | 19 +++++++++++++++++++
 src/java/org/jastadd/JastAdd.java       |  4 ++++
 src/java/org/jastadd/JastAddTask.java   |  4 ++++
 5 files changed, 57 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index a40811f5..eebd77c0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2017-02-06  Jesper Öqvist <jesper.oqvist@cs.lth.se>
+
+    * Added --statistics=FILE option. If specified, attribute statistics are
+    written in CSV format to the specified file. The number of synthesized,
+    inherited, and collection attribute declarations and equations written
+    for each AST class.
+
 2016-10-24  Jesper Öqvist <jesper.oqvist@cs.lth.se>
 
     * Changed default name of the AST state class from ASTNode$State to
diff --git a/src/jastadd/ast/JastAddCodeGen.jadd b/src/jastadd/ast/JastAddCodeGen.jadd
index 2ac7cdb8..81bcce10 100644
--- a/src/jastadd/ast/JastAddCodeGen.jadd
+++ b/src/jastadd/ast/JastAddCodeGen.jadd
@@ -123,6 +123,29 @@ aspect JastAddCodeGen {
     }
   }
 
+  /**
+   * @param filename filepath to a CSV file to write to
+   */
+  public void Grammar.writeStatistics(String filename) throws IOException {
+    System.out.println("Writing attribute statistics to " + filename);
+    File csv = new File(filename);
+    PrintStream out = new PrintStream(new FileOutputStream(csv));
+    out.println("node,syndecl,syneq,inhdecl,inheq,colldecl,colleq");
+    for (int i = 0; i < getNumTypeDecl(); i++) {
+      getTypeDecl(i).writeStatistics(out);
+    }
+    out.close();
+  }
+
+  public void TypeDecl.writeStatistics(PrintStream out) {
+  }
+
+  public void ASTDecl.writeStatistics(PrintStream out) {
+    out.format("%s,%d,%d,%d,%d,%d,%d%n", name(), getNumSynDecl(), getNumSynEq(),
+      getNumInhDecl(), inhAttrSet().size(),
+      getNumCollDecl(), getNumCollEq());
+  }
+
   public String TypeDecl.modifiers = "";
 
   syn String TypeDecl.modifiers() {
@@ -307,7 +330,6 @@ aspect JastAddCodeGen {
     }
   }
 
-
   public void ASTDecl.jastAddGen(boolean publicModifier) {
     File file = grammar().targetJavaFile(name());
     try {
diff --git a/src/java/org/jastadd/Configuration.java b/src/java/org/jastadd/Configuration.java
index c3c9426d..7c4e7583 100644
--- a/src/java/org/jastadd/Configuration.java
+++ b/src/java/org/jastadd/Configuration.java
@@ -333,6 +333,11 @@ public class Configuration {
   FlagOption printNonStandardOptionsOption = new FlagOption("X",
       "print list of non-standard options and halt");
 
+  Option<String> statisticsOption = new ValueOption("statistics",
+      "write attribute statistics to a CSV file")
+      .acceptAnyValue()
+      .nonStandard();
+
   ValueOption indentOption = new ValueOption("indent", "indentation used in generated code")
       .addDefaultValue("2space", "two spaces")
       .addAcceptedValue("4space", "four spaces")
@@ -462,6 +467,9 @@ public class Configuration {
     // New since 2.2.1:
     allOptions.add(safeLazyOption);
 
+    // New since 2.2.3:
+    allOptions.add(statisticsOption);
+
     // Deprecated in 2.1.5.
     allOptions.add(doxygenOption);
     allOptions.add(cacheAllOption);
@@ -792,6 +800,17 @@ public class Configuration {
     return printNonStandardOptionsOption.value();
   }
 
+  /**
+   * @return <code>true</code> if attribute statistics should be generated
+   */
+  public boolean shouldWriteStatistics() {
+    return !statisticsOption.value().isEmpty();
+  }
+
+  public String statisticsFile() {
+    return statisticsOption.value();
+  }
+
   /**
    * @return <code>true</code> if the --tracing option is enabled
    */
diff --git a/src/java/org/jastadd/JastAdd.java b/src/java/org/jastadd/JastAdd.java
index 8b615f15..c6ed20bd 100644
--- a/src/java/org/jastadd/JastAdd.java
+++ b/src/java/org/jastadd/JastAdd.java
@@ -232,6 +232,10 @@ public class JastAdd {
 
       grammar.jastAddGen(config.getPublicModifier());
 
+      if (config.shouldWriteStatistics()) {
+        grammar.writeStatistics(config.statisticsFile());
+      }
+
     } catch(NullPointerException e) {
       e.printStackTrace();
       throw e;
diff --git a/src/java/org/jastadd/JastAddTask.java b/src/java/org/jastadd/JastAddTask.java
index 0a6c8e78..2cdeb4b6 100644
--- a/src/java/org/jastadd/JastAddTask.java
+++ b/src/java/org/jastadd/JastAddTask.java
@@ -286,6 +286,10 @@ public class JastAddTask extends Task {
     setOption(config.safeLazyOption, enable);
   }
 
+  public void setStatistics(String arg) {
+    setOption(config.statisticsOption, arg);
+  }
+
   @Override
   public void execute() throws BuildException {
     System.err.println("generating node types and weaving aspects");
-- 
GitLab