diff --git a/ChangeLog b/ChangeLog index a40811f514b385daec31f7c44eb906469767d25a..eebd77c0256ec41ccb09414788d9ca5143805fa8 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 2ac7cdb8d4b7752fd3281ea62d045bf80f3ee770..81bcce106990e602ede466aaf22c3f8cba904195 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 c3c9426d7878bb7ab1d4d1c7d2cd9f07c615e5cd..7c4e75833945c9c640b7a3b46ab8a4dd7c68b213 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 8b615f150c16d6bcff43452a0a8a043d6855b0f4..c6ed20bdf7d5fa8291b741c4bd288262dfc98eed 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 0a6c8e78da271fd4befd5e8e8ecaf38fa0cf1265..2cdeb4b6e839e8dbf280409d87b3d7d0155e56ec 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");