diff --git a/.idea/modules.xml b/.idea/modules.xml
index 1aec8ebf6..7637008bd 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -6,6 +6,7 @@
+
diff --git a/.idea/modules/java/preprocessor/processing.java.preprocessor.main.iml b/.idea/modules/java/preprocessor/processing.java.preprocessor.main.iml
new file mode 100644
index 000000000..45d18f02a
--- /dev/null
+++ b/.idea/modules/java/preprocessor/processing.java.preprocessor.main.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 599b675c4..e4acb47be 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -70,6 +70,7 @@ dependencies {
implementation(project(":core"))
runtimeOnly(project(":java"))
+ implementation(project(":java:preprocessor"))
implementation(compose.runtime)
implementation(compose.foundation)
diff --git a/java/build.gradle.kts b/java/build.gradle.kts
index 63492afb7..15c269d23 100644
--- a/java/build.gradle.kts
+++ b/java/build.gradle.kts
@@ -19,6 +19,7 @@ sourceSets{
dependencies{
implementation(project(":app"))
implementation(project(":core"))
+ implementation(project(":java:preprocessor"))
diff --git a/java/preprocessor/build.gradle.kts b/java/preprocessor/build.gradle.kts
index 169323ad8..4f2817476 100644
--- a/java/preprocessor/build.gradle.kts
+++ b/java/preprocessor/build.gradle.kts
@@ -25,6 +25,8 @@ sourceSets{
dependencies{
implementation("org.antlr:antlr4:4.7.2")
+ implementation("org.eclipse.jdt:org.eclipse.jdt.core:3.40.0")
+
implementation("org.processing:core:${version}")
}
diff --git a/java/src/processing/mode/java/Commander.java b/java/src/processing/mode/java/Commander.java
index 26e191900..2a2ee9bc0 100644
--- a/java/src/processing/mode/java/Commander.java
+++ b/java/src/processing/mode/java/Commander.java
@@ -33,7 +33,7 @@ import processing.app.Platform;
import processing.app.Preferences;
import processing.app.RunnerListener;
import processing.app.Sketch;
-import processing.app.SketchException;
+import processing.mode.java.preproc.SketchException;
import processing.app.Util;
import processing.app.contrib.ModeContribution;
import processing.core.PApplet;
diff --git a/java/src/processing/mode/java/Compiler.java b/java/src/processing/mode/java/Compiler.java
index aaef2e8c3..3e9793169 100644
--- a/java/src/processing/mode/java/Compiler.java
+++ b/java/src/processing/mode/java/Compiler.java
@@ -26,6 +26,7 @@ package processing.mode.java;
import processing.app.*;
import processing.app.ui.Editor;
import processing.core.*;
+import processing.mode.java.preproc.SketchException;
import java.io.*;
import java.lang.reflect.Method;
diff --git a/java/src/processing/mode/java/CompletionGenerator.java b/java/src/processing/mode/java/CompletionGenerator.java
index 5a23816e9..549bfc3aa 100644
--- a/java/src/processing/mode/java/CompletionGenerator.java
+++ b/java/src/processing/mode/java/CompletionGenerator.java
@@ -60,6 +60,9 @@ import processing.app.Messages;
import com.google.classpath.ClassPath;
import com.google.classpath.RegExpResourceFilter;
+import processing.mode.java.preproc.ImportStatement;
+import processing.mode.java.preproc.SourceUtil;
+import processing.mode.java.preproc.TextTransform;
@SuppressWarnings({ "unchecked" })
public class CompletionGenerator {
diff --git a/java/src/processing/mode/java/JavaBuild.java b/java/src/processing/mode/java/JavaBuild.java
index 757954978..e180aba50 100644
--- a/java/src/processing/mode/java/JavaBuild.java
+++ b/java/src/processing/mode/java/JavaBuild.java
@@ -42,8 +42,10 @@ import processing.core.PApplet;
import processing.core.PConstants;
import processing.data.StringList;
import processing.data.XML;
+import processing.mode.java.preproc.ImportStatement;
import processing.mode.java.preproc.PdePreprocessor;
import processing.mode.java.preproc.PreprocessorResult;
+import processing.mode.java.preproc.SketchException;
public class JavaBuild {
@@ -275,7 +277,12 @@ public class JavaBuild {
for (ImportStatement item : result.getImportStatements()) {
String entry = item.getPackageName();
- Library library = mode.getLibrary(entry);
+ Library library = null;
+ try{
+ library = mode.getLibrary(entry);
+ }catch (processing.app.SketchException e){
+ throw new SketchException(e.getMessage());
+ }
if (library != null) {
if (!importedLibraries.contains(library)) {
diff --git a/java/src/processing/mode/java/JavaEditor.java b/java/src/processing/mode/java/JavaEditor.java
index 338a6bd29..9c4bb8435 100644
--- a/java/src/processing/mode/java/JavaEditor.java
+++ b/java/src/processing/mode/java/JavaEditor.java
@@ -50,7 +50,9 @@ import processing.mode.java.debug.Debugger;
import processing.mode.java.debug.LineBreakpoint;
import processing.mode.java.debug.LineHighlight;
import processing.mode.java.debug.LineID;
+import processing.mode.java.preproc.ImportStatement;
import processing.mode.java.preproc.PdePreprocessor;
+import processing.mode.java.preproc.SourceUtil;
import processing.mode.java.runner.Runner;
import processing.mode.java.tweak.ColorControlBox;
import processing.mode.java.tweak.Handle;
diff --git a/java/src/processing/mode/java/JavaMode.java b/java/src/processing/mode/java/JavaMode.java
index 79c790c12..d3e181235 100644
--- a/java/src/processing/mode/java/JavaMode.java
+++ b/java/src/processing/mode/java/JavaMode.java
@@ -36,6 +36,7 @@ import processing.app.ui.Editor;
import processing.app.ui.EditorException;
import processing.app.ui.EditorState;
+import processing.mode.java.preproc.SketchException;
import processing.mode.java.runner.Runner;
import processing.mode.java.tweak.SketchParser;
diff --git a/java/src/processing/mode/java/PreprocService.java b/java/src/processing/mode/java/PreprocService.java
index 718728d41..f70536294 100644
--- a/java/src/processing/mode/java/PreprocService.java
+++ b/java/src/processing/mode/java/PreprocService.java
@@ -56,11 +56,9 @@ import org.eclipse.jdt.core.dom.FileASTRequestor;
import processing.app.Messages;
import processing.app.Sketch;
import processing.app.SketchCode;
-import processing.app.SketchException;
import processing.app.Util;
-import processing.mode.java.TextTransform.OffsetMapper;
-import processing.mode.java.preproc.PdePreprocessor;
-import processing.mode.java.preproc.PreprocessorResult;
+import processing.mode.java.preproc.*;
+import processing.mode.java.preproc.TextTransform.OffsetMapper;
import processing.data.IntList;
import processing.data.StringList;
diff --git a/java/src/processing/mode/java/PreprocSketch.java b/java/src/processing/mode/java/PreprocSketch.java
index 8082a5964..394c7a3a4 100644
--- a/java/src/processing/mode/java/PreprocSketch.java
+++ b/java/src/processing/mode/java/PreprocSketch.java
@@ -16,7 +16,8 @@ import java.util.Map;
import processing.app.Problem;
import processing.app.Sketch;
import processing.core.PApplet;
-import processing.mode.java.TextTransform.OffsetMapper;
+import processing.mode.java.preproc.ImportStatement;
+import processing.mode.java.preproc.TextTransform.OffsetMapper;
public class PreprocSketch {
diff --git a/java/src/processing/mode/java/RuntimePathBuilder.java b/java/src/processing/mode/java/RuntimePathBuilder.java
index 08b49e63a..33e8f209c 100644
--- a/java/src/processing/mode/java/RuntimePathBuilder.java
+++ b/java/src/processing/mode/java/RuntimePathBuilder.java
@@ -41,6 +41,7 @@ import processing.app.Messages;
import processing.app.Sketch;
import processing.app.SketchException;
import processing.app.Util;
+import processing.mode.java.preproc.ImportStatement;
/**
diff --git a/java/src/processing/mode/java/ImportStatement.java b/java/src/processing/mode/java/preproc/ImportStatement.java
similarity index 99%
rename from java/src/processing/mode/java/ImportStatement.java
rename to java/src/processing/mode/java/preproc/ImportStatement.java
index f5438bf33..68f8c20ac 100644
--- a/java/src/processing/mode/java/ImportStatement.java
+++ b/java/src/processing/mode/java/preproc/ImportStatement.java
@@ -18,7 +18,7 @@ along with this program; if not, write to the Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-package processing.mode.java;
+package processing.mode.java.preproc;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
diff --git a/java/src/processing/mode/java/preproc/PdeIssueEmitter.java b/java/src/processing/mode/java/preproc/PdeIssueEmitter.java
index 7e5b48c5a..01d510060 100644
--- a/java/src/processing/mode/java/preproc/PdeIssueEmitter.java
+++ b/java/src/processing/mode/java/preproc/PdeIssueEmitter.java
@@ -24,7 +24,6 @@ package processing.mode.java.preproc;
import org.antlr.v4.runtime.BaseErrorListener;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;
-import processing.mode.java.SourceUtil;
import java.util.Optional;
diff --git a/java/src/processing/mode/java/preproc/PdeParseTreeListener.java b/java/src/processing/mode/java/preproc/PdeParseTreeListener.java
index 74c9f1496..fe3fd0c2d 100644
--- a/java/src/processing/mode/java/preproc/PdeParseTreeListener.java
+++ b/java/src/processing/mode/java/preproc/PdeParseTreeListener.java
@@ -30,12 +30,7 @@ import org.antlr.v4.runtime.misc.Interval;
import org.antlr.v4.runtime.tree.ParseTree;
-import processing.app.Base;
-import processing.app.Preferences;
import processing.core.PApplet;
-import processing.mode.java.ImportStatement;
-import processing.mode.java.SourceUtil;
-import processing.mode.java.TextTransform;
import processing.mode.java.preproc.PdePreprocessor.Mode;
/**
@@ -1062,7 +1057,7 @@ public class PdeParseTreeListener extends ProcessingBaseListener {
String newCode = String.format(
"/* autogenerated by Processing revision %04d on %s */",
- Base.getRevision(),
+ 1234,
dateStr
);
@@ -1237,21 +1232,21 @@ public class PdeParseTreeListener extends ProcessingBaseListener {
{ // assemble line with applet args
StringJoiner argsJoiner = new StringJoiner(", ");
- boolean shouldFullScreen = Preferences.getBoolean("export.application.present");
- shouldFullScreen = shouldFullScreen || Preferences.getBoolean("export.application.fullscreen");
- if (shouldFullScreen) {
- argsJoiner.add("\"" + PApplet.ARGS_FULL_SCREEN + "\"");
-
- String bgColor = Preferences.get("run.present.bgcolor");
- argsJoiner.add("\"" + PApplet.ARGS_BGCOLOR + "=" + bgColor + "\"");
-
- if (Preferences.getBoolean("export.application.stop")) {
- String stopColor = Preferences.get("run.present.stop.color");
- argsJoiner.add("\"" + PApplet.ARGS_STOP_COLOR + "=" + stopColor + "\"");
- } else {
- argsJoiner.add("\"" + PApplet.ARGS_HIDE_STOP + "\"");
- }
- }
+// boolean shouldFullScreen = Preferences.getBoolean("export.application.present");
+// shouldFullScreen = shouldFullScreen || Preferences.getBoolean("export.application.fullscreen");
+// if (shouldFullScreen) {
+// argsJoiner.add("\"" + PApplet.ARGS_FULL_SCREEN + "\"");
+//
+// String bgColor = Preferences.get("run.present.bgcolor");
+// argsJoiner.add("\"" + PApplet.ARGS_BGCOLOR + "=" + bgColor + "\"");
+//
+// if (Preferences.getBoolean("export.application.stop")) {
+// String stopColor = Preferences.get("run.present.stop.color");
+// argsJoiner.add("\"" + PApplet.ARGS_STOP_COLOR + "=" + stopColor + "\"");
+// } else {
+// argsJoiner.add("\"" + PApplet.ARGS_HIDE_STOP + "\"");
+// }
+// }
argsJoiner.add("\"" + sketchName + "\"");
footerWriter.addCode(argsJoiner.toString());
diff --git a/java/src/processing/mode/java/preproc/PdePreprocessor.java b/java/src/processing/mode/java/preproc/PdePreprocessor.java
index eb3f3946b..dc5273b7f 100644
--- a/java/src/processing/mode/java/preproc/PdePreprocessor.java
+++ b/java/src/processing/mode/java/preproc/PdePreprocessor.java
@@ -31,9 +31,7 @@ import java.util.Optional;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
-
-import processing.app.Preferences;
-import processing.app.SketchException;
+import processing.mode.java.preproc.SketchException;
/**
@@ -160,9 +158,9 @@ public class PdePreprocessor {
}
}
- if (Preferences.getBoolean("preproc.substitute_unicode")) {
- inProgram = substituteUnicode(inProgram);
- }
+// if (Preferences.getBoolean("preproc.substitute_unicode")) {
+// inProgram = substituteUnicode(inProgram);
+// }
// Ensure ends with single newline
while (inProgram.endsWith("\n")) {
@@ -414,7 +412,7 @@ public class PdePreprocessor {
*/
public PdePreprocessor build() {
final int effectiveTabSize =
- tabSize.orElseGet(() -> Preferences.getInteger("editor.tabs.size"));
+ tabSize.orElseGet(() -> 4);
final boolean effectiveIsTesting = isTesting.orElse(false);
diff --git a/java/src/processing/mode/java/preproc/PreprocessIssueMessageSimplifier.java b/java/src/processing/mode/java/preproc/PreprocessIssueMessageSimplifier.java
index 4e112d161..52e16757c 100644
--- a/java/src/processing/mode/java/preproc/PreprocessIssueMessageSimplifier.java
+++ b/java/src/processing/mode/java/preproc/PreprocessIssueMessageSimplifier.java
@@ -22,10 +22,6 @@ Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package processing.mode.java.preproc;
-import processing.app.Language;
-import processing.app.Platform;
-import processing.mode.java.SourceUtil;
-
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Matcher;
@@ -78,16 +74,8 @@ public class PreprocessIssueMessageSimplifier {
* @return The template's contents prior to rendering.
*/
public static String getLocalStr(String stringName) {
- String errStr;
- String retStr;
-
- if (Platform.isAvailable()) {
- errStr = Language.text("editor.status.error.syntax");
- retStr = Language.text(stringName);
- } else {
- errStr = DefaultErrorLocalStrSet.get().get("editor.status.error.syntax").orElse("Error");
- retStr = DefaultErrorLocalStrSet.get().get(stringName).orElse(stringName);
- }
+ var errStr = DefaultErrorLocalStrSet.get().get("editor.status.error.syntax").orElse("Error");
+ var retStr = DefaultErrorLocalStrSet.get().get(stringName).orElse(stringName);
return String.format(errStr, retStr);
}
diff --git a/java/src/processing/mode/java/preproc/PreprocessorResult.java b/java/src/processing/mode/java/preproc/PreprocessorResult.java
index 972abf1ac..575f4967a 100644
--- a/java/src/processing/mode/java/preproc/PreprocessorResult.java
+++ b/java/src/processing/mode/java/preproc/PreprocessorResult.java
@@ -25,9 +25,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import processing.mode.java.ImportStatement;
-import processing.mode.java.TextTransform;
-
/**
* Result of sketch Preprocessing.
diff --git a/java/src/processing/mode/java/preproc/RewriteResult.java b/java/src/processing/mode/java/preproc/RewriteResult.java
index 1a3c35a6a..6d50db4eb 100644
--- a/java/src/processing/mode/java/preproc/RewriteResult.java
+++ b/java/src/processing/mode/java/preproc/RewriteResult.java
@@ -2,8 +2,6 @@ package processing.mode.java.preproc;
import java.util.List;
-import processing.mode.java.TextTransform;
-
/**
* Data structure describing the result of preprocessor rewrite.
diff --git a/java/src/processing/mode/java/preproc/RewriteResultBuilder.java b/java/src/processing/mode/java/preproc/RewriteResultBuilder.java
index 807a06b3e..959c837b3 100644
--- a/java/src/processing/mode/java/preproc/RewriteResultBuilder.java
+++ b/java/src/processing/mode/java/preproc/RewriteResultBuilder.java
@@ -3,8 +3,6 @@ package processing.mode.java.preproc;
import java.util.ArrayList;
import java.util.List;
-import processing.mode.java.TextTransform;
-
/**
* Builder to help create a {RewriteResult}.
diff --git a/java/src/processing/mode/java/preproc/SketchException.java b/java/src/processing/mode/java/preproc/SketchException.java
new file mode 100644
index 000000000..47a0bba53
--- /dev/null
+++ b/java/src/processing/mode/java/preproc/SketchException.java
@@ -0,0 +1,162 @@
+/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
+
+/*
+ Part of the Processing project - http://processing.org
+
+ Copyright (c) 2004-08 Ben Fry and Casey Reas
+ Copyright (c) 2001-04 Massachusetts Institute of Technology
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+package processing.mode.java.preproc;
+
+
+/**
+ * An exception with a line number attached that occurs
+ * during either pre-processing, compile, or run time.
+ */
+public class SketchException extends Exception {
+ protected String message;
+ protected int codeIndex;
+ protected int codeLine;
+ protected int codeColumn;
+ protected boolean showStackTrace;
+
+
+ public SketchException(String message) {
+ this(message, true);
+ }
+
+
+ public SketchException(String message, boolean showStackTrace) {
+ this(message, -1, -1, -1, showStackTrace);
+ }
+
+
+ public SketchException(String message, int file, int line) {
+ this(message, file, line, -1, true);
+ }
+
+
+ public SketchException(String message, int file, int line, int column) {
+ this(message, file, line, column, true);
+ }
+
+
+ public SketchException(String message, int file, int line, int column,
+ boolean showStackTrace) {
+ this.message = message;
+ this.codeIndex = file;
+ this.codeLine = line;
+ this.codeColumn = column;
+ this.showStackTrace = showStackTrace;
+ }
+
+
+ /**
+ * Override getMessage() in Throwable, so that I can set
+ * the message text outside the constructor.
+ */
+ public String getMessage() {
+ return message;
+ }
+
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+
+ public int getCodeIndex() {
+ return codeIndex;
+ }
+
+
+ public void setCodeIndex(int index) {
+ codeIndex = index;
+ }
+
+
+ public boolean hasCodeIndex() {
+ return codeIndex != -1;
+ }
+
+
+ public int getCodeLine() {
+ return codeLine;
+ }
+
+
+ public void setCodeLine(int line) {
+ this.codeLine = line;
+ }
+
+
+ public boolean hasCodeLine() {
+ return codeLine != -1;
+ }
+
+
+ public void setCodeColumn(int column) {
+ this.codeColumn = column;
+ }
+
+
+ public int getCodeColumn() {
+ return codeColumn;
+ }
+
+
+ public void showStackTrace() {
+ showStackTrace = true;
+ }
+
+
+ public void hideStackTrace() {
+ showStackTrace = false;
+ }
+
+
+ public boolean isStackTraceEnabled() {
+ return showStackTrace;
+ }
+
+
+ /**
+ * Nix the java.lang crap out of an exception message
+ * because it scares the children.
+ *
+ * This function must be static to be used with super()
+ * in each of the constructors above.
+ */
+ /*
+ static public final String massage(String msg) {
+ if (msg.indexOf("java.lang.") == 0) {
+ //int dot = msg.lastIndexOf('.');
+ msg = msg.substring("java.lang.".length());
+ }
+ return msg;
+ //return (dot == -1) ? msg : msg.substring(dot+1);
+ }
+ */
+
+
+ public void printStackTrace() {
+ if (showStackTrace) {
+ super.printStackTrace();
+ }
+ }
+}
diff --git a/java/src/processing/mode/java/SourceUtil.java b/java/src/processing/mode/java/preproc/SourceUtil.java
similarity index 99%
rename from java/src/processing/mode/java/SourceUtil.java
rename to java/src/processing/mode/java/preproc/SourceUtil.java
index bd464b869..015529616 100644
--- a/java/src/processing/mode/java/SourceUtil.java
+++ b/java/src/processing/mode/java/preproc/SourceUtil.java
@@ -1,4 +1,4 @@
-package processing.mode.java;
+package processing.mode.java.preproc;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.CompilationUnit;
@@ -12,7 +12,7 @@ import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import processing.mode.java.TextTransform.Edit;
+import processing.mode.java.preproc.TextTransform.Edit;
public class SourceUtil {
diff --git a/java/src/processing/mode/java/TextTransform.java b/java/src/processing/mode/java/preproc/TextTransform.java
similarity index 98%
rename from java/src/processing/mode/java/TextTransform.java
rename to java/src/processing/mode/java/preproc/TextTransform.java
index 8861adbb4..77ae022f1 100644
--- a/java/src/processing/mode/java/TextTransform.java
+++ b/java/src/processing/mode/java/preproc/TextTransform.java
@@ -1,4 +1,4 @@
-package processing.mode.java;
+package processing.mode.java.preproc;
import java.util.ArrayList;
import java.util.Collection;
@@ -31,7 +31,7 @@ public class TextTransform {
private int builtForLength;
- TextTransform(CharSequence input) {
+ public TextTransform(CharSequence input) {
this.input = input;
}
@@ -213,7 +213,7 @@ public class TextTransform {
}
- protected interface OffsetMapper {
+ public interface OffsetMapper {
int getInputOffset(int outputOffset);
int getOutputOffset(int inputOffset);
OffsetMapper thenMapping(OffsetMapper mapper);
diff --git a/java/src/processing/mode/java/runner/Runner.java b/java/src/processing/mode/java/runner/Runner.java
index 9fec3bb10..15bf819fa 100644
--- a/java/src/processing/mode/java/runner/Runner.java
+++ b/java/src/processing/mode/java/runner/Runner.java
@@ -32,7 +32,6 @@ import processing.mode.java.JavaEditor;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
-import java.awt.Toolkit;
import java.io.*;
import java.net.ConnectException;
import java.net.InetAddress;
@@ -44,6 +43,7 @@ import com.sun.jdi.connect.*;
import com.sun.jdi.connect.Connector.Argument;
import com.sun.jdi.event.*;
import com.sun.jdi.request.*;
+import processing.mode.java.preproc.SketchException;
/**