From fdcaf7d932e80ee87979dfd0b509b09e3ca9a9e5 Mon Sep 17 00:00:00 2001 From: A Pottinger Date: Sun, 13 Oct 2019 11:47:35 -0700 Subject: [PATCH] Cleaned up RewriterCodeGen and added setDestinationPackage. Allow client code to provide a destination package for generated code and removed some (now dead) code for RewriterCodeGenerator. --- .../java/preproc/PdeParseTreeListener.java | 20 +++++++-- .../mode/java/preproc/PdePreprocessor.java | 42 ++++++++++++------- .../mode/java/preproc/code/RewriteParams.java | 2 +- .../preproc/code/RewriterCodeGenerator.java | 37 ---------------- 4 files changed, 44 insertions(+), 57 deletions(-) delete mode 100644 java/src/processing/mode/java/preproc/code/RewriterCodeGenerator.java diff --git a/java/src/processing/mode/java/preproc/PdeParseTreeListener.java b/java/src/processing/mode/java/preproc/PdeParseTreeListener.java index 6e4244c15..a87546c71 100644 --- a/java/src/processing/mode/java/preproc/PdeParseTreeListener.java +++ b/java/src/processing/mode/java/preproc/PdeParseTreeListener.java @@ -56,6 +56,7 @@ public class PdeParseTreeListener extends ProcessingBaseListener { private String sketchName; private boolean isTesting; private TokenStreamRewriter rewriter; + private Optional destinationPackageName; private Mode mode = Mode.JAVA; private boolean foundMain; @@ -76,7 +77,6 @@ public class PdeParseTreeListener extends ProcessingBaseListener { private boolean sizeIsFullscreen = false; private RewriteResult headerResult; private RewriteResult footerResult; - private RewriterCodeGenerator codeGen; private String indent1; private String indent2; @@ -90,13 +90,17 @@ public class PdeParseTreeListener extends ProcessingBaseListener { * @param tokens The tokens over which to rewrite. * @param newSketchName The name of the sketch being traversed. * @param newTabSize Size of tab / indent. + * @param newDestinationPackageName The package to which generated code should be assigned (the + * package to which the sketch code java file should be assigned). */ - public PdeParseTreeListener(TokenStream tokens, String newSketchName, int newTabSize) { + public PdeParseTreeListener(TokenStream tokens, String newSketchName, int newTabSize, + Optional newDestinationPackageName) { + rewriter = new TokenStreamRewriter(tokens); sketchName = newSketchName; tabSize = newTabSize; + destinationPackageName = newDestinationPackageName; - codeGen = new RewriterCodeGenerator(tabSize); pdeParseTreeErrorListenerMaybe = Optional.empty(); final char[] indentChars = new char[newTabSize]; @@ -801,7 +805,15 @@ public class PdeParseTreeListener extends ProcessingBaseListener { protected void writeHeaderContents(PrintWriterWithEditGen decoratedWriter, RewriteParams params, RewriteResultBuilder resultBuilder) { - if (!params.getisTesting()) writePreprocessorComment(decoratedWriter, params, resultBuilder); + if (!params.getIsTesting()) { + writePreprocessorComment(decoratedWriter, params, resultBuilder); + } + + if (destinationPackageName.isPresent()) { + decoratedWriter.addCodeLine("package " + destinationPackageName.get() + ";"); + decoratedWriter.addEmptyLine(); + } + writeImports(decoratedWriter, params, resultBuilder); PdePreprocessor.Mode mode = params.getMode(); diff --git a/java/src/processing/mode/java/preproc/PdePreprocessor.java b/java/src/processing/mode/java/preproc/PdePreprocessor.java index 9f35a2e55..d3962484f 100644 --- a/java/src/processing/mode/java/preproc/PdePreprocessor.java +++ b/java/src/processing/mode/java/preproc/PdePreprocessor.java @@ -77,6 +77,7 @@ public class PdePreprocessor { private final ParseTreeListenerFactory listenerFactory; private final List defaultImports; private final List coreImports; + private final Optional destinationPackage; private boolean foundMain; @@ -110,7 +111,7 @@ public class PdePreprocessor { */ public PdePreprocessor(final String newSketchName, final int newTabSize, boolean newIsTesting, final ParseTreeListenerFactory newFactory, List newDefaultImports, - List newCoreImports) { + List newCoreImports, Optional newDestinationPackage) { sketchName = newSketchName; tabSize = newTabSize; @@ -118,6 +119,7 @@ public class PdePreprocessor { listenerFactory = newFactory; defaultImports = newDefaultImports; coreImports = newCoreImports; + destinationPackage = newDestinationPackage; } /** @@ -185,7 +187,12 @@ public class PdePreprocessor { // Parser final List preprocessIssues = new ArrayList<>(); final List treeIssues = new ArrayList<>(); - PdeParseTreeListener listener = listenerFactory.build(tokens, sketchName, tabSize); + PdeParseTreeListener listener = listenerFactory.build( + tokens, + sketchName, + tabSize, + Optional.empty() + ); listener.setTesting(isTesting); listener.setCoreImports(coreImports); listener.setDefaultImports(defaultImports); @@ -279,6 +286,7 @@ public class PdePreprocessor { private Optional parseTreeFactory; private Optional> defaultImports; private Optional> coreImports; + private Optional destinationPackage; /** * The imports required for the Java processing mode. @@ -333,6 +341,7 @@ public class PdePreprocessor { parseTreeFactory = Optional.empty(); defaultImports = Optional.empty(); coreImports = Optional.empty(); + destinationPackage = Optional.empty(); } /** @@ -396,6 +405,17 @@ public class PdePreprocessor { return this; } + /** + * Specify to which package generated code should be assigned. + * + * @param newDestinationPackage The package to which output code should be assigned. + * @return This builder for method chaining. + */ + public PdePreprocessorBuilder setDestinationPackage(String newDestinationPackage) { + destinationPackage = Optional.of(newDestinationPackage); + return this; + } + /** * Build the preprocessor. * @@ -426,7 +446,8 @@ public class PdePreprocessor { effectiveIsTesting, effectiveFactory, effectiveDefaultImports, - effectiveCoreImports + effectiveCoreImports, + destinationPackage ); } @@ -448,9 +469,11 @@ public class PdePreprocessor { * @param tokens The token stream with sketch code contents. * @param sketchName The name of the sketch that will be preprocessed. * @param tabSize The size (number of spaces) of the tabs. + * @param packageName The optional package name for generated code. * @return The newly created listener. */ - PdeParseTreeListener build(CommonTokenStream tokens, String sketchName, int tabSize); + PdeParseTreeListener build(CommonTokenStream tokens, String sketchName, int tabSize, + Optional packageName); } @@ -460,17 +483,6 @@ public class PdePreprocessor { * ================================== */ - /** - * Factory function to create a {PdeParseTreeListener} for use in preprocessing - * - * @param tokens The token stream for which the listener needs to be created. - * @param sketchName The name of the sketch being preprocessed. - * @return Newly created listener suitable for use in this {PdePreprocessor}. - */ - private PdeParseTreeListener createListener(CommonTokenStream tokens, String sketchName) { - return new PdeParseTreeListener(tokens, sketchName, tabSize); - } - /** * Utility function to substitute non ascii characters for escaped unicode character sequences. * diff --git a/java/src/processing/mode/java/preproc/code/RewriteParams.java b/java/src/processing/mode/java/preproc/code/RewriteParams.java index 00adcdff4..e0d51fb2e 100644 --- a/java/src/processing/mode/java/preproc/code/RewriteParams.java +++ b/java/src/processing/mode/java/preproc/code/RewriteParams.java @@ -101,7 +101,7 @@ public class RewriteParams { * * @return Flag indicating if this is being run as part of automated testing. */ - public boolean getisTesting() { + public boolean getIsTesting() { return isTesting; } diff --git a/java/src/processing/mode/java/preproc/code/RewriterCodeGenerator.java b/java/src/processing/mode/java/preproc/code/RewriterCodeGenerator.java deleted file mode 100644 index 1e785c075..000000000 --- a/java/src/processing/mode/java/preproc/code/RewriterCodeGenerator.java +++ /dev/null @@ -1,37 +0,0 @@ -package processing.mode.java.preproc.code; - -import org.antlr.v4.runtime.TokenStreamRewriter; -import processing.app.Preferences; -import processing.core.PApplet; -import processing.mode.java.preproc.PdePreprocessor; - -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.StringJoiner; - - -/** - * Utility to rewrite code as part of preprocessing. - */ -public class RewriterCodeGenerator { - - private final String indent1; - private final String indent2; - private final String indent3; - - /** - * Create a new rewriter. - * - * @param indentSize Number of spaces in the indent. - */ - public RewriterCodeGenerator(int indentSize) { - final char[] indentChars = new char[indentSize]; - Arrays.fill(indentChars, ' '); - indent1 = new String(indentChars); - indent2 = indent1 + indent1; - indent3 = indent2 + indent1; - } - -}