From 6b913da698d2d77a5f04e5923fde15dbc94352c1 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 13 Feb 2020 19:26:24 +0300 Subject: [PATCH] New J2K: Fix super call to Kotlin class with implicit constructor #KT-36159 fixed --- .../org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt | 7 ++++++- .../conversions/MethodReferenceToLambdaConversion.kt | 2 ++ .../jetbrains/kotlin/nj2k/symbols/JKMethodSymbol.kt | 11 +++++++++++ ...otlinSuperClassWithImplicitConstructor.external.kt | 2 ++ .../kotlinSuperClassWithImplicitConstructor.java | 5 +++++ .../kotlinSuperClassWithImplicitConstructor.kt | 1 + ...wJavaToKotlinConverterSingleFileTestGenerated.java | 10 ++++++++++ 7 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.external.kt create mode 100644 nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.java create mode 100644 nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.kt diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt index 89d4439b8fa..2b1d33b056a 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt @@ -344,7 +344,12 @@ class JavaToJKTreeBuilder constructor( THIS_KEYWORD -> JKThisExpression(JKLabelEmpty(), JKNoType) else -> throwCanNotConvertError("unknown keyword in callee position") } - JKDelegationConstructorCall(symbol as JKMethodSymbol, callee, arguments.toJK()) + val calleeSymbol = when { + symbol is JKMethodSymbol -> symbol + target is KtLightMethod -> KtClassImplicitConstructorSymbol(target, typeFactory) + else -> throwCanNotConvertError("Expected constructor call, found ${target?.javaClass?.name}") + } + JKDelegationConstructorCall(calleeSymbol, callee, arguments.toJK()) } target is KtLightMethod -> { diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/MethodReferenceToLambdaConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/MethodReferenceToLambdaConversion.kt index 0e0ae9494ce..d3366e12ec4 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/MethodReferenceToLambdaConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/MethodReferenceToLambdaConversion.kt @@ -134,6 +134,7 @@ class MethodReferenceToLambdaConversion(context: NewJ2kConverterContext) : Recur is JKMultiverseMethodSymbol -> target.hasModifierProperty(PsiModifier.STATIC) is JKUniverseMethodSymbol -> target.parent?.parent?.safeAs()?.classKind == JKClass.ClassKind.COMPANION is JKUnresolvedMethod -> false + is KtClassImplicitConstructorSymbol -> false } private val JKMethodSymbol.parameterNames: List? @@ -143,6 +144,7 @@ class MethodReferenceToLambdaConversion(context: NewJ2kConverterContext) : Recur is JKMultiverseMethodSymbol -> target.parameters.map { it.name ?: return null } is JKUniverseMethodSymbol -> target.parameters.map { it.name.value } is JKUnresolvedMethod -> null + is KtClassImplicitConstructorSymbol -> null } } diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/symbols/JKMethodSymbol.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/symbols/JKMethodSymbol.kt index afa259cfe64..4f4770d0349 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/symbols/JKMethodSymbol.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/symbols/JKMethodSymbol.kt @@ -101,3 +101,14 @@ class JKUnresolvedMethod( get() = emptyList() } +class KtClassImplicitConstructorSymbol( + override val target: KtLightMethod, + override val typeFactory: JKTypeFactory +) : JKMethodSymbol(), JKMultiverseSymbol { + override val receiverType: JKType? + get() = null + override val parameterTypes: List? + get() = emptyList() + override val returnType: JKType? + get() = target.returnType?.let(typeFactory::fromPsiType) +} diff --git a/nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.external.kt b/nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.external.kt new file mode 100644 index 00000000000..cf84c2fca37 --- /dev/null +++ b/nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.external.kt @@ -0,0 +1,2 @@ +open class EmptyTest { +} \ No newline at end of file diff --git a/nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.java b/nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.java new file mode 100644 index 00000000000..9dc860006d8 --- /dev/null +++ b/nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.java @@ -0,0 +1,5 @@ +public class TestJ extends EmptyTest { + public TestJ() { + super(); + } +} \ No newline at end of file diff --git a/nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.kt b/nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.kt new file mode 100644 index 00000000000..651e008138d --- /dev/null +++ b/nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.kt @@ -0,0 +1 @@ +class TestJ : EmptyTest() diff --git a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java index 6c455e0db53..9226cabf185 100644 --- a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java +++ b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java @@ -4636,6 +4636,11 @@ public class NewJavaToKotlinConverterSingleFileTestGenerated extends AbstractNew runTest("nj2k/testData/newJ2k/superExpression/classAextendsB.java"); } + @TestMetadata("kotlinSuperClassWithImplicitConstructor.java") + public void testKotlinSuperClassWithImplicitConstructor() throws Exception { + runTest("nj2k/testData/newJ2k/superExpression/kotlinSuperClassWithImplicitConstructor.java"); + } + @TestMetadata("superStatement.java") public void testSuperStatement() throws Exception { runTest("nj2k/testData/newJ2k/superExpression/superStatement.java"); @@ -5197,6 +5202,11 @@ public class NewJavaToKotlinConverterSingleFileTestGenerated extends AbstractNew runTest("nj2k/testData/newJ2k/types/capturedWildcardTypeAsLambdaParameter.java"); } + @TestMetadata("recursiveType.java") + public void testRecursiveType() throws Exception { + runTest("nj2k/testData/newJ2k/types/recursiveType.java"); + } + @TestMetadata("unusedCapturedWildcardTypeInSAM.java") public void testUnusedCapturedWildcardTypeInSAM() throws Exception { runTest("nj2k/testData/newJ2k/types/unusedCapturedWildcardTypeInSAM.java");