mirror of
https://github.com/processing/processing4.git
synced 2026-01-30 03:41:15 +01:00
Allow subclassing of RewriterCodeGenerator.
Some difficult to generate code is managed by the RewriterCodeGenerator and some modes may need to modify that logic. This commit makes it easier to extend parts of RewriterCodeGenerator without requiring client code to duplicate too much effort.
This commit is contained in:
@@ -76,6 +76,7 @@ public class PdeParseTreeListener extends ProcessingBaseListener {
|
||||
private boolean sizeIsFullscreen = false;
|
||||
private RewriteResult headerResult;
|
||||
private RewriteResult footerResult;
|
||||
private RewriterCodeGenerator codeGen;
|
||||
|
||||
private Optional<PdeParseTreeErrorListener> pdeParseTreeErrorListenerMaybe;
|
||||
|
||||
@@ -91,6 +92,31 @@ public class PdeParseTreeListener extends ProcessingBaseListener {
|
||||
sketchName = newSketchName;
|
||||
tabSize = newTabSize;
|
||||
|
||||
codeGen = new RewriterCodeGenerator(tabSize);
|
||||
pdeParseTreeErrorListenerMaybe = Optional.empty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new listener with a customized code generator.
|
||||
*
|
||||
* <p>
|
||||
* A significant amount of code is generated via a {RewriterCodeGenerator} and this constructor
|
||||
* allows client code to specify different generators as needed by their modes.
|
||||
* </p>
|
||||
*
|
||||
* @param tokens The tokens over which to rewrite.
|
||||
* @param newSketchName The name of the sketch being traversed.
|
||||
* @param newTabSize Size of tab / indent.
|
||||
* @param newCodeGen The new code generator to use within this listener.
|
||||
*/
|
||||
PdeParseTreeListener(TokenStream tokens, String newSketchName, int newTabSize,
|
||||
RewriterCodeGenerator newCodeGen) {
|
||||
|
||||
rewriter = new TokenStreamRewriter(tokens);
|
||||
sketchName = newSketchName;
|
||||
tabSize = newTabSize;
|
||||
codeGen = newCodeGen;
|
||||
|
||||
pdeParseTreeErrorListenerMaybe = Optional.empty();
|
||||
}
|
||||
|
||||
@@ -235,13 +261,10 @@ public class PdeParseTreeListener extends ProcessingBaseListener {
|
||||
* @param ctx The context from ANTLR for the processing sketch.
|
||||
*/
|
||||
public void exitProcessingSketch(ProcessingParser.ProcessingSketchContext ctx) {
|
||||
// header
|
||||
RewriteParams rewriteParams = createRewriteParams();
|
||||
|
||||
RewriterCodeGenerator codeGen = new RewriterCodeGenerator(tabSize);
|
||||
|
||||
headerResult = codeGen.writeHeader(rewriter, rewriteParams);
|
||||
|
||||
// header
|
||||
headerResult = codeGen.prepareHeader(rewriter, rewriteParams);
|
||||
lineOffset = headerResult.getLineOffset();
|
||||
|
||||
// footer
|
||||
@@ -249,7 +272,7 @@ public class PdeParseTreeListener extends ProcessingBaseListener {
|
||||
int tokens = tokenStream.size();
|
||||
int length = tokenStream.get(tokens-1).getStopIndex();
|
||||
|
||||
footerResult = codeGen.writeFooter(rewriter, rewriteParams, length);
|
||||
footerResult = codeGen.prepareFooter(rewriter, rewriteParams, length);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -719,4 +742,5 @@ public class PdeParseTreeListener extends ProcessingBaseListener {
|
||||
void onError(PdePreprocessIssue issue);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -294,7 +294,7 @@ public class PdePreprocessor {
|
||||
* @param newFactory The factory to use in building a parse tree listener.
|
||||
* @return This builder for method chaining.
|
||||
*/
|
||||
public PdePreprocessorBuilder setParseTreeFactory(ParseTreeListenerFactory newFactory) {
|
||||
public PdePreprocessorBuilder setParseTreeListenerFactory(ParseTreeListenerFactory newFactory) {
|
||||
parseTreeFactory = Optional.of(newFactory);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -35,13 +35,14 @@ public class RewriterCodeGenerator {
|
||||
}
|
||||
|
||||
/**
|
||||
* Write preface code to wrap sketch code so that it is contained within a proper Java definition.
|
||||
* Prepare preface code to wrap sketch code so that it is contained within a proper Java
|
||||
* definition.
|
||||
*
|
||||
* @param headerWriter The writer into which the header should be written.
|
||||
* @param params The parameters for the rewrite.
|
||||
* @return Information about the completed rewrite.
|
||||
*/
|
||||
public RewriteResult writeHeader(TokenStreamRewriter headerWriter, RewriteParams params) {
|
||||
public RewriteResult prepareHeader(TokenStreamRewriter headerWriter, RewriteParams params) {
|
||||
|
||||
RewriteResultBuilder resultBuilder = new RewriteResultBuilder();
|
||||
|
||||
@@ -52,6 +53,50 @@ public class RewriterCodeGenerator {
|
||||
true
|
||||
);
|
||||
|
||||
writeHeaderContents(decoratedWriter, params, resultBuilder);
|
||||
|
||||
decoratedWriter.finish();
|
||||
|
||||
return resultBuilder.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare the footer for a sketch (finishes the constructs introduced in header like class def).
|
||||
*
|
||||
* @param footerWriter The writer through which the footer should be introduced.
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param insertPoint The loction at which the footer should be written.
|
||||
* @return Information about the completed rewrite.
|
||||
*/
|
||||
public RewriteResult prepareFooter(TokenStreamRewriter footerWriter, RewriteParams params,
|
||||
int insertPoint) {
|
||||
|
||||
RewriteResultBuilder resultBuilder = new RewriteResultBuilder();
|
||||
|
||||
PrintWriterWithEditGen decoratedWriter = new PrintWriterWithEditGen(
|
||||
footerWriter,
|
||||
resultBuilder,
|
||||
insertPoint,
|
||||
false
|
||||
);
|
||||
|
||||
writeFooterContents(decoratedWriter, params, resultBuilder);
|
||||
|
||||
decoratedWriter.finish();
|
||||
|
||||
return resultBuilder.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the contents of the header using a prebuilt print writer.
|
||||
*
|
||||
* @param decoratedWriter he writer though which the comment should be introduced.
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param resultBuilder Builder for reporting out results to the caller.
|
||||
*/
|
||||
protected void writeHeaderContents(PrintWriterWithEditGen decoratedWriter, RewriteParams params,
|
||||
RewriteResultBuilder resultBuilder) {
|
||||
|
||||
if (!params.getisTesting()) writePreprocessorComment(decoratedWriter, params, resultBuilder);
|
||||
writeImports(decoratedWriter, params, resultBuilder);
|
||||
|
||||
@@ -69,31 +114,17 @@ public class RewriterCodeGenerator {
|
||||
if (requiresStaticSketchHeader) {
|
||||
writeStaticSketchHeader(decoratedWriter, params, resultBuilder);
|
||||
}
|
||||
|
||||
decoratedWriter.finish();
|
||||
|
||||
return resultBuilder.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the footer for a sketch (finishes the constructs introduced in header like class def).
|
||||
* Write the contents of the footer using a prebuilt print writer.
|
||||
*
|
||||
* @param footerWriter The writer through which the footer should be introduced.
|
||||
* @param decoratedWriter he writer though which the comment should be introduced.
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param insertPoint The loction at which the footer should be written.
|
||||
* @return Information about the completed rewrite.
|
||||
* @param resultBuilder Builder for reporting out results to the caller.
|
||||
*/
|
||||
public RewriteResult writeFooter(TokenStreamRewriter footerWriter, RewriteParams params,
|
||||
int insertPoint) {
|
||||
|
||||
RewriteResultBuilder resultBuilder = new RewriteResultBuilder();
|
||||
|
||||
PrintWriterWithEditGen decoratedWriter = new PrintWriterWithEditGen(
|
||||
footerWriter,
|
||||
resultBuilder,
|
||||
insertPoint,
|
||||
false
|
||||
);
|
||||
protected void writeFooterContents(PrintWriterWithEditGen decoratedWriter, RewriteParams params,
|
||||
RewriteResultBuilder resultBuilder) {
|
||||
|
||||
decoratedWriter.addEmptyLine();
|
||||
|
||||
@@ -112,10 +143,6 @@ public class RewriterCodeGenerator {
|
||||
if (!params.getFoundMain()) writeMain(decoratedWriter, params, resultBuilder);
|
||||
writeClassFooter(decoratedWriter, params, resultBuilder);
|
||||
}
|
||||
|
||||
decoratedWriter.finish();
|
||||
|
||||
return resultBuilder.build();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -125,7 +152,7 @@ public class RewriterCodeGenerator {
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param resultBuilder Builder for reporting out results to the caller.
|
||||
*/
|
||||
private void writePreprocessorComment(PrintWriterWithEditGen headerWriter, RewriteParams params,
|
||||
protected void writePreprocessorComment(PrintWriterWithEditGen headerWriter, RewriteParams params,
|
||||
RewriteResultBuilder resultBuilder) {
|
||||
|
||||
String dateStr = new SimpleDateFormat("YYYY-MM-dd").format(new Date());
|
||||
@@ -146,7 +173,7 @@ public class RewriterCodeGenerator {
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param resultBuilder Builder for reporting out results to the caller.
|
||||
*/
|
||||
private void writeImports(PrintWriterWithEditGen headerWriter, RewriteParams params,
|
||||
protected void writeImports(PrintWriterWithEditGen headerWriter, RewriteParams params,
|
||||
RewriteResultBuilder resultBuilder) {
|
||||
|
||||
writeImportList(headerWriter, params.getCoreImports(), params, resultBuilder);
|
||||
@@ -163,7 +190,7 @@ public class RewriterCodeGenerator {
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param resultBuilder Builder for reporting out results to the caller.
|
||||
*/
|
||||
private void writeImportList(PrintWriterWithEditGen headerWriter, List<String> imports, RewriteParams params,
|
||||
protected void writeImportList(PrintWriterWithEditGen headerWriter, List<String> imports, RewriteParams params,
|
||||
RewriteResultBuilder resultBuilder) {
|
||||
|
||||
writeImportList(headerWriter, imports.toArray(new String[0]), params, resultBuilder);
|
||||
@@ -177,8 +204,8 @@ public class RewriterCodeGenerator {
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param resultBuilder Builder for reporting out results to the caller.
|
||||
*/
|
||||
private void writeImportList(PrintWriterWithEditGen headerWriter, String[] imports, RewriteParams params,
|
||||
RewriteResultBuilder resultBuilder) {
|
||||
protected void writeImportList(PrintWriterWithEditGen headerWriter, String[] imports,
|
||||
RewriteParams params, RewriteResultBuilder resultBuilder) {
|
||||
|
||||
for (String importDecl : imports) {
|
||||
headerWriter.addCodeLine("import " + importDecl + ";");
|
||||
@@ -195,7 +222,7 @@ public class RewriterCodeGenerator {
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param resultBuilder Builder for reporting out results to the caller.
|
||||
*/
|
||||
private void writeClassHeader(PrintWriterWithEditGen headerWriter, RewriteParams params,
|
||||
protected void writeClassHeader(PrintWriterWithEditGen headerWriter, RewriteParams params,
|
||||
RewriteResultBuilder resultBuilder) {
|
||||
|
||||
headerWriter.addCodeLine("public class " + params.getSketchName() + " extends PApplet {");
|
||||
@@ -210,7 +237,7 @@ public class RewriterCodeGenerator {
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param resultBuilder Builder for reporting out results to the caller.
|
||||
*/
|
||||
private void writeStaticSketchHeader(PrintWriterWithEditGen headerWriter, RewriteParams params,
|
||||
protected void writeStaticSketchHeader(PrintWriterWithEditGen headerWriter, RewriteParams params,
|
||||
RewriteResultBuilder resultBuilder) {
|
||||
|
||||
headerWriter.addCodeLine(indent1 + "public void setup() {");
|
||||
@@ -223,7 +250,7 @@ public class RewriterCodeGenerator {
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param resultBuilder Builder for reporting out results to the caller.
|
||||
*/
|
||||
private void writeStaticSketchFooter(PrintWriterWithEditGen footerWriter, RewriteParams params,
|
||||
protected void writeStaticSketchFooter(PrintWriterWithEditGen footerWriter, RewriteParams params,
|
||||
RewriteResultBuilder resultBuilder) {
|
||||
|
||||
footerWriter.addCodeLine(indent2 + "noLoop();");
|
||||
@@ -231,15 +258,15 @@ public class RewriterCodeGenerator {
|
||||
}
|
||||
|
||||
/**
|
||||
* Write code supporting speical functions like size.
|
||||
* Write code supporting special functions like size.
|
||||
*
|
||||
* @param classBodyWriter The writer into which the code should be written. Should be for class
|
||||
* body.
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param resultBuilder Builder for reporting out results to the caller.
|
||||
*/
|
||||
private void writeExtraFieldsAndMethods(PrintWriterWithEditGen classBodyWriter, RewriteParams params,
|
||||
RewriteResultBuilder resultBuilder) {
|
||||
protected void writeExtraFieldsAndMethods(PrintWriterWithEditGen classBodyWriter,
|
||||
RewriteParams params, RewriteResultBuilder resultBuilder) {
|
||||
|
||||
if (!params.getIsSizeValidInGlobal()) {
|
||||
return;
|
||||
@@ -282,7 +309,7 @@ public class RewriterCodeGenerator {
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param resultBuilder Builder for reporting out results to the caller.
|
||||
*/
|
||||
private void writeMain(PrintWriterWithEditGen footerWriter, RewriteParams params,
|
||||
protected void writeMain(PrintWriterWithEditGen footerWriter, RewriteParams params,
|
||||
RewriteResultBuilder resultBuilder) {
|
||||
|
||||
footerWriter.addEmptyLine();
|
||||
@@ -323,7 +350,7 @@ public class RewriterCodeGenerator {
|
||||
* @param params The parameters for the rewrite.
|
||||
* @param resultBuilder Builder for reporting out results to the caller.
|
||||
*/
|
||||
private void writeClassFooter(PrintWriterWithEditGen footerWriter, RewriteParams params,
|
||||
protected void writeClassFooter(PrintWriterWithEditGen footerWriter, RewriteParams params,
|
||||
RewriteResultBuilder resultBuilder) {
|
||||
|
||||
footerWriter.addCodeLine("}");
|
||||
|
||||
Reference in New Issue
Block a user