aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Kriegisch <Alexander@Kriegisch.name>2023-01-18 09:17:43 +0100
committerAlexander Kriegisch <Alexander@Kriegisch.name>2024-04-12 15:32:39 +0200
commite8c2f57913042c6ceeeeac010e2c6658fcb3c147 (patch)
tree858d4247da96a0c398cc001a687ffc3859f9e331
parent7bd0a45144b8cd2fe57432e572d0c8339fecd61f (diff)
downloadaspectj-e8c2f57913042c6ceeeeac010e2c6658fcb3c147.tar.gz
aspectj-e8c2f57913042c6ceeeeac010e2c6658fcb3c147.zip
Further streamline BCException
- Improvement: Also add CompilationAndWeavingContext for constructor with causing exception - Remove home-brew stack trace printing, just call super constructors Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
-rw-r--r--bridge/src/main/java/org/aspectj/bridge/context/CompilationAndWeavingContext.java10
-rw-r--r--org.aspectj.matcher/src/main/java/org/aspectj/weaver/BCException.java46
2 files changed, 16 insertions, 40 deletions
diff --git a/bridge/src/main/java/org/aspectj/bridge/context/CompilationAndWeavingContext.java b/bridge/src/main/java/org/aspectj/bridge/context/CompilationAndWeavingContext.java
index 451c9cca7..c204c78a1 100644
--- a/bridge/src/main/java/org/aspectj/bridge/context/CompilationAndWeavingContext.java
+++ b/bridge/src/main/java/org/aspectj/bridge/context/CompilationAndWeavingContext.java
@@ -148,6 +148,16 @@ public class CompilationAndWeavingContext {
return sb.toString();
}
+ /**
+ * Returns a string description of what the compiler/weaver is currently doing
+ * @param prependNLIfNotEmpty Prepend a newline character to the message? This can be nice when printing the context
+ * as part of an exception stack trace.
+ */
+ public static String getCurrentContext(boolean prependNLIfNotEmpty) {
+ String context = getCurrentContext();
+ return context.isEmpty() ? context : (prependNLIfNotEmpty ? "\n" : "") + context;
+ }
+
public static ContextToken enteringPhase(int phaseId, Object data) {
Stack<ContextStackEntry> contextStack = getContextStack();
ContextTokenImpl nextToken = nextToken();
diff --git a/org.aspectj.matcher/src/main/java/org/aspectj/weaver/BCException.java b/org.aspectj.matcher/src/main/java/org/aspectj/weaver/BCException.java
index 44c7aa8fa..da887fff5 100644
--- a/org.aspectj.matcher/src/main/java/org/aspectj/weaver/BCException.java
+++ b/org.aspectj.matcher/src/main/java/org/aspectj/weaver/BCException.java
@@ -12,55 +12,21 @@
package org.aspectj.weaver;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-
import org.aspectj.bridge.context.CompilationAndWeavingContext;
/**
* Exception to use inside the bcweaver.
*/
-@SuppressWarnings("serial")
public class BCException extends RuntimeException {
- Throwable thrown;
-
public BCException() {
- super();
- }
+ super();
+ }
- public BCException(String s) {
- super(s + "\n" + CompilationAndWeavingContext.getCurrentContext());
+ public BCException(String message) {
+ super(message + CompilationAndWeavingContext.getCurrentContext(true));
}
- public BCException(String s, Throwable thrown) {
- this(s);
- this.thrown = thrown;
- }
-
- // TODO: Is it really necessary to re-invent stack trace printing here? Can these methods simply go away?
- // The only doubtful "benefit" is that the causing exception's stack trace is printed fully instead of shortened.
- // But OTOH, the JVM just omits the lines which were present in the original stack trace above already, so there is
- // really no extra information here.
-
- public void printStackTrace() {
- printStackTrace(System.err);
+ public BCException(String message, Throwable cause) {
+ super(message + CompilationAndWeavingContext.getCurrentContext(true), cause);
}
-
- public void printStackTrace(PrintStream s) {
- printStackTrace(new PrintWriter(s));
- }
-
- public void printStackTrace(PrintWriter s) {
- super.printStackTrace(s);
- if (null != thrown) {
- s.print("Caused by: ");
- thrown.printStackTrace(s);
- }
- // Flush PrintWriter in case the JVM exits before the stack trace was printed. Otherwise, when e.g. calling
- // UnresolvedType.signatureToName from a main method or a test directly and a BCException is thrown, nothing but
- // Exception in thread "main"
- // would be printed without flushing the PrintWriter, because the JVM exits immediately.
- s.flush();
- }
-
}