[Lombok] Properly support Guava collections with @Singular

^KT-53683 Fixed
This commit is contained in:
Dmitriy Novozhilov
2022-09-09 12:14:12 +03:00
committed by teamcity
parent 69a857649f
commit 2aadaee69f
12 changed files with 253 additions and 90 deletions
@@ -184,24 +184,25 @@ class BuilderGenerator(session: FirSession) : FirDeclarationGenerationExtension(
val nameInSingularForm = (singular.singularName ?: field.name.identifier.singularForm)?.let(Name::identifier) ?: return
val useGuava = lombokService.config.useGuava
val supportedCollections = LombokNames.getSupportedCollectionsForSingular(useGuava)
val supportedMaps = LombokNames.getSupportedMapsForSingular(useGuava)
val addMultipleParameterType: FirTypeRef
val valueParameters: List<ConeLombokValueParameter>
when (typeName) {
in supportedCollections -> {
in LombokNames.SUPPORTED_COLLECTIONS -> {
val parameterType = javaClassifierType.parameterType(0, singular.allowNull) ?: return
valueParameters = listOf(
ConeLombokValueParameter(nameInSingularForm, parameterType.toRef())
)
addMultipleParameterType = DummyJavaClassType(JavaClasses.Collection, typeArguments = listOf(parameterType)).toRef()
val baseType = when (typeName) {
in LombokNames.SUPPORTED_GUAVA_COLLECTIONS -> JavaClasses.Iterable
else -> JavaClasses.Collection
}
addMultipleParameterType = DummyJavaClassType(baseType, typeArguments = listOf(parameterType)).toRef()
}
in supportedMaps -> {
in LombokNames.SUPPORTED_MAPS -> {
val keyType = javaClassifierType.parameterType(0, singular.allowNull) ?: return
val valueType = javaClassifierType.parameterType(1, singular.allowNull) ?: return
valueParameters = listOf(
@@ -212,6 +213,23 @@ class BuilderGenerator(session: FirSession) : FirDeclarationGenerationExtension(
addMultipleParameterType = DummyJavaClassType(JavaClasses.Map, typeArguments = listOf(keyType, valueType)).toRef()
}
in LombokNames.SUPPORTED_TABLES -> {
val rowKeyType = javaClassifierType.parameterType(0, singular.allowNull) ?: return
val columnKeyType = javaClassifierType.parameterType(1, singular.allowNull) ?: return
val valueType = javaClassifierType.parameterType(2, singular.allowNull) ?: return
valueParameters = listOf(
ConeLombokValueParameter(Name.identifier("rowKey"), rowKeyType.toRef()),
ConeLombokValueParameter(Name.identifier("columnKey"), columnKeyType.toRef()),
ConeLombokValueParameter(Name.identifier("value"), valueType.toRef()),
)
addMultipleParameterType = DummyJavaClassType(
JavaClasses.Table,
typeArguments = listOf(rowKeyType, columnKeyType, valueType)
).toRef()
}
else -> return
}
@@ -255,9 +273,6 @@ class BuilderGenerator(session: FirSession) : FirDeclarationGenerationExtension(
private val String.singularForm: String?
get() = StringUtil.unpluralize(this)
private val LombokConfig.useGuava: Boolean
get() = getBoolean("lombok.singular.useGuava") ?: false
private fun JavaClassifierType.parameterType(index: Int, allowNull: Boolean): JavaType? {
val type = typeArguments.getOrNull(index) ?: return null
return if (allowNull) type.makeNullable() else type.makeNotNullable()
@@ -7,17 +7,24 @@ package org.jetbrains.kotlin.lombok.k2.java
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.load.java.structure.*
import org.jetbrains.kotlin.lombok.utils.LombokNames
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
object JavaClasses {
val Iterable = DummyJavaClass("Iterable", javaLangName("Iterable"), numberOfTypeParameters = 1)
val Collection = DummyJavaClass("Collection", javaUtilName("Collection"), numberOfTypeParameters = 1)
val Map = DummyJavaClass("Map", javaUtilName("Map"), numberOfTypeParameters = 2)
val Table = DummyJavaClass("Table", LombokNames.TABLE, numberOfTypeParameters = 3)
private fun javaUtilName(name: String): FqName {
return FqName.fromSegments(listOf("java", "util", name))
}
private fun javaLangName(name: String): FqName {
return FqName.fromSegments(listOf("java", "lang", name))
}
}
class DummyJavaClass(name: String, override val fqName: FqName, numberOfTypeParameters: Int) : JavaClass {