diff --git a/js/js.libraries/src/core/exceptions.kt b/js/js.libraries/src/core/exceptions.kt index c0dead984ff..50552885230 100644 --- a/js/js.libraries/src/core/exceptions.kt +++ b/js/js.libraries/src/core/exceptions.kt @@ -16,96 +16,117 @@ package kotlin -public open class Error : Throwable { +// NOTE: Do not author your exceptions as they are written in this file, instead use this template: +/* +public open class MyException : Exception { constructor() : super() constructor(message: String?) : super(message) - constructor(message: String?, cause: Throwable?): super(message, cause) + constructor(message: String?, cause: Throwable?) : super(message, cause) constructor(cause: Throwable?) : super(cause) } +*/ -public open class Exception : Throwable { - constructor() : super() - constructor(message: String?) : super(message) - constructor(message: String?, cause: Throwable?): super(message, cause) - constructor(cause: Throwable?) : super(cause) + +// TODO: remove workarounds for KT-22053 from direct Throwable inheritors +// TODO: remove primary constructors, make all secondary KT-22055 + +@Suppress("USELESS_ELVIS_RIGHT_IS_NULL") +public open class Error(message: String?, cause: Throwable?) : Throwable(message, cause ?: null) { + constructor() : this(null, null) { + Error::class.js.asDynamic().call(this, null, null) + } + + constructor(message: String?) : this(message, null) { + Error::class.js.asDynamic().call(this, message, null) + } + + constructor(cause: Throwable?) : this(undefined, cause) { + Error::class.js.asDynamic().call(this, undefined, cause) + } } -public open class RuntimeException : Exception { - constructor() : super() - constructor(message: String?) : super(message) - constructor(message: String?, cause: Throwable?): super(message, cause) - constructor(cause: Throwable?) : super(cause) +@Suppress("USELESS_ELVIS_RIGHT_IS_NULL") +public open class Exception(message: String?, cause: Throwable?) : Throwable(message, cause ?: null) { + constructor() : this(null, null) { + Exception::class.js.asDynamic().call(this, null, null) + } + + constructor(message: String?) : this(message, null) { + Exception::class.js.asDynamic().call(this, message, null) + } + + constructor(cause: Throwable?) : this(undefined, cause) { + Exception::class.js.asDynamic().call(this, undefined, cause) + } } -public open class IllegalArgumentException : RuntimeException { - constructor() : super() - constructor(message: String?) : super(message) - constructor(message: String?, cause: Throwable?): super(message, cause) - constructor(cause: Throwable?) : super(cause) +public open class RuntimeException(message: String?, cause: Throwable?) : Exception(message, cause) { + constructor() : this(null, null) + constructor(message: String?) : this(message, null) + constructor(cause: Throwable?) : this(undefined, cause) } -public open class IllegalStateException : RuntimeException { - constructor() : super() - constructor(message: String?) : super(message) - constructor(message: String?, cause: Throwable?): super(message, cause) - constructor(cause: Throwable?) : super(cause) +public open class IllegalArgumentException(message: String?, cause: Throwable?) : RuntimeException(message, cause) { + constructor() : this(null, null) + constructor(message: String?) : this(message, null) + constructor(cause: Throwable?) : this(undefined, cause) } -public open class IndexOutOfBoundsException : RuntimeException { - constructor() : super() - constructor(message: String?) : super(message) +public open class IllegalStateException(message: String?, cause: Throwable?) : RuntimeException(message, cause) { + constructor() : this(null, null) + constructor(message: String?) : this(message, null) + constructor(cause: Throwable?) : this(undefined, cause) } -public open class ConcurrentModificationException : RuntimeException { - constructor() : super() - constructor(message: String?) : super(message) - constructor(message: String?, cause: Throwable?): super(message, cause) - constructor(cause: Throwable?) : super(cause) +public open class IndexOutOfBoundsException(message: String?) : RuntimeException(message) { + constructor() : this(null) } -public open class UnsupportedOperationException : RuntimeException { - constructor() : super() - constructor(message: String?) : super(message) - constructor(message: String?, cause: Throwable?): super(message, cause) - constructor(cause: Throwable?) : super(cause) +public open class ConcurrentModificationException(message: String?, cause: Throwable?) : RuntimeException(message, cause) { + constructor() : this(null, null) + constructor(message: String?) : this(message, null) + constructor(cause: Throwable?) : this(undefined, cause) } -public open class NumberFormatException : IllegalArgumentException { - constructor() : super() - constructor(message: String?) : super(message) +public open class UnsupportedOperationException(message: String?, cause: Throwable?) : RuntimeException(message, cause) { + constructor() : this(null, null) + constructor(message: String?) : this(message, null) + constructor(cause: Throwable?) : this(undefined, cause) } -public open class NullPointerException : RuntimeException { - constructor() : super() - constructor(message: String?) : super(message) + +public open class NumberFormatException(message: String?) : IllegalArgumentException(message) { + constructor() : this(null) } -public open class ClassCastException : RuntimeException { - constructor() : super() - constructor(message: String?) : super(message) + +public open class NullPointerException(message: String?) : RuntimeException(message) { + constructor() : this(null) } -public open class AssertionError : Error { - constructor() : super() - constructor(message: String?) : super(message) - constructor(message: Any?) : super(message.toString(), message as? Throwable) +public open class ClassCastException(message: String?) : RuntimeException(message) { + constructor() : this(null) } -public open class NoSuchElementException : Exception { - constructor() : super() - constructor(message: String?) : super(message) +public open class AssertionError private constructor(message: String?, cause: Throwable?) : Error(message, cause) { + constructor() : this(null) + constructor(message: String?) : this(message, null) + constructor(message: Any?) : this(message.toString(), message as? Throwable) } -public open class NoWhenBranchMatchedException : RuntimeException { - constructor() : super() - constructor(message: String?) : super(message) - constructor(message: String?, cause: Throwable?): super(message, cause) - constructor(cause: Throwable?) : super(cause) +public open class NoSuchElementException(message: String?) : RuntimeException(message) { + constructor() : this(null) } -public open class UninitializedPropertyAccessException : RuntimeException { - constructor() : super() - constructor(message: String?) : super(message) - constructor(message: String?, cause: Throwable?): super(message, cause) - constructor(cause: Throwable?) : super(cause) + +public open class NoWhenBranchMatchedException(message: String?, cause: Throwable?) : RuntimeException(message, cause) { + constructor() : this(null, null) + constructor(message: String?) : this(message, null) + constructor(cause: Throwable?) : this(undefined, cause) +} + +public open class UninitializedPropertyAccessException(message: String?, cause: Throwable?) : RuntimeException(message, cause) { + constructor() : this(null, null) + constructor(message: String?) : this(message, null) + constructor(cause: Throwable?) : this(undefined, cause) } diff --git a/js/js.translator/testData/box/expression/try/exceptionToString.kt b/js/js.translator/testData/box/expression/try/exceptionToString.kt index 24f37d46f97..9baac51ab4a 100644 --- a/js/js.translator/testData/box/expression/try/exceptionToString.kt +++ b/js/js.translator/testData/box/expression/try/exceptionToString.kt @@ -3,6 +3,9 @@ package foo class MyException(m: String? = null): Exception(m) class MyException2(m: String? = null): Throwable(m) +// TODO: add direct inheritors of Throwable: +// - with secondary constructors +// - with cause only, in the primary constructor fun check(e: Throwable, expectedString: String) { try { @@ -16,8 +19,14 @@ fun check(e: Throwable, expectedString: String) { fun box(): String { check(Throwable(), "Throwable: null") check(Throwable("ccc"), "Throwable: ccc") + check(Throwable(Throwable("ddd")), "Throwable: Throwable: ddd") check(Exception(), "Exception: null") check(Exception("bbb"), "Exception: bbb") + check(Exception(Exception("ccc")), "Exception: Exception: ccc") + check(AssertionError(), "AssertionError: null") + check(AssertionError(null), "AssertionError: null") + check(AssertionError("bbb"), "AssertionError: bbb") + check(AssertionError(Exception("ccc")), "AssertionError: Exception: ccc") check(MyException(), "MyException: null") check(MyException("aaa"), "MyException: aaa") check(MyException2(), "MyException2: null")