From 1a630773cf45c77443e1b25abd6ad8d34c98de94 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 6 Feb 2019 11:43:36 +0300 Subject: [PATCH] Fix parent and containingFile for throws-reference list Otherwise, exception is thrown during type inference because default implementations effectively return null ^KT-29287 Fixed --- .../jetbrains/kotlin/asJava/classes/ultraLightMethod.kt | 6 +++++- .../javaAgainstKotlin/ThrowsOnGenericMethod.java | 8 ++++++++ .../javaAgainstKotlin/ThrowsOnGenericMethod.kt | 9 +++++++++ .../javaAgainstKotlin/ThrowsOnGenericMethod.txt | 1 + .../JavaAgainstKotlinBinariesCheckerTestGenerated.java | 5 +++++ .../JavaAgainstKotlinSourceCheckerTestGenerated.java | 5 +++++ ...stKotlinSourceCheckerWithUltraLightTestGenerated.java | 5 +++++ 7 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.java create mode 100644 idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.kt create mode 100644 idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.txt diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethod.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethod.kt index d304e5c1ece..dc39a985b96 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethod.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethod.kt @@ -56,7 +56,11 @@ internal abstract class KtUltraLightMethod( abstract override fun buildTypeParameterList(): PsiTypeParameterList private val _throwsList: PsiReferenceList by lazyPub { - val list = KotlinLightReferenceListBuilder(manager, language, PsiReferenceList.Role.THROWS_LIST) + val list = + object : KotlinLightReferenceListBuilder(manager, language, PsiReferenceList.Role.THROWS_LIST) { + override fun getParent() = this@KtUltraLightMethod + override fun getContainingFile() = this@KtUltraLightMethod.containingFile + } computeDescriptor()?.let { for (ex in FunctionCodegen.getThrownExceptions(it)) { val psiClassType = ex.defaultType.asPsiType(support, TypeMappingMode.DEFAULT, list) as? PsiClassType ?: continue diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.java b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.java new file mode 100644 index 00000000000..bb99dbc04af --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.java @@ -0,0 +1,8 @@ +package test; +import foo.A; + +public class ThrowsOnGenericMethod { + public static void main(String[] args) { + new A().foo(""); + } +} diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.kt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.kt new file mode 100644 index 00000000000..3dcc2351f58 --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.kt @@ -0,0 +1,9 @@ +package foo; +import java.io.IOException + +class A { + @Throws(IOException::class) + fun foo(y: E) {} +} + +// ALLOW_AST_ACCESS diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.txt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.txt new file mode 100644 index 00000000000..e0b1a6e6745 --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.txt @@ -0,0 +1 @@ +// WITH_RUNTIME diff --git a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java index 1d3621f5363..f0c02892fc8 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java @@ -139,6 +139,11 @@ public class JavaAgainstKotlinBinariesCheckerTestGenerated extends AbstractJavaA runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ReturnInnerClasses.kt"); } + @TestMetadata("ThrowsOnGenericMethod.kt") + public void testThrowsOnGenericMethod() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.kt"); + } + @TestMetadata("TopLevelFunctionInDataFlowInspection.kt") public void testTopLevelFunctionInDataFlowInspection() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/TopLevelFunctionInDataFlowInspection.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java index 21176793271..d2b15d3077a 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java @@ -141,6 +141,11 @@ public class JavaAgainstKotlinSourceCheckerTestGenerated extends AbstractJavaAga runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ReturnInnerClasses.kt"); } + @TestMetadata("ThrowsOnGenericMethod.kt") + public void testThrowsOnGenericMethod() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.kt"); + } + @TestMetadata("TopLevelFunctionInDataFlowInspection.kt") public void testTopLevelFunctionInDataFlowInspection() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/TopLevelFunctionInDataFlowInspection.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithUltraLightTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithUltraLightTestGenerated.java index 0e3411b64d4..c51295d2f2c 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithUltraLightTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithUltraLightTestGenerated.java @@ -141,6 +141,11 @@ public class JavaAgainstKotlinSourceCheckerWithUltraLightTestGenerated extends A runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ReturnInnerClasses.kt"); } + @TestMetadata("ThrowsOnGenericMethod.kt") + public void testThrowsOnGenericMethod() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ThrowsOnGenericMethod.kt"); + } + @TestMetadata("TopLevelFunctionInDataFlowInspection.kt") public void testTopLevelFunctionInDataFlowInspection() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/TopLevelFunctionInDataFlowInspection.kt");