diff --git a/api/src/main/kotlin/io/smnp/error/EnvironmentException.kt b/api/src/main/kotlin/io/smnp/error/EnvironmentException.kt index b868c9d..d631f78 100644 --- a/api/src/main/kotlin/io/smnp/error/EnvironmentException.kt +++ b/api/src/main/kotlin/io/smnp/error/EnvironmentException.kt @@ -3,6 +3,5 @@ package io.smnp.error import io.smnp.environment.Environment class EnvironmentException(exception: SmnpException, val environment: Environment) : SmnpException( - exception.friendlyName, - "${exception.message}\n\nStack trace:\n${environment.stackTrace()}" + exception.friendlyName, exception.message, exception ) \ No newline at end of file diff --git a/api/src/main/kotlin/io/smnp/error/SmnpException.kt b/api/src/main/kotlin/io/smnp/error/SmnpException.kt index 5556203..47e40c9 100644 --- a/api/src/main/kotlin/io/smnp/error/SmnpException.kt +++ b/api/src/main/kotlin/io/smnp/error/SmnpException.kt @@ -1,3 +1,12 @@ package io.smnp.error -abstract class SmnpException(val friendlyName: String, message: String? = null) : Exception(message) \ No newline at end of file +abstract class SmnpException(val friendlyName: String, message: String? = null, val exception: SmnpException? = null) : Exception(message) { + val exceptionChain: List + get() { + if(exception == null) { + return emptyList() + } + + return listOf(this, *exception.exceptionChain.toTypedArray()) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/io/smnp/SMNP.kt b/app/src/main/kotlin/io/smnp/SMNP.kt index 9719ba9..5e63ac9 100644 --- a/app/src/main/kotlin/io/smnp/SMNP.kt +++ b/app/src/main/kotlin/io/smnp/SMNP.kt @@ -5,6 +5,8 @@ import com.xenomachina.argparser.mainBody import io.smnp.cli.model.entity.Arguments import io.smnp.cli.model.enumeration.ModulesPrintMode import io.smnp.environment.DefaultEnvironment +import io.smnp.error.EnvironmentException +import io.smnp.error.PositionException import io.smnp.error.SmnpException import io.smnp.ext.DefaultModuleRegistry import io.smnp.interpreter.DefaultInterpreter @@ -41,8 +43,13 @@ fun main(args: Array): Unit = mainBody { DefaultModuleRegistry.registeredModules().forEach { println(it) } } } catch (e: SmnpException) { - System.err.println(e.friendlyName) + val position = e.exceptionChain.mapNotNull { it as? PositionException }.lastOrNull()?.position ?: "" + val stacktrace = e.exceptionChain.mapNotNull { it as? EnvironmentException }.lastOrNull()?.let { + "\nStack trace:\n${it.environment.stackTrace()}" + } ?: "" + System.err.println(e.friendlyName + " " + position) System.err.println(e.message) + System.err.println(stacktrace) exitProcess(1) } } diff --git a/app/src/main/kotlin/io/smnp/error/PositionException.kt b/app/src/main/kotlin/io/smnp/error/PositionException.kt index 0dee42f..6ce3da4 100644 --- a/app/src/main/kotlin/io/smnp/error/PositionException.kt +++ b/app/src/main/kotlin/io/smnp/error/PositionException.kt @@ -3,6 +3,5 @@ package io.smnp.error import io.smnp.dsl.token.model.entity.TokenPosition class PositionException(exception: SmnpException, val position: TokenPosition) : SmnpException( - "${exception.friendlyName} $position", - exception.message + exception.friendlyName, exception.message, exception ) \ No newline at end of file diff --git a/app/src/main/kotlin/io/smnp/interpreter/DefaultInterpreter.kt b/app/src/main/kotlin/io/smnp/interpreter/DefaultInterpreter.kt index 57c41d2..ee8db23 100644 --- a/app/src/main/kotlin/io/smnp/interpreter/DefaultInterpreter.kt +++ b/app/src/main/kotlin/io/smnp/interpreter/DefaultInterpreter.kt @@ -24,7 +24,13 @@ class DefaultInterpreter : Interpreter { return run(lines, environment, printTokens, printAst, dryRun) } - private fun run(lines: List, environment: Environment, printTokens: Boolean, printAst: Boolean, dryRun: Boolean): Environment { + private fun run( + lines: List, + environment: Environment, + printTokens: Boolean, + printAst: Boolean, + dryRun: Boolean + ): Environment { environment.loadModule("smnp.lang") val tokens = tokenizer.tokenize(lines) @@ -44,7 +50,13 @@ class DefaultInterpreter : Interpreter { return environment } - fun run(file: File, environment: Environment = DefaultEnvironment(), printTokens: Boolean = false, printAst: Boolean = false, dryRun: Boolean = false): Environment { + fun run( + file: File, + environment: Environment = DefaultEnvironment(), + printTokens: Boolean = false, + printAst: Boolean = false, + dryRun: Boolean = false + ): Environment { val lines = file.readLines() return run(lines, environment, printTokens, printAst, dryRun) }