Repository: groovy Updated Branches: refs/heads/master f30741f51 -> 49c0d8c5b
Add `groovy.log.classgen.stacktrace.max.depth` option to control max depth of stacktrace(default value is 0). For example: ``` // org.codehaus.groovy.classgen.AsmClassGenerator#onLineNumber:2215 // org.codehaus.groovy.classgen.asm.StatementWriter#writeReturn:593 // org.codehaus.groovy.classgen.AsmClassGenerator#visitReturnStatement:677 LINENUMBER 13 L1 ``` Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/49c0d8c5 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/49c0d8c5 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/49c0d8c5 Branch: refs/heads/master Commit: 49c0d8c5b602018cb29f038c91a4ac227f81a581 Parents: f30741f Author: sunlan <sun...@apache.org> Authored: Thu Mar 8 09:01:27 2018 +0800 Committer: sunlan <sun...@apache.org> Committed: Thu Mar 8 09:01:27 2018 +0800 ---------------------------------------------------------------------- .../classgen/asm/util/LoggableTextifier.java | 30 +++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/49c0d8c5/src/main/java/org/codehaus/groovy/classgen/asm/util/LoggableTextifier.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/util/LoggableTextifier.java b/src/main/java/org/codehaus/groovy/classgen/asm/util/LoggableTextifier.java index fe1d39e..46d22f4 100644 --- a/src/main/java/org/codehaus/groovy/classgen/asm/util/LoggableTextifier.java +++ b/src/main/java/org/codehaus/groovy/classgen/asm/util/LoggableTextifier.java @@ -19,7 +19,6 @@ package org.codehaus.groovy.classgen.asm.util; import org.codehaus.groovy.control.CompilerConfiguration; -import org.codehaus.groovy.runtime.StringGroovyMethods; import org.objectweb.asm.Attribute; import org.objectweb.asm.Handle; import org.objectweb.asm.Label; @@ -36,8 +35,10 @@ import java.util.List; * @since 2.5.0 */ public class LoggableTextifier extends Textifier { + private static final String GROOVY_LOG_CLASSGEN_STACKTRACE_MAX_DEPTH = "groovy.log.classgen.stacktrace.max.depth"; private static final String GROOVY = ".groovy."; private static final String LOGGABLE_TEXTIFIER = ".LoggableTextifier"; + private static final int STACKTRACE_MAX_DEPTH = Integer.getInteger(GROOVY_LOG_CLASSGEN_STACKTRACE_MAX_DEPTH, 0); private int loggedLineCnt = 0; public LoggableTextifier() { @@ -64,9 +65,9 @@ public class LoggableTextifier extends Textifier { } if (bcList.size() > 0) { - String invocationPositionInfo = getInvocationPositionInfo(); - if (!StringGroovyMethods.isBlank(invocationPositionInfo)) { - System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// " + invocationPositionInfo); + List<StackTraceElement> invocationPositionInfo = getInvocationPositionInfo(); + if (invocationPositionInfo.size() > 0) { + System.out.print(formatInvocationPositionInfo(invocationPositionInfo)); } for (Object bc : bcList) { @@ -77,17 +78,32 @@ public class LoggableTextifier extends Textifier { loggedLineCnt = textSize; } - private String getInvocationPositionInfo() { + private List<StackTraceElement> getInvocationPositionInfo() { StackTraceElement[] stackTraceElements = new Throwable().getStackTrace(); + List<StackTraceElement> stackTraceElementList = new LinkedList<>(); for (StackTraceElement stackTraceElement : stackTraceElements) { String className = stackTraceElement.getClassName(); if (className.contains(GROOVY) && !className.endsWith(LOGGABLE_TEXTIFIER)) { - return String.format("%s#%s:%s", className, stackTraceElement.getMethodName(), stackTraceElement.getLineNumber()); + if (stackTraceElementList.size() >= STACKTRACE_MAX_DEPTH) { + break; + } + + stackTraceElementList.add(stackTraceElement); } } - return ""; + return stackTraceElementList; + } + + private String formatInvocationPositionInfo(List<StackTraceElement> stackTraceElementList) { + StringBuilder sb = new StringBuilder(128); + for (StackTraceElement stackTraceElement : stackTraceElementList) { + sb.append("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// "); + sb.append(String.format("%s#%s:%s%n", stackTraceElement.getClassName(), stackTraceElement.getMethodName(), stackTraceElement.getLineNumber())); + } + + return sb.toString(); }