From 2b9e9dcee0a621d01ced97dd99b1bc9bce6a326f Mon Sep 17 00:00:00 2001 From: Matthew Olsson Date: Mon, 25 Dec 2023 13:58:03 -0800 Subject: [PATCH] Console: Print error causes if applicable Fixes #94 --- .../internal/console/ConsoleClientProcess.kt | 4 +- .../ctjs/internal/console/ConsoleFrame.kt | 63 ++++++++++--------- .../internal/console/ConsoleHostProcess.kt | 12 ++-- .../ctjs/internal/console/data.kt | 5 +- 4 files changed, 49 insertions(+), 35 deletions(-) diff --git a/src/main/kotlin/com/chattriggers/ctjs/internal/console/ConsoleClientProcess.kt b/src/main/kotlin/com/chattriggers/ctjs/internal/console/ConsoleClientProcess.kt index fc5feadc..85e1e255 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/internal/console/ConsoleClientProcess.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/internal/console/ConsoleClientProcess.kt @@ -107,8 +107,8 @@ class ConsoleClientProcess(private val port: Int, private val hostPid: Long) { frame?.println(message.text, message.logType, message.end, message.color?.let(::Color)) ?: error("Received PrintMessage before InitMessage") } - is PrintStackTraceMessage -> { - frame?.printStackTrace(message.message, message.trace) + is PrintErrorMessage -> { + frame?.printError(message.error) ?: error("Received PrintStackTraceMessage before InitMessage") } } diff --git a/src/main/kotlin/com/chattriggers/ctjs/internal/console/ConsoleFrame.kt b/src/main/kotlin/com/chattriggers/ctjs/internal/console/ConsoleFrame.kt index 44f852bb..293fcbf4 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/internal/console/ConsoleFrame.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/internal/console/ConsoleFrame.kt @@ -143,43 +143,50 @@ class ConsoleFrame( } } - fun printStackTrace(message: String, trace: List) { - invokeLater { - if (currentConfig.openConsoleOnError) - showConsole() - - val index = trace.indexOfFirst { + fun printError(error: PrintErrorMessage.Error) { + fun StringBuilder.appendError(err: PrintErrorMessage.Error) { + val index = err.trace.indexOfFirst { it.fileName?.lowercase()?.contains("jsloader") ?: false } - val trimmedTrace = trace.dropLast(trace.size - index - 1).map { - val fileNameIndex = it.fileName?.indexOf("ChatTriggers/modules/") ?: return@map it - val classNameIndex = it.className.indexOf("ChatTriggers_modules_") - - if (fileNameIndex != -1) { - StackTrace( - it.className.substring(classNameIndex + 21), - it.methodName, - it.fileName.substring(fileNameIndex + 21), - it.lineNumber - ) - } else it - } - - printErrorWithColor(message, trimmedTrace) - } - } + val trimmedTrace = if (index != -1) { + err.trace.dropLast(err.trace.size - index - 1).map { + val fileNameIndex = it.fileName?.indexOf("ChatTriggers/modules/") ?: return@map it + val classNameIndex = it.className.indexOf("ChatTriggers_modules_") + + if (fileNameIndex != -1) { + StackTrace( + it.className.substring(classNameIndex + 21), + it.methodName, + it.fileName.substring(fileNameIndex + 21), + it.lineNumber + ) + } else it + } + } else err.trace - private fun printErrorWithColor(message: String, traces: List) { - writer.println(buildString { - appendLine(message) - for (trace in traces) { + appendLine(err.message) + for (trace in trimmedTrace) { append("\tat ${trace.className}.${trace.methodName} (${trace.fileName}") if (trace.lineNumber != -1) append(":${trace.lineNumber}") appendLine(")") } - }, LogType.ERROR) + + if (err.cause != null) { + append("Caused by: ") + appendError(err.cause) + } + } + + invokeLater { + if (currentConfig.openConsoleOnError) + showConsole() + + writer.println(buildString { + appendError(error) + }, LogType.ERROR) + } } fun setConfig(config: ConfigUpdateMessage) { diff --git a/src/main/kotlin/com/chattriggers/ctjs/internal/console/ConsoleHostProcess.kt b/src/main/kotlin/com/chattriggers/ctjs/internal/console/ConsoleHostProcess.kt index 063fde53..b048e16b 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/internal/console/ConsoleHostProcess.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/internal/console/ConsoleHostProcess.kt @@ -142,10 +142,14 @@ object ConsoleHostProcess { } fun printStackTrace(error: Throwable) { - val trace = error.stackTrace.map { - StackTrace(it.fileName, it.className, it.methodName, it.lineNumber) - } - trySendMessage(PrintStackTraceMessage(error.message.orEmpty(), trace)) + fun makeError(err: Throwable): PrintErrorMessage.Error = PrintErrorMessage.Error( + error::class.qualifiedName?.let { "$it: " } + err.message.orEmpty(), + err.stackTrace.map { + StackTrace(it.fileName, it.className, it.methodName, it.lineNumber) + }, + err.cause?.let(::makeError), + ) + trySendMessage(PrintErrorMessage(makeError(error))) } fun show() = trySendMessage(OpenMessage) diff --git a/src/main/kotlin/com/chattriggers/ctjs/internal/console/data.kt b/src/main/kotlin/com/chattriggers/ctjs/internal/console/data.kt index f8bccccd..0fc54e59 100644 --- a/src/main/kotlin/com/chattriggers/ctjs/internal/console/data.kt +++ b/src/main/kotlin/com/chattriggers/ctjs/internal/console/data.kt @@ -59,7 +59,10 @@ class PrintMessage( ) : H2CMessage() @Serializable -class PrintStackTraceMessage(val message: String, val trace: List) : H2CMessage() +class PrintErrorMessage(val error: Error) : H2CMessage() { + @Serializable + data class Error(val message: String, val trace: List, val cause: Error?) +} @Serializable data class StackTrace(