From d08048eca981a4b53d890413ebf3115d3d26c399 Mon Sep 17 00:00:00 2001 From: A Pottinger Date: Fri, 11 Oct 2019 07:56:24 -0700 Subject: [PATCH] Allow override of core and default imports for PdeParseTreeListener. In support of modes, allow client code override of core and default imports for PdeParseTreeListener. --- .../mode/java/pdex/PreprocessingService.java | 9 ++- .../mode/java/preproc/PdePreprocessor.java | 70 +++++++++++++++++-- 2 files changed, 70 insertions(+), 9 deletions(-) diff --git a/java/src/processing/mode/java/pdex/PreprocessingService.java b/java/src/processing/mode/java/pdex/PreprocessingService.java index 5d24b12da..51313236b 100644 --- a/java/src/processing/mode/java/pdex/PreprocessingService.java +++ b/java/src/processing/mode/java/pdex/PreprocessingService.java @@ -52,7 +52,6 @@ import processing.mode.java.pdex.util.ProblemFactory; import processing.mode.java.pdex.util.RuntimePathBuilder; import processing.mode.java.preproc.PdePreprocessor; import processing.mode.java.preproc.PreprocessorResult; -import processing.mode.java.preproc.code.ImportUtil; import processing.mode.java.preproc.code.SyntaxUtil; @@ -522,16 +521,16 @@ public class PreprocessingService { /** * Determine which imports need to be available for core processing services. * - * @param p The preprocessor to operate on. + * @param preprocessor The preprocessor to operate on. * @return The import statements that need to be present. */ - private static List buildCoreAndDefaultImports(PdePreprocessor p) { + private static List buildCoreAndDefaultImports(PdePreprocessor preprocessor) { List result = new ArrayList<>(); - for (String imp : ImportUtil.getCoreImports()) { + for (String imp : preprocessor.getCoreImports()) { result.add(ImportStatement.parse(imp)); } - for (String imp : ImportUtil.getDefaultImports()) { + for (String imp : preprocessor.getDefaultImports()) { result.add(ImportStatement.parse(imp)); } diff --git a/java/src/processing/mode/java/preproc/PdePreprocessor.java b/java/src/processing/mode/java/preproc/PdePreprocessor.java index 6569986cd..0fb2ca8c4 100644 --- a/java/src/processing/mode/java/preproc/PdePreprocessor.java +++ b/java/src/processing/mode/java/preproc/PdePreprocessor.java @@ -24,6 +24,7 @@ package processing.mode.java.preproc; import java.io.PrintWriter; import java.io.Writer; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -75,6 +76,8 @@ public class PdePreprocessor { private final int tabSize; private final boolean isTesting; private final ParseTreeListenerFactory listenerFactory; + private final List defaultImports; + private final List coreImports; private boolean foundMain; @@ -103,14 +106,19 @@ public class PdePreprocessor { * (false). * @param newFactory The factory to use for building the ANTLR tree traversal listener where * preprocessing edits should be made. + * @param newDefaultImports Imports provided for user convenience. + * @param newCoreImports Imports required for core or processing itself. */ public PdePreprocessor(final String newSketchName, final int newTabSize, boolean newIsTesting, - final ParseTreeListenerFactory newFactory) { + final ParseTreeListenerFactory newFactory, List newDefaultImports, + List newCoreImports) { sketchName = newSketchName; tabSize = newTabSize; isTesting = newIsTesting; listenerFactory = newFactory; + defaultImports = newDefaultImports; + coreImports = newCoreImports; } /** @@ -180,8 +188,8 @@ public class PdePreprocessor { final List treeIssues = new ArrayList<>(); PdeParseTreeListener listener = listenerFactory.build(tokens, sketchName, tabSize); listener.setTesting(isTesting); - listener.setCoreImports(ImportUtil.getCoreImports()); - listener.setDefaultImports(ImportUtil.getDefaultImports()); + listener.setCoreImports(coreImports); + listener.setDefaultImports(defaultImports); listener.setCodeFolderImports(codeFolderImports); listener.setTreeErrorListener((x) -> { treeIssues.add(x); }); @@ -229,6 +237,24 @@ public class PdePreprocessor { return foundMain; } + /** + * Get the more or processing-required imports that this preprocessor is using. + * + * @return List of imports required by processing or this mode. + */ + public List getCoreImports() { + return coreImports; + } + + /** + * Get convenience imports provided on the user's behalf. + * + * @return Imports included by default but not required by processing or the mode. + */ + public List getDefaultImports() { + return defaultImports; + } + /* ======================== * === Type Definitions === * ======================== @@ -252,12 +278,16 @@ public class PdePreprocessor { private Optional tabSize; private Optional isTesting; private Optional parseTreeFactory; + private Optional> defaultImports; + private Optional> coreImports; private PdePreprocessorBuilder(String newSketchName) { sketchName = newSketchName; tabSize = Optional.empty(); isTesting = Optional.empty(); parseTreeFactory = Optional.empty(); + defaultImports = Optional.empty(); + coreImports = Optional.empty(); } /** @@ -299,6 +329,28 @@ public class PdePreprocessor { return this; } + /** + * Indicate which imports are provided on behalf of the user for convenience. + * + * @param newDefaultImports The new set of default imports. + * @return This builder for method chaining. + */ + public PdePreprocessorBuilder setDefaultImports(List newDefaultImports) { + defaultImports = Optional.of(newDefaultImports); + return this; + } + + /** + * Indicate which imports are required by processing or the mode itself. + * + * @param newCoreImports The new set of core imports. + * @return This builder for method chaining. + */ + public PdePreprocessorBuilder setCoreImports(List newCoreImports) { + coreImports = Optional.of(newCoreImports); + return this; + } + /** * Build the preprocessor. * @@ -315,11 +367,21 @@ public class PdePreprocessor { PdeParseTreeListener::new ); + List effectiveDefaultImports = defaultImports.orElseGet( + () -> Arrays.asList(ImportUtil.getDefaultImports()) + ); + + List effectiveCoreImports = coreImports.orElseGet( + () -> Arrays.asList(ImportUtil.getCoreImports()) + ); + return new PdePreprocessor( sketchName, effectiveTabSize, effectiveIsTesting, - effectiveFactory + effectiveFactory, + effectiveDefaultImports, + effectiveCoreImports ); }