Skip to content

Improve loggin when debugging the PDE #961

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions app/src/processing/app/Base.java
Original file line number Diff line number Diff line change
Expand Up @@ -563,14 +563,12 @@ public Base(String[] args) throws Exception {
cl.downloadAvailableList(this, new ContribProgress(null));
long t9 = System.currentTimeMillis();

if (DEBUG) {
System.out.println("core modes: " + (t2b-t2) +
", contrib modes: " + (t2c-t2b) +
", contrib ex: " + (t2c-t2b));
System.out.println("base took " + (t2-t1) + " " + (t3-t2) + " " + (t4-t3) +
Messages.log("core modes: " + (t2b-t2) +
", contrib modes: " + (t2c-t2b) +
", contrib ex: " + (t2c-t2b));
Messages.log("base took " + (t2-t1) + " " + (t3-t2) + " " + (t4-t3) +
" " + (t5-t4) + " t6-t5=" + (t6-t5) + " " + (t7-t6) +
" handleNew=" + (t8-t7) + " " + (t9-t8) + " ms");
}
}


Expand Down
24 changes: 13 additions & 11 deletions app/src/processing/app/Library.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package processing.app;

import java.awt.EventQueue;
import java.io.*;
import java.util.*;
import java.util.zip.ZipFile;
Expand Down Expand Up @@ -330,6 +329,7 @@ static String[] listPlatformEntries(File libraryFolder, String folderName, Strin
* imports to specific libraries.
* @param importToLibraryTable mapping from package names to Library objects
*/
static boolean instructed = false;
// public void addPackageList(HashMap<String,Library> importToLibraryTable) {
public void addPackageList(Map<String, List<Library>> importToLibraryTable) {
// PApplet.println(packages);
Expand All @@ -342,18 +342,20 @@ public void addPackageList(Map<String, List<Library>> importToLibraryTable) {
libraries = new ArrayList<>();
importToLibraryTable.put(pkg, libraries);
} else {
if (Base.DEBUG) {
System.err.println("The library found in");
System.err.println(getPath());
System.err.println("conflicts with");
if(!instructed) {
instructed = true;
Messages.err("The library found in");
Messages.err(getPath());
Messages.err("conflicts with");
for (Library library : libraries) {
System.err.println(library.getPath());
Messages.err(library.getPath());
}
System.err.println("which already define(s) the package " + pkg);
System.err.println("If you have a line in your sketch that reads");
System.err.println("import " + pkg + ".*;");
System.err.println("Then you'll need to first remove one of those libraries.");
System.err.println();
Messages.err("which already define(s) the package " + pkg);
Messages.err("If you have a line in your sketch that reads");
Messages.err("import " + pkg + ".*;");
Messages.err("Then you'll need to first remove one of those libraries.");
}else{
Messages.err("\tPackage ("+pkg+")\t conflict found in [" + name + "] with libraries: " + libraries.stream().map(Library::getName).reduce((a, b) -> a + ", " + b).orElse(""));
}
}
libraries.add(this);
Expand Down
282 changes: 282 additions & 0 deletions app/src/processing/app/Messages.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,282 @@
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /*
Part of the Processing project - http://processing.org

Copyright (c) 2015 The Processing Foundation

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 2, as published by the Free Software Foundation.

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.app

import processing.app.ui.Toolkit
import java.awt.EventQueue
import java.awt.Frame
import java.io.PrintWriter
import java.io.StringWriter
import javax.swing.JFrame
import javax.swing.JOptionPane

class Messages {
companion object {
/**
* "No cookie for you" type messages. Nothing fatal or all that
* much of a bummer, but something to notify the user about.
*/
@JvmStatic
fun showMessage(title: String = "Message", message: String) {
if (Base.isCommandLine()) {
println("$title: $message")
} else {
JOptionPane.showMessageDialog(
Frame(), message, title,
JOptionPane.INFORMATION_MESSAGE
)
}
}


/**
* Non-fatal error message with optional stack trace side dish.
*/
/**
* Non-fatal error message.
*/
@JvmStatic
@JvmOverloads
fun showWarning(title: String = "Warning", message: String, e: Throwable? = null) {
if (Base.isCommandLine()) {
println("$title: $message")
} else {
JOptionPane.showMessageDialog(
Frame(), message, title,
JOptionPane.WARNING_MESSAGE
)
}
e?.printStackTrace()
}

/**
* Non-fatal error message with two levels of formatting.
* Unlike the others, this is non-blocking and will run later on the EDT.
*/
@JvmStatic
fun showWarningTiered(
title: String,
primary: String, secondary: String,
e: Throwable?
) {
if (Base.isCommandLine()) {
// TODO All these messages need to be handled differently for
// proper parsing on the command line. Many have \n in them.
println("$title: $primary\n$secondary")
} else {
EventQueue.invokeLater {
JOptionPane.showMessageDialog(
JFrame(),
Toolkit.formatMessage(primary, secondary),
title, JOptionPane.WARNING_MESSAGE
)
}
}
e?.printStackTrace()
}


/**
* Show an error message that's actually fatal to the program.
* This is an error that can't be recovered. Use showWarning()
* for errors that allow P5 to continue running.
*/
@JvmStatic
fun showError(title: String = "Error", message: String, e: Throwable?) {
if (Base.isCommandLine()) {
System.err.println("$title: $message")
} else {
JOptionPane.showMessageDialog(
Frame(), message, title,
JOptionPane.ERROR_MESSAGE
)
}
e?.printStackTrace()
System.exit(1)
}


/**
* Warning window that includes the stack trace.
*/
@JvmStatic
fun showTrace(
title: String?,
message: String,
t: Throwable?,
fatal: Boolean
) {
val title = title ?: if (fatal) "Error" else "Warning"

if (Base.isCommandLine()) {
System.err.println("$title: $message")
t?.printStackTrace()
} else {
val sw = StringWriter()
t!!.printStackTrace(PrintWriter(sw))

JOptionPane.showMessageDialog(
Frame(), // first <br/> clears to the next line
// second <br/> is a shorter height blank space before the trace
Toolkit.formatMessage("$message<br/><tt><br/>$sw</tt>"),
title,
if (fatal) JOptionPane.ERROR_MESSAGE else JOptionPane.WARNING_MESSAGE
)

if (fatal) {
System.exit(1)
}
}
}

@JvmStatic
fun showYesNoQuestion(
editor: Frame?, title: String?,
primary: String?, secondary: String?
): Int {
if (!Platform.isMacOS()) {
return JOptionPane.showConfirmDialog(
editor,
Toolkit.formatMessage(primary, secondary), //"<html><body>" +
//"<b>" + primary + "</b>" +
//"<br>" + secondary,
title,
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE
)
} else {
val result = showCustomQuestion(
editor, title, primary, secondary,
0, "Yes", "No"
)
return if (result == 0) {
JOptionPane.YES_OPTION
} else if (result == 1) {
JOptionPane.NO_OPTION
} else {
JOptionPane.CLOSED_OPTION
}
}
}


/**
* @param highlight A valid array index for options[] that specifies the
* default (i.e. safe) choice.
* @return The (zero-based) index of the selected value, -1 otherwise.
*/
@JvmStatic
fun showCustomQuestion(
editor: Frame?, title: String?,
primary: String?, secondary: String?,
highlight: Int, vararg options: String
): Int {
val result: Any
if (!Platform.isMacOS()) {
return JOptionPane.showOptionDialog(
editor,
Toolkit.formatMessage(primary, secondary), title,
JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null,
options, options[highlight]
)
} else {
val pane =
JOptionPane(
Toolkit.formatMessage(primary, secondary),
JOptionPane.QUESTION_MESSAGE
)

pane.options = options

// highlight the safest option ala apple hig
pane.initialValue = options[highlight]

val dialog = pane.createDialog(editor, null)
dialog.isVisible = true

result = pane.value
}
for (i in options.indices) {
if (result != null && result == options[i]) return i
}
return -1
}


// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
@JvmStatic
@Deprecated("Use log() instead")
fun log(from: Any, message: String) {
if (Base.DEBUG) {
val callingClass = Throwable()
.stackTrace[2]
.className
.formatClassName()
println("$callingClass: $message")
}
}

@JvmStatic
fun log(message: String?) {
if (Base.DEBUG) {
val callingClass = Throwable()
.stackTrace[2]
.className
.formatClassName()
println("$callingClass$message")
}
}

@JvmStatic
fun logf(message: String?, vararg args: Any?) {
if (Base.DEBUG) {
val callingClass = Throwable()
.stackTrace[2]
.className
.formatClassName()
System.out.printf("$callingClass$message", *args)
}
}

@JvmStatic
@JvmOverloads
fun err(message: String?, e: Throwable? = null) {
if (Base.DEBUG) {
if (message != null) {
val callingClass = Throwable()
.stackTrace[4]
.className
.formatClassName()
System.err.println("$callingClass$message")
}
e?.printStackTrace()
}
}
}
}

// Helper functions to give the base classes a color
fun String.formatClassName() = this
.replace("processing.", "")
.replace(".", "/")
.padEnd(40)
.colorizePathParts()
fun String.colorizePathParts() = split("/").joinToString("/") { part ->
"\u001B[${31 + (part.hashCode() and 0x7).rem(6)}m$part\u001B[0m"
}
4 changes: 2 additions & 2 deletions app/src/processing/app/exec/StreamPump.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import processing.app.Base;
import processing.app.Messages;


/**
Expand Down Expand Up @@ -79,8 +80,7 @@ public void run() {
}
} catch (final IOException e) {
if (Base.DEBUG) {
System.err.println("StreamPump: " + name);
e.printStackTrace(System.err);
Messages.err("StreamPump: " + name, e);
// removing for 0190, but need a better way to handle these
throw new RuntimeException("Inside " + this + " for " + name, e);
}
Expand Down
8 changes: 2 additions & 6 deletions app/src/processing/app/syntax/im/InputMethodSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,7 @@ public void setCallback(Callback callback) {

@Override
public Rectangle getTextLocation(TextHitInfo offset) {
if (Base.DEBUG) {
Messages.log("#Called getTextLocation:" + offset);
}
Messages.log("#Called getTextLocation:" + offset);
int line = textArea.getCaretLine();
int offsetX = textArea.getCaretPosition() - textArea.getLineStartOffset(line);
// '+1' mean textArea.lineToY(line) + textArea.getPainter().getFontMetrics().getHeight().
Expand Down Expand Up @@ -238,9 +236,7 @@ private TextLayout getTextLayout(AttributedCharacterIterator text, int committed
RenderingHints.VALUE_TEXT_ANTIALIAS_ON :
RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
FontRenderContext frc = g2d.getFontRenderContext();
if (Base.DEBUG) {
Messages.log("debug: FontRenderContext is Antialiased = " + frc.getAntiAliasingHint());
}
Messages.log("debug: FontRenderContext is Antialiased = " + frc.getAntiAliasingHint());

return new TextLayout(composedTextString.getIterator(), frc);
}
Expand Down
4 changes: 3 additions & 1 deletion app/src/processing/app/ui/EditorConsole.java
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,9 @@ public void message(String what, boolean err) {
// components, causing deadlock. Updates are buffered to the console and
// displayed at regular intervals on Swing's event-dispatching thread.
// (patch by David Mellis)
consoleDoc.appendString(what, err ? errStyle : stdStyle);
// Remove ANSI escape codes from the text before adding it to the console
String clean = what.replaceAll("\u001B\\[[0-9;]*m", "");
consoleDoc.appendString(clean, err ? errStyle : stdStyle);
}
}

Expand Down
Loading
Loading