diff options
-rw-r--r-- | bridge/src/main/java/org/aspectj/bridge/context/CompilationAndWeavingContext.java | 10 | ||||
-rw-r--r-- | org.aspectj.matcher/src/main/java/org/aspectj/weaver/BCException.java | 46 |
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(); - } - } |