From 09120015608fbabcd3ada7854e6a19cda63622de Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 16 Jun 2014 19:59:21 +0400 Subject: [PATCH] Fixed KT-5223 Converter from Java should convert "throws" in method declaration #KT-5223 Fixed --- j2k/src/org/jetbrains/jet/j2k/Converter.kt | 11 ++++++++++- .../j2k/test/JavaToKotlinConverterTestGenerated.java | 5 +++++ .../ast/function/extendsBaseWhichExtendsObject.kt | 4 ++++ j2k/tests/testData/ast/function/overrideObject.kt | 2 ++ j2k/tests/testData/ast/function/overrideObject2.kt | 1 + j2k/tests/testData/ast/function/throws.java | 2 ++ j2k/tests/testData/ast/function/throws.kt | 2 ++ j2k/tests/testData/ast/tryWithResource/Multiline.kt | 1 + .../testData/ast/tryWithResource/MultipleResources.kt | 1 + j2k/tests/testData/ast/tryWithResource/Simple.kt | 1 + j2k/tests/testData/ast/tryWithResource/WithFinally.kt | 1 + .../ast/tryWithResource/WithReturnInAnonymousClass.kt | 4 ++++ .../tryWithResource/WithReturnInAnonymousClass2.kt | 4 ++++ 13 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 j2k/tests/testData/ast/function/throws.java create mode 100644 j2k/tests/testData/ast/function/throws.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/Converter.kt b/j2k/src/org/jetbrains/jet/j2k/Converter.kt index b6e101e9fc6..77ffac60388 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/Converter.kt @@ -328,7 +328,7 @@ public class Converter private(val project: Project, val settings: ConverterSett private fun doConvertMethod(method: PsiMethod, membersToRemove: MutableSet): Function { val returnType = typeConverter.convertMethodReturnType(method) - val annotations = convertAnnotations(method) + val annotations = convertAnnotations(method) + convertThrows(method) val modifiers = convertModifiers(method) val comments = getComments(method) @@ -683,6 +683,15 @@ public class Converter private(val project: Project, val settings: ConverterSett } } + private fun convertThrows(method: PsiMethod): Annotations { + val types = method.getThrowsList().getReferencedTypes() + if (types.isEmpty()) return Annotations.Empty + return Annotations(listOf(Annotation(Identifier("throws"), + types.map { null to MethodCallExpression.buildNotNull(null, "javaClass", listOf(), listOf(typeConverter.convertType(it, Nullability.NotNull))) }, + false)), + true) + } + private val TYPE_MAP: Map = mapOf( JAVA_LANG_BYTE to "byte", JAVA_LANG_SHORT to "short", diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java index 520ad29f48b..efe6226c743 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -1305,6 +1305,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv doTest("j2k/tests/testData/ast/function/public.java"); } + @TestMetadata("throws.java") + public void testThrows() throws Exception { + doTest("j2k/tests/testData/ast/function/throws.java"); + } + @TestMetadata("varVararg.java") public void testVarVararg() throws Exception { doTest("j2k/tests/testData/ast/function/varVararg.java"); diff --git a/j2k/tests/testData/ast/function/extendsBaseWhichExtendsObject.kt b/j2k/tests/testData/ast/function/extendsBaseWhichExtendsObject.kt index d5089fa31bc..e7f0ebe62dc 100644 --- a/j2k/tests/testData/ast/function/extendsBaseWhichExtendsObject.kt +++ b/j2k/tests/testData/ast/function/extendsBaseWhichExtendsObject.kt @@ -9,6 +9,7 @@ class Test() : Base() { return super.equals(o) } + throws(javaClass()) override fun clone(): Any { return super.clone() } @@ -17,6 +18,7 @@ class Test() : Base() { return super.toString() } + throws(javaClass()) override fun finalize() { super.finalize() } @@ -31,6 +33,7 @@ class Base() { return super.equals(o) } + throws(javaClass()) protected fun clone(): Any { return super.clone() } @@ -39,6 +42,7 @@ class Base() { return super.toString() } + throws(javaClass()) protected fun finalize() { super.finalize() } diff --git a/j2k/tests/testData/ast/function/overrideObject.kt b/j2k/tests/testData/ast/function/overrideObject.kt index 8d8a5919c85..2bebbe28944 100644 --- a/j2k/tests/testData/ast/function/overrideObject.kt +++ b/j2k/tests/testData/ast/function/overrideObject.kt @@ -11,12 +11,14 @@ class X() { return super.toString() } + throws(javaClass()) protected fun clone(): Any { return super.clone() } } class Y() : Thread() { + throws(javaClass()) override fun clone(): Any { return super.clone() } diff --git a/j2k/tests/testData/ast/function/overrideObject2.kt b/j2k/tests/testData/ast/function/overrideObject2.kt index 38360355781..40f8b234ba3 100644 --- a/j2k/tests/testData/ast/function/overrideObject2.kt +++ b/j2k/tests/testData/ast/function/overrideObject2.kt @@ -13,6 +13,7 @@ class X() : Base() { return super.toString() } + throws(javaClass()) protected fun clone(): Any { return super.clone() } diff --git a/j2k/tests/testData/ast/function/throws.java b/j2k/tests/testData/ast/function/throws.java new file mode 100644 index 00000000000..74c4bfea6db --- /dev/null +++ b/j2k/tests/testData/ast/function/throws.java @@ -0,0 +1,2 @@ +//method +void foo() throws IOException, SerializationException; \ No newline at end of file diff --git a/j2k/tests/testData/ast/function/throws.kt b/j2k/tests/testData/ast/function/throws.kt new file mode 100644 index 00000000000..adc20745905 --- /dev/null +++ b/j2k/tests/testData/ast/function/throws.kt @@ -0,0 +1,2 @@ +throws(javaClass(), javaClass()) +fun foo() \ No newline at end of file diff --git a/j2k/tests/testData/ast/tryWithResource/Multiline.kt b/j2k/tests/testData/ast/tryWithResource/Multiline.kt index 4319e413066..2a9e653db33 100644 --- a/j2k/tests/testData/ast/tryWithResource/Multiline.kt +++ b/j2k/tests/testData/ast/tryWithResource/Multiline.kt @@ -1,6 +1,7 @@ import java.io.* public class C() { + throws(javaClass()) fun foo() { FileInputStream("foo").use { stream -> // reading something diff --git a/j2k/tests/testData/ast/tryWithResource/MultipleResources.kt b/j2k/tests/testData/ast/tryWithResource/MultipleResources.kt index 544c6137ecf..9e4868f4566 100644 --- a/j2k/tests/testData/ast/tryWithResource/MultipleResources.kt +++ b/j2k/tests/testData/ast/tryWithResource/MultipleResources.kt @@ -1,6 +1,7 @@ import java.io.* public class C() { + throws(javaClass()) fun foo() { FileInputStream("foo").use { input -> FileOutputStream("bar").use { output -> diff --git a/j2k/tests/testData/ast/tryWithResource/Simple.kt b/j2k/tests/testData/ast/tryWithResource/Simple.kt index 6d5d5cfacc2..40a727ec4c0 100644 --- a/j2k/tests/testData/ast/tryWithResource/Simple.kt +++ b/j2k/tests/testData/ast/tryWithResource/Simple.kt @@ -1,6 +1,7 @@ import java.io.* public class C() { + throws(javaClass()) fun foo() { FileInputStream("foo").use { stream -> System.out.println(stream.read()) } } diff --git a/j2k/tests/testData/ast/tryWithResource/WithFinally.kt b/j2k/tests/testData/ast/tryWithResource/WithFinally.kt index f127ac2ee0f..79df2e2cd39 100644 --- a/j2k/tests/testData/ast/tryWithResource/WithFinally.kt +++ b/j2k/tests/testData/ast/tryWithResource/WithFinally.kt @@ -1,6 +1,7 @@ import java.io.* public class C() { + throws(javaClass()) fun foo() { try { FileInputStream("foo").use { stream -> diff --git a/j2k/tests/testData/ast/tryWithResource/WithReturnInAnonymousClass.kt b/j2k/tests/testData/ast/tryWithResource/WithReturnInAnonymousClass.kt index 326bf6b2abf..304f88ac3af 100644 --- a/j2k/tests/testData/ast/tryWithResource/WithReturnInAnonymousClass.kt +++ b/j2k/tests/testData/ast/tryWithResource/WithReturnInAnonymousClass.kt @@ -1,13 +1,16 @@ import java.io.* trait I { + throws(javaClass()) public fun doIt(stream: InputStream): Int } public class C() { + throws(javaClass()) fun foo() { FileInputStream("foo").use { stream -> bar(object : I { + throws(javaClass()) override fun doIt(stream: InputStream): Int { return stream.available() } @@ -15,6 +18,7 @@ public class C() { } } + throws(javaClass()) fun bar(i: I, stream: InputStream): Int { return i.doIt(stream) } diff --git a/j2k/tests/testData/ast/tryWithResource/WithReturnInAnonymousClass2.kt b/j2k/tests/testData/ast/tryWithResource/WithReturnInAnonymousClass2.kt index cbaf5dfeb4c..0b06d409b5d 100644 --- a/j2k/tests/testData/ast/tryWithResource/WithReturnInAnonymousClass2.kt +++ b/j2k/tests/testData/ast/tryWithResource/WithReturnInAnonymousClass2.kt @@ -1,13 +1,16 @@ import java.io.* trait I { + throws(javaClass()) public fun doIt(stream: InputStream): Int } public class C() { + throws(javaClass()) fun foo(): Int { return FileInputStream("foo").use { stream -> bar(object : I { + throws(javaClass()) override fun doIt(stream: InputStream): Int { return stream.available() } @@ -15,6 +18,7 @@ public class C() { } } + throws(javaClass()) fun bar(i: I, stream: InputStream): Int { return i.doIt(stream) }