diff --git a/js/js.libraries/src/core/javalang.kt b/js/js.libraries/src/core/javalang.kt index 36468b475e7..96dc7f2ddfe 100644 --- a/js/js.libraries/src/core/javalang.kt +++ b/js/js.libraries/src/core/javalang.kt @@ -1,30 +1,28 @@ package java.lang -import java.io.IOException - -native("Error") -open public class Exception(message: String? = null): Throwable() {} +library +open public class Exception(message: String? = null): Throwable(message) {} library open public class RuntimeException(message: String? = null) : Exception(message) {} library -public class IllegalArgumentException(message: String? = null) : Exception() {} +public class IllegalArgumentException(message: String? = null) : RuntimeException(message) {} library -public class IllegalStateException(message: String? = null) : Exception() {} - -native("RangeError") -public class IndexOutOfBounds(message: String? = null) : Exception(message) {} - -native("RangeError") -public class IndexOutOfBoundsException(message: String? = null) : Exception(message) {} +public class IllegalStateException(message: String? = null) : RuntimeException(message) {} library -public class UnsupportedOperationException(message: String? = null) : Exception() {} +public class IndexOutOfBoundsException(message: String? = null) : RuntimeException(message) {} library -public class NumberFormatException(message: String? = null) : Exception() {} +public class UnsupportedOperationException(message: String? = null) : RuntimeException(message) {} + +library +public class NumberFormatException(message: String? = null) : RuntimeException(message) {} + +library +public class NullPointerException(message: String? = null) : RuntimeException(message) {} library public trait Runnable { diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/TryCatchTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/TryCatchTest.java index 6f0ba411bbb..d7c8b3605b6 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/TryCatchTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/TryCatchTest.java @@ -34,6 +34,10 @@ public class TryCatchTest extends AbstractExpressionTest { checkFooBoxIsOk(); } + public void testTryCatchExpressionWithMessage() throws Exception { + checkFooBoxIsOk(); + } + public void testMultipleCatchBlocks() throws Exception { checkFooBoxIsOk(); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/CompositeFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/CompositeFIF.java index c42569e29af..a3f06e8c7bb 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/CompositeFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/CompositeFIF.java @@ -34,6 +34,7 @@ import java.util.List; public abstract class CompositeFIF implements FunctionIntrinsicFactory { @NotNull public static final FunctionIntrinsic LENGTH_PROPERTY_INTRINSIC = new BuiltInPropertyIntrinsic("length"); + public static final FunctionIntrinsic MESSAGE_PROPERTY_INTRINSIC = new BuiltInPropertyIntrinsic("message"); public static final FunctionIntrinsic IS_EMPTY_INTRINSIC = new FunctionIntrinsic() { @NotNull @Override diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java index f81d793b396..417d95a131e 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java @@ -167,6 +167,8 @@ public final class TopLevelFIF extends CompositeFIF { add(pattern("kotlin.js", "Json", "get"), ArrayFIF.GET_INTRINSIC); add(pattern("kotlin.js", "Json", "set"), ArrayFIF.SET_INTRINSIC); + + add(pattern("kotlin", "Throwable", "getMessage"), MESSAGE_PROPERTY_INTRINSIC); } private abstract static class NativeMapGetSet extends CallParametersAwareFunctionIntrinsic { diff --git a/js/js.translator/testData/expression/try/cases/tryCatchExpressionWithMessage.kt b/js/js.translator/testData/expression/try/cases/tryCatchExpressionWithMessage.kt new file mode 100644 index 00000000000..913994035c5 --- /dev/null +++ b/js/js.translator/testData/expression/try/cases/tryCatchExpressionWithMessage.kt @@ -0,0 +1,57 @@ +package foo + +fun box(): String { + + var s: String = "" + + try { + throw Exception("Exception") + } catch (e: Throwable) { + s = "Throwable:" + e.getMessage()!! + } + assertEquals("Throwable:Exception", s) + + s = "" + try { + throw Exception("Exception") + } catch (e: Exception) { + s = "Exception:" + e.getMessage()!! + } + assertEquals("Exception:Exception", s) + + s = "" + try { + throw RuntimeException("RuntimeException") + } catch (e: Exception) { + s = "Exception:" + e.getMessage()!! + } + assertEquals("Exception:RuntimeException", s) + + s = "" + try { + throw NullPointerException("NullPointerException") + } catch (e: Exception) { + s = "Exception:" + e.getMessage()!! + } + assertEquals("Exception:NullPointerException", s) + + s = "" + try { + throw IndexOutOfBoundsException("IndexOutOfBoundsException") + } catch (e: NullPointerException) { + s = "NullPointerException:" + e.getMessage()!! + } catch (e: RuntimeException) { + s = "RuntimeException:" + e.getMessage()!! + } catch (e: Exception) { + s = "Exception:" + e.getMessage()!! + } + assertEquals("RuntimeException:IndexOutOfBoundsException", s) + + try { + throw RuntimeException() + } catch (e: Exception) { + assertEquals(null, e.getMessage()) + } + + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/kotlin_lib.js b/js/js.translator/testData/kotlin_lib.js index 6c4dd22c47f..040e45a9a40 100644 --- a/js/js.translator/testData/kotlin_lib.js +++ b/js/js.translator/testData/kotlin_lib.js @@ -164,16 +164,28 @@ return new Kotlin.Progression(from, to, -1); }; - Kotlin.RuntimeException = Kotlin.createClassNow(); - Kotlin.NullPointerException = Kotlin.createClassNow(); - Kotlin.NoSuchElementException = Kotlin.createClassNow(); - Kotlin.IllegalArgumentException = Kotlin.createClassNow(); - Kotlin.IllegalStateException = Kotlin.createClassNow(); - Kotlin.UnsupportedOperationException = Kotlin.createClassNow(); - Kotlin.IOException = Kotlin.createClassNow(); + Kotlin.Exception = Error; - Kotlin.throwNPE = function () { - throw new Kotlin.NullPointerException(); + function createClassNowWithMessage(base) { + return Kotlin.createClassNow(base, + /** @constructs */ + function (message) { + this.message = (message !== undefined) ? message : null; + } + ); + } + + Kotlin.RuntimeException = createClassNowWithMessage(Kotlin.Exception); + Kotlin.NullPointerException = createClassNowWithMessage(Kotlin.RuntimeException); + Kotlin.NoSuchElementException = createClassNowWithMessage(Kotlin.RuntimeException); + Kotlin.IllegalArgumentException = createClassNowWithMessage(Kotlin.RuntimeException); + Kotlin.IllegalStateException = createClassNowWithMessage(Kotlin.RuntimeException); + Kotlin.UnsupportedOperationException = createClassNowWithMessage(Kotlin.RuntimeException); + Kotlin.IndexOutOfBoundsException = createClassNowWithMessage(Kotlin.RuntimeException); + Kotlin.IOException = createClassNowWithMessage(Kotlin.Exception); + + Kotlin.throwNPE = function (message) { + throw new Kotlin.NullPointerException(message); }; function throwAbstractFunctionInvocationError(funName) { @@ -468,7 +480,7 @@ }, checkRange: function (index) { if (index < 0 || index >= this.array.length) { - throw new RangeError(); + throw new Kotlin.IndexOutOfBoundsException(); } } });