From 17e28256f5cdb7971762d1077514083431031645 Mon Sep 17 00:00:00 2001 From: A Pottinger Date: Mon, 20 Jan 2020 09:16:11 -0800 Subject: [PATCH] Resolve rewrite of pixelDensity to settings. Per https://github.com/processing/processing4/issues/58, pixelDensity should run in settings and currently results in failure if used in static context. This will rewrite pixelDensity into the setting section if found in static or settings context. Adds unit tests for both scenarios. --- .../java/preproc/PdeParseTreeListener.java | 80 ++++++++++++++----- .../processing/mode/java/ParserTests.java | 10 +++ .../test/resources/parampixeldensity.expected | 44 ++++++++++ java/test/resources/parampixeldensity.pde | 12 +++ .../resources/staticpixeldensity.expected | 41 ++++++++++ java/test/resources/staticpixeldensity.pde | 6 ++ 6 files changed, 175 insertions(+), 18 deletions(-) create mode 100644 java/test/resources/parampixeldensity.expected create mode 100644 java/test/resources/parampixeldensity.pde create mode 100644 java/test/resources/staticpixeldensity.expected create mode 100644 java/test/resources/staticpixeldensity.pde diff --git a/java/src/processing/mode/java/preproc/PdeParseTreeListener.java b/java/src/processing/mode/java/preproc/PdeParseTreeListener.java index 294fbf6c0..cdb454668 100644 --- a/java/src/processing/mode/java/preproc/PdeParseTreeListener.java +++ b/java/src/processing/mode/java/preproc/PdeParseTreeListener.java @@ -52,6 +52,7 @@ public class PdeParseTreeListener extends ProcessingBaseListener { private static final String VERSION_STR = "3.0.0"; private static final String SIZE_METHOD_NAME = "size"; + private static final String PIXEL_DENSITY_METHOD_NAME = "pixelDensity"; private static final String FULLSCREEN_METHOD_NAME = "fullScreen"; private final int tabSize; @@ -74,8 +75,10 @@ public class PdeParseTreeListener extends ProcessingBaseListener { private String sketchWidth; private String sketchHeight; private String sketchRenderer; + private String pixelDensity; private boolean sizeRequiresRewrite = false; + private boolean pixelDensityRequiresRewrite = false; private boolean sizeIsFullscreen = false; private RewriteResult headerResult; private RewriteResult footerResult; @@ -310,6 +313,10 @@ public class PdeParseTreeListener extends ProcessingBaseListener { if (SIZE_METHOD_NAME.equals(methodName) || FULLSCREEN_METHOD_NAME.equals(methodName)) { handleSizeCall(ctx); } + + if (PIXEL_DENSITY_METHOD_NAME.equals(methodName)) { + handlePixelDensityCall(ctx); + } } /** @@ -655,6 +662,35 @@ public class PdeParseTreeListener extends ProcessingBaseListener { } } + protected void handlePixelDensityCall(ParserRuleContext ctx) { + ParserRuleContext testCtx = ctx.getParent() + .getParent() + .getParent() + .getParent(); + + boolean isInGlobal = + testCtx instanceof ProcessingParser.StaticProcessingSketchContext; + + boolean isInSetup; + if (!isInGlobal) { + ParserRuleContext methodDeclaration = testCtx.getParent() + .getParent(); + + isInSetup = isMethodSetup(methodDeclaration); + } else { + isInSetup = false; + } + + ParseTree argsContext = ctx.getChild(2); + + if (isInGlobal || isInSetup) { + pixelDensity = argsContext.getChild(0).getText(); + delete(ctx.start, ctx.stop); + insertAfter(ctx.stop, "/* pixelDensity commented out by preprocessor */"); + pixelDensityRequiresRewrite = true; + } + } + /** * Determine if a method declaration is for setup. * @@ -981,35 +1017,43 @@ public class PdeParseTreeListener extends ProcessingBaseListener { protected void writeExtraFieldsAndMethods(PrintWriterWithEditGen classBodyWriter, RewriteResultBuilder resultBuilder) { - if (!sizeRequiresRewrite) { + if (!sizeRequiresRewrite && !pixelDensityRequiresRewrite) { return; } String settingsOuterTemplate = indent1 + "public void settings() { %s }"; - String settingsInner; - if (sizeIsFullscreen) { - String fullscreenInner = sketchRenderer == null ? "" : sketchRenderer; - settingsInner = String.format("fullScreen(%s);", fullscreenInner); - } else { + StringBuilder settingsInner = new StringBuilder(); - if (sketchWidth.isEmpty() || sketchHeight.isEmpty()) { - return; + if (sizeRequiresRewrite) { + if (sizeIsFullscreen) { + String fullscreenInner = sketchRenderer == null ? "" : sketchRenderer; + settingsInner.append(String.format("fullScreen(%s);", fullscreenInner)); + } else { + + if (sketchWidth.isEmpty() || sketchHeight.isEmpty()) { + return; + } + + StringJoiner argJoiner = new StringJoiner(","); + argJoiner.add(sketchWidth); + argJoiner.add(sketchHeight); + + if (sketchRenderer != null) { + argJoiner.add(sketchRenderer); + } + + settingsInner.append(String.format("size(%s);", argJoiner.toString())); } + } - StringJoiner argJoiner = new StringJoiner(","); - argJoiner.add(sketchWidth); - argJoiner.add(sketchHeight); - - if (sketchRenderer != null) { - argJoiner.add(sketchRenderer); - } - - settingsInner = String.format("size(%s);", argJoiner.toString()); + if (pixelDensityRequiresRewrite) { + settingsInner.append("\n"); + settingsInner.append(String.format("pixelDensity(%s);", pixelDensity)); } - String newCode = String.format(settingsOuterTemplate, settingsInner); + String newCode = String.format(settingsOuterTemplate, settingsInner.toString()); classBodyWriter.addEmptyLine(); classBodyWriter.addCodeLine(newCode); diff --git a/java/test/processing/mode/java/ParserTests.java b/java/test/processing/mode/java/ParserTests.java index 8fac2bcd6..377957603 100644 --- a/java/test/processing/mode/java/ParserTests.java +++ b/java/test/processing/mode/java/ParserTests.java @@ -378,6 +378,16 @@ public class ParserTests { expectGood("packageTest", true, Optional.of("test.subtest")); } + @Test + public void testStaticPixelDensity() { + expectGood("staticpixeldensity"); + } + + @Test + public void testParamPixelDensity() { + expectGood("parampixeldensity"); + } + private static boolean compile(String id, String program) { // Create compilable AST to get syntax problems CompilationUnit compilableCU = JdtCompilerUtil.makeAST( diff --git a/java/test/resources/parampixeldensity.expected b/java/test/resources/parampixeldensity.expected new file mode 100644 index 000000000..616b000ba --- /dev/null +++ b/java/test/resources/parampixeldensity.expected @@ -0,0 +1,44 @@ +import processing.core.*; +import processing.data.*; +import processing.event.*; +import processing.opengl.*; + +import java.util.HashMap; +import java.util.ArrayList; +import java.io.File; +import java.io.BufferedReader; +import java.io.PrintWriter; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.IOException; + +public class parampixeldensity extends PApplet { + + public void setup() { + /* size commented out by preprocessor */; + // Pulling the display's density dynamically + /* pixelDensity commented out by preprocessor */; + noStroke(); + } + + public void draw() { + background(0); + ellipse(30, 48, 36, 36); + ellipse(70, 48, 36, 36); + } + + public void settings() { + size(100,100); + pixelDensity(displayDensity()); + } + + static public void main(String[] passedArgs) { + String[] appletArgs = new String[] { "parampixeldensity" }; + if (passedArgs != null) { + PApplet.main(concat(appletArgs, passedArgs)); + } else { + PApplet.main(appletArgs); + } + } + +} diff --git a/java/test/resources/parampixeldensity.pde b/java/test/resources/parampixeldensity.pde new file mode 100644 index 000000000..ff0f8376c --- /dev/null +++ b/java/test/resources/parampixeldensity.pde @@ -0,0 +1,12 @@ +void setup() { + size(100, 100); + // Pulling the display's density dynamically + pixelDensity(displayDensity()); + noStroke(); +} + +void draw() { + background(0); + ellipse(30, 48, 36, 36); + ellipse(70, 48, 36, 36); +} diff --git a/java/test/resources/staticpixeldensity.expected b/java/test/resources/staticpixeldensity.expected new file mode 100644 index 000000000..58267bf79 --- /dev/null +++ b/java/test/resources/staticpixeldensity.expected @@ -0,0 +1,41 @@ +import processing.core.*; +import processing.data.*; +import processing.event.*; +import processing.opengl.*; + +import java.util.HashMap; +import java.util.ArrayList; +import java.io.File; +import java.io.BufferedReader; +import java.io.PrintWriter; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.IOException; + +public class staticpixeldensity extends PApplet { + + public void setup() { +/* size commented out by preprocessor */; +/* pixelDensity commented out by preprocessor */; +noStroke(); +background(0); +ellipse(30, 48, 36, 36); +ellipse(70, 48, 36, 36); + + noLoop(); + } + + public void settings() { + size(100,100); + pixelDensity(2); + } + + static public void main(String[] passedArgs) { + String[] appletArgs = new String[] { "staticpixeldensity" }; + if (passedArgs != null) { + PApplet.main(concat(appletArgs, passedArgs)); + } else { + PApplet.main(appletArgs); + } + } +} diff --git a/java/test/resources/staticpixeldensity.pde b/java/test/resources/staticpixeldensity.pde new file mode 100644 index 000000000..5e2e09899 --- /dev/null +++ b/java/test/resources/staticpixeldensity.pde @@ -0,0 +1,6 @@ +size(100, 100); +pixelDensity(2); +noStroke(); +background(0); +ellipse(30, 48, 36, 36); +ellipse(70, 48, 36, 36);