[Lombok] Properly support Guava collections with @Singular
^KT-53683 Fixed
This commit is contained in:
committed by
teamcity
parent
69a857649f
commit
2aadaee69f
+25
-10
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user