From a45a463977dc2404598f4e2ea89c789cb7083af6 Mon Sep 17 00:00:00 2001 From: Starlight220 <53231611+Starlight220@users.noreply.github.com> Date: Thu, 4 Apr 2024 22:02:58 +0300 Subject: [PATCH] strip stack trace elements --- .../wpilibj2/command/CommandScheduler.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/CommandScheduler.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/CommandScheduler.java index b1d1e84f89b..1516384d974 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/CommandScheduler.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/CommandScheduler.java @@ -23,6 +23,7 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Iterator; @@ -637,18 +638,38 @@ public void requireNotComposed(Command... commands) { for (var command : commands) { var exception = m_composedCommands.getOrDefault(command, null); if (exception != null) { + exception.setStackTrace(stripFrameworkStackElements(exception.getStackTrace())); var buffer = new StringWriter(); var writer = new PrintWriter(buffer); writer.println( "Commands that have been composed may not be added to another composition or scheduled " + "individually!"); - writer.println(exception.getMessage()); exception.printStackTrace(writer); - throw new IllegalArgumentException(buffer.toString()); + var thrownException = new IllegalArgumentException(buffer.toString()); + thrownException.setStackTrace(stripFrameworkStackElements(thrownException.getStackTrace())); + throw thrownException; } } } + /** + * Strip all leading stack trace elements that are in the framework package. + * + * @param stacktrace the original stacktrace + * @return the stacktrace stripped of leading elements in the + * edu.wpi.first.wpilibj2.command package. + */ + private StackTraceElement[] stripFrameworkStackElements(StackTraceElement[] stacktrace) { + int i = 0; + for (; i < stacktrace.length; i++) { + if (stacktrace[0].getClassName().startsWith("edu.wpi.first.wpilibj2.command.")) { + continue; + } + break; + } + return Arrays.copyOfRange(stacktrace, i, stacktrace.length); + } + /** * Requires that the specified commands have not already been added to a composition. *