Skip to content

Commit 2e6fa41

Browse files
committed
updating preprocessor to new API
1 parent b6cae00 commit 2e6fa41

File tree

2 files changed

+134
-1
lines changed

2 files changed

+134
-1
lines changed

mode/src/processing/mode/android/AndroidBuild.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@
3333
import processing.app.Util;
3434
import processing.core.PApplet;
3535
import processing.mode.java.JavaBuild;
36-
import processing.mode.java.preproc.SurfaceInfo;
36+
import processing.mode.java.preproc.PdePreprocessor;
37+
//import processing.mode.java.preproc.SurfaceInfo;
38+
import processing.mode.java.preproc.PreprocessorResult;
3739

3840
import java.io.*;
3941
import java.util.HashMap;
@@ -226,6 +228,7 @@ protected File createProject(boolean external)
226228
manifest = new Manifest(sketch, appComponent, mode.getFolder(), false);
227229
manifest.setSdkTarget(TARGET_SDK);
228230

231+
/*
229232
// build the preproc and get to work
230233
AndroidPreprocessor preproc = new AndroidPreprocessor(sketch, getPackageName());
231234
// On Android, this init will throw a SketchException if there's a problem with size()
@@ -241,6 +244,26 @@ protected File createProject(boolean external)
241244
}
242245
243246
return tmpFolder;
247+
*/
248+
249+
// build the preproc and get to work
250+
PdePreprocessor preproc = AndroidPreprocessorFactory.build(sketch.getName(), getPackageName());
251+
252+
// On Android, this init will throw a SketchException if there's a problem with size()
253+
PreprocessorResult info = preproc.initSketchSize(sketch.getMainProgram());
254+
255+
// SurfaceInfo info = preproc.initSketchSize(sketch.getMainProgram());
256+
// preproc.initSketchSmooth(sketch.getMainProgram());
257+
258+
sketchClassName = preprocess(srcFolder, getPackageName(), preproc, false);
259+
if (sketchClassName != null) {
260+
renderer = info.getSketchRenderer();
261+
writeMainClass(srcFolder, renderer, external);
262+
createTopModule("':" + module +"'");
263+
createAppModule(module);
264+
}
265+
266+
return tmpFolder;
244267
}
245268

246269

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package processing.mode.android;
2+
3+
import org.antlr.v4.runtime.TokenStream;
4+
import processing.mode.java.preproc.PdeParseTreeListener;
5+
import processing.mode.java.preproc.PdePreprocessor;
6+
7+
8+
/**
9+
* Demo object to show how to create PdePreprocessors with custom code generator.
10+
*
11+
* <p>
12+
* Demo factory to show how to create PdePreprocessors with custom code generator where, in
13+
* practice, one would likely have this code within another object.
14+
* </p>
15+
*/
16+
public class AndroidPreprocessorFactory {
17+
18+
/**
19+
* Build a new preprocessor.
20+
*
21+
* @param sketchName The name of the sketch to be preprocessed.
22+
* @return Newly created preprocessor.
23+
*/
24+
public static PdePreprocessor build(String sketchName) {
25+
return build(sketchName);
26+
}
27+
28+
/**
29+
* Build a new preprocessor.
30+
*
31+
* @param sketchName The name of the sketch to be preprocessed.
32+
* @param packageName The package in which the sketch encosing class should be a member.
33+
* @return Newly created preprocessor.
34+
*/
35+
public static PdePreprocessor build(String sketchName, String packageName) {
36+
return PdePreprocessor.builderFor(sketchName) // New builder object
37+
.setParseTreeListenerFactory((tokens, name, tabSize) -> new AndroidTreeListener(
38+
tokens,
39+
name,
40+
tabSize,
41+
packageName
42+
))
43+
.build();
44+
}
45+
46+
/**
47+
* Subclass of the rewriter code generator to support Android.
48+
*
49+
* <p>
50+
* The rewriter code generator has some non-trivial logic to help generate difficult parts of the
51+
* sketch java translation including its "header" and "footer". The Android build requires a
52+
* package which is injected at the start of teh header contents.
53+
* </p>
54+
*/
55+
private static class AndroidTreeListener extends PdeParseTreeListener {
56+
57+
private final String packageName;
58+
59+
/**
60+
* Create a new Android rewriter code generator.
61+
*
62+
* @param tokens The sketch code as tokens.
63+
* @param newSketchName The name of the sketch.
64+
* @param newTabSize The size of the tabs in spaces.
65+
* @param newPackageName The package in which the sketch code should be placed.
66+
*/
67+
public AndroidTreeListener(TokenStream tokens, String newSketchName, int newTabSize,
68+
String newPackageName) {
69+
70+
super(tokens, newSketchName, newTabSize);
71+
packageName = newPackageName;
72+
}
73+
74+
/**
75+
* Override the header contents generation.
76+
*
77+
* @param writer The writer through which code edits can be made.
78+
* @param params The parameters for the code generator from the preprocessor as determined by
79+
* sketch code and settings.
80+
* @param resultBuilder Builder for reporting out results to the caller.
81+
*/
82+
@Override
83+
public void writeHeaderContents(PrintWriterWithEditGen writer, RewriteParams params,
84+
RewriteResultBuilder resultBuilder) {
85+
86+
// Add the package before any other header content. This puts it at the top of the file.
87+
if (packageName != null) {
88+
writer.addCodeLine("package " + packageName + ";");
89+
writer.addEmptyLine();
90+
}
91+
92+
// Write the remaining stuff.
93+
super.writeHeaderContents(writer, params, resultBuilder);
94+
}
95+
96+
/**
97+
* Write the contents of the footer using a prebuilt print writer.
98+
*
99+
* @param decoratedWriter he writer though which the comment should be introduced.
100+
* @param params The parameters for the rewrite.
101+
* @param resultBuilder Builder for reporting out results to the caller.
102+
*/
103+
protected void writeFooterContents(PrintWriterWithEditGen decoratedWriter, RewriteParams params,
104+
RewriteResultBuilder resultBuilder) {
105+
super.writeFooterContents(decoratedWriter, params, resultBuilder);
106+
}
107+
108+
}
109+
110+
}

0 commit comments

Comments
 (0)