From a78d43c1ecd4561741bccd2224990bf71b38e2b7 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 9 Sep 2022 12:57:32 +0300 Subject: [PATCH] [Lombok] Support RawTypes in fields wtih @Singular in K2 version ^KT-53657 Fixed --- .../lombok/k2/generators/BuilderGenerator.kt | 14 ++++--- .../lombok/k2/java/dummyJavaElements.kt | 1 + .../kotlin/lombok/k2/java/wrappedJavaTypes.kt | 4 ++ .../lombok/testData/box/builderRawSingular.kt | 37 +++++++++++++++++++ ...BlackBoxCodegenTestForLombokGenerated.java | 6 +++ ...BlackBoxCodegenTestForLombokGenerated.java | 6 +++ ...BlackBoxCodegenTestForLombokGenerated.java | 6 +++ 7 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 plugins/lombok/testData/box/builderRawSingular.kt diff --git a/plugins/lombok/lombok.k2/src/org/jetbrains/kotlin/lombok/k2/generators/BuilderGenerator.kt b/plugins/lombok/lombok.k2/src/org/jetbrains/kotlin/lombok/k2/generators/BuilderGenerator.kt index 4aca6836a41..e33d0a508fa 100644 --- a/plugins/lombok/lombok.k2/src/org/jetbrains/kotlin/lombok/k2/generators/BuilderGenerator.kt +++ b/plugins/lombok/lombok.k2/src/org/jetbrains/kotlin/lombok/k2/generators/BuilderGenerator.kt @@ -186,9 +186,11 @@ class BuilderGenerator(session: FirSession) : FirDeclarationGenerationExtension( val addMultipleParameterType: FirTypeRef val valueParameters: List + val fallbackParameterType = DummyJavaClassType.ObjectType.takeIf { javaClassifierType.isRaw } + when (typeName) { in LombokNames.SUPPORTED_COLLECTIONS -> { - val parameterType = javaClassifierType.parameterType(0) ?: return + val parameterType = javaClassifierType.parameterType(0) ?: fallbackParameterType ?: return valueParameters = listOf( ConeLombokValueParameter(nameInSingularForm, parameterType.toRef()) ) @@ -204,8 +206,8 @@ class BuilderGenerator(session: FirSession) : FirDeclarationGenerationExtension( } in LombokNames.SUPPORTED_MAPS -> { - val keyType = javaClassifierType.parameterType(0) ?: return - val valueType = javaClassifierType.parameterType(1) ?: return + val keyType = javaClassifierType.parameterType(0) ?: fallbackParameterType ?: return + val valueType = javaClassifierType.parameterType(1) ?: fallbackParameterType ?: return valueParameters = listOf( ConeLombokValueParameter(Name.identifier("key"), keyType.toRef()), ConeLombokValueParameter(Name.identifier("value"), valueType.toRef()), @@ -217,9 +219,9 @@ class BuilderGenerator(session: FirSession) : FirDeclarationGenerationExtension( } in LombokNames.SUPPORTED_TABLES -> { - val rowKeyType = javaClassifierType.parameterType(0) ?: return - val columnKeyType = javaClassifierType.parameterType(1) ?: return - val valueType = javaClassifierType.parameterType(2) ?: return + val rowKeyType = javaClassifierType.parameterType(0) ?: fallbackParameterType ?: return + val columnKeyType = javaClassifierType.parameterType(1) ?: fallbackParameterType ?: return + val valueType = javaClassifierType.parameterType(2) ?: fallbackParameterType ?: return valueParameters = listOf( ConeLombokValueParameter(Name.identifier("rowKey"), rowKeyType.toRef()), diff --git a/plugins/lombok/lombok.k2/src/org/jetbrains/kotlin/lombok/k2/java/dummyJavaElements.kt b/plugins/lombok/lombok.k2/src/org/jetbrains/kotlin/lombok/k2/java/dummyJavaElements.kt index 968182f12f0..95ffd311370 100644 --- a/plugins/lombok/lombok.k2/src/org/jetbrains/kotlin/lombok/k2/java/dummyJavaElements.kt +++ b/plugins/lombok/lombok.k2/src/org/jetbrains/kotlin/lombok/k2/java/dummyJavaElements.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name object JavaClasses { + val Object = DummyJavaClass("Object", javaLangName("Object"), numberOfTypeParameters = 0) val Iterable = DummyJavaClass("Iterable", javaLangName("Iterable"), numberOfTypeParameters = 1) val Collection = DummyJavaClass("Collection", javaUtilName("Collection"), numberOfTypeParameters = 1) val Map = DummyJavaClass("Map", javaUtilName("Map"), numberOfTypeParameters = 2) diff --git a/plugins/lombok/lombok.k2/src/org/jetbrains/kotlin/lombok/k2/java/wrappedJavaTypes.kt b/plugins/lombok/lombok.k2/src/org/jetbrains/kotlin/lombok/k2/java/wrappedJavaTypes.kt index b0fee53ad45..ee8cdeea374 100644 --- a/plugins/lombok/lombok.k2/src/org/jetbrains/kotlin/lombok/k2/java/wrappedJavaTypes.kt +++ b/plugins/lombok/lombok.k2/src/org/jetbrains/kotlin/lombok/k2/java/wrappedJavaTypes.kt @@ -90,6 +90,10 @@ class DummyJavaClassType( override val classifier: JavaClass, override val typeArguments: List ) : JavaClassifierType { + companion object { + val ObjectType = DummyJavaClassType(JavaClasses.Object, typeArguments = emptyList()) + } + override val annotations: Collection get() = emptyList() override val isDeprecatedInJavaDoc: Boolean diff --git a/plugins/lombok/testData/box/builderRawSingular.kt b/plugins/lombok/testData/box/builderRawSingular.kt new file mode 100644 index 00000000000..85e9cfdc0d7 --- /dev/null +++ b/plugins/lombok/testData/box/builderRawSingular.kt @@ -0,0 +1,37 @@ +// WITH_STDLIB +// FULL_JDK +// FILE: User.java +import lombok.Builder; +import lombok.Data; +import lombok.Singular; + +@Builder +@Data +public class User { + @Singular private java.util.Map numbers; + @Singular private java.util.List statuses; +} + +// FILE: test.kt +fun box(): String { + val userBuilder = User.builder() + .status(10) + .status("hello") + .statuses(listOf("world", 20)) + .number("1", 1) + .numbers(mapOf(2 to "2")) + + val user = userBuilder.build() + + val expectedNumbers = mapOf("1" to 1, 2 to "2") + val expectedStatuses = listOf(10, "hello", "world", 20) + + return if ( + user.numbers == expectedNumbers && + user.statuses == expectedStatuses + ) { + "OK" + } else { + "Error: $user" + } +} diff --git a/plugins/lombok/tests-gen/org/jetbrains/kotlin/lombok/BlackBoxCodegenTestForLombokGenerated.java b/plugins/lombok/tests-gen/org/jetbrains/kotlin/lombok/BlackBoxCodegenTestForLombokGenerated.java index 0d7dbfb0143..4f6d0742956 100644 --- a/plugins/lombok/tests-gen/org/jetbrains/kotlin/lombok/BlackBoxCodegenTestForLombokGenerated.java +++ b/plugins/lombok/tests-gen/org/jetbrains/kotlin/lombok/BlackBoxCodegenTestForLombokGenerated.java @@ -61,6 +61,12 @@ public class BlackBoxCodegenTestForLombokGenerated extends AbstractBlackBoxCodeg runTest("plugins/lombok/testData/box/builderGuava.kt"); } + @Test + @TestMetadata("builderRawSingular.kt") + public void testBuilderRawSingular() throws Exception { + runTest("plugins/lombok/testData/box/builderRawSingular.kt"); + } + @Test @TestMetadata("builderSingular.kt") public void testBuilderSingular() throws Exception { diff --git a/plugins/lombok/tests-gen/org/jetbrains/kotlin/lombok/FirBlackBoxCodegenTestForLombokGenerated.java b/plugins/lombok/tests-gen/org/jetbrains/kotlin/lombok/FirBlackBoxCodegenTestForLombokGenerated.java index 10bf052b12c..35c17d08101 100644 --- a/plugins/lombok/tests-gen/org/jetbrains/kotlin/lombok/FirBlackBoxCodegenTestForLombokGenerated.java +++ b/plugins/lombok/tests-gen/org/jetbrains/kotlin/lombok/FirBlackBoxCodegenTestForLombokGenerated.java @@ -61,6 +61,12 @@ public class FirBlackBoxCodegenTestForLombokGenerated extends AbstractFirBlackBo runTest("plugins/lombok/testData/box/builderGuava.kt"); } + @Test + @TestMetadata("builderRawSingular.kt") + public void testBuilderRawSingular() throws Exception { + runTest("plugins/lombok/testData/box/builderRawSingular.kt"); + } + @Test @TestMetadata("builderSingular.kt") public void testBuilderSingular() throws Exception { diff --git a/plugins/lombok/tests-gen/org/jetbrains/kotlin/lombok/IrBlackBoxCodegenTestForLombokGenerated.java b/plugins/lombok/tests-gen/org/jetbrains/kotlin/lombok/IrBlackBoxCodegenTestForLombokGenerated.java index 27f61a4821f..ada5c19daf1 100644 --- a/plugins/lombok/tests-gen/org/jetbrains/kotlin/lombok/IrBlackBoxCodegenTestForLombokGenerated.java +++ b/plugins/lombok/tests-gen/org/jetbrains/kotlin/lombok/IrBlackBoxCodegenTestForLombokGenerated.java @@ -61,6 +61,12 @@ public class IrBlackBoxCodegenTestForLombokGenerated extends AbstractIrBlackBoxC runTest("plugins/lombok/testData/box/builderGuava.kt"); } + @Test + @TestMetadata("builderRawSingular.kt") + public void testBuilderRawSingular() throws Exception { + runTest("plugins/lombok/testData/box/builderRawSingular.kt"); + } + @Test @TestMetadata("builderSingular.kt") public void testBuilderSingular() throws Exception {