[Commonizer] Fix AbstractListCommonizer and adapt ValueParameterListCommonizerTest

^KT-48288
This commit is contained in:
sebastian.sellmair
2021-09-13 09:45:52 +02:00
committed by Space
parent cdd917bd0b
commit 4e6ad03df6
8 changed files with 66 additions and 55 deletions
@@ -15,14 +15,14 @@ import org.jetbrains.kotlin.commonizer.cir.CirType
* Input: N lists of [CirType] * Input: N lists of [CirType]
* Output: list of [CirType] * Output: list of [CirType]
*/ */
abstract class AbstractListCommonizer<T, R: Any>( abstract class AbstractListCommonizer<T, R : Any>(
private val singleElementCommonizerFactory: (Int) -> Commonizer<T, R?> private val singleElementCommonizerFactory: (Int) -> Commonizer<T, R?>
) : Commonizer<List<T>, List<R>> { ) : Commonizer<List<T>, List<R>?> {
private var commonizers: Array<Commonizer<T, R?>>? = null private var commonizers: Array<Commonizer<T, R?>>? = null
private var error = false private var error = false
final override val result: List<R> final override val result: List<R>?
get() = checkState(commonizers, error).mapNotNull { it.result } get() = checkState(commonizers, error).map { it.result ?: return null }
final override fun commonizeWith(next: List<T>): Boolean { final override fun commonizeWith(next: List<T>): Boolean {
if (error) if (error)
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.commonizer.utils.isObjCInteropCallableAnnotation
class CallableValueParametersCommonizer( class CallableValueParametersCommonizer(
typeCommonizer: TypeCommonizer, typeCommonizer: TypeCommonizer,
) : Commonizer<CirCallableMemberWithParameters, CallableValueParametersCommonizer.Result> { ) : Commonizer<CirCallableMemberWithParameters, CallableValueParametersCommonizer.Result?> {
class Result( class Result(
val hasStableParameterNames: Boolean, val hasStableParameterNames: Boolean,
val valueParameters: List<CirValueParameter>, val valueParameters: List<CirValueParameter>,
@@ -121,7 +121,7 @@ class CallableValueParametersCommonizer(
private var valueParameterNames: ValueParameterNames? = null private var valueParameterNames: ValueParameterNames? = null
private var error = false private var error = false
override val result: Result override val result: Result?
get() { get() {
// don't inline `patchCallables` property; // don't inline `patchCallables` property;
// valueParameters.overwriteNames() should be called strongly before valueParameters.result // valueParameters.overwriteNames() should be called strongly before valueParameters.result
@@ -141,7 +141,7 @@ class CallableValueParametersCommonizer(
return Result( return Result(
hasStableParameterNames = hasStableParameterNames, hasStableParameterNames = hasStableParameterNames,
valueParameters = valueParameters.result, valueParameters = valueParameters.result ?: return null,
patchCallables = patchCallables patchCallables = patchCallables
) )
} }
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
class ClassCommonizer internal constructor( class ClassCommonizer internal constructor(
typeCommonizer: TypeCommonizer, typeCommonizer: TypeCommonizer,
supertypesCommonizer: ClassSuperTypeCommonizer supertypesCommonizer: ClassSuperTypeCommonizer
) : AbstractStandardCommonizer<CirClass, CirClass>() { ) : AbstractStandardCommonizer<CirClass, CirClass?>() {
private lateinit var name: CirName private lateinit var name: CirName
private lateinit var kind: ClassKind private lateinit var kind: ClassKind
private var isInner = false private var isInner = false
@@ -23,21 +23,23 @@ class ClassCommonizer internal constructor(
private val modalityCommonizer: ModalityCommonizer = ModalityCommonizer() private val modalityCommonizer: ModalityCommonizer = ModalityCommonizer()
private val visibilityCommonizer: VisibilityCommonizer = VisibilityCommonizer.equalizing() private val visibilityCommonizer: VisibilityCommonizer = VisibilityCommonizer.equalizing()
override fun commonizationResult() = CirClass.create( override fun commonizationResult(): CirClass? {
annotations = emptyList(), return CirClass.create(
name = name, annotations = emptyList(),
typeParameters = typeParameterListCommonizer.result, name = name,
supertypes = supertypesCommonizer.result, typeParameters = typeParameterListCommonizer.result ?: return null,
visibility = visibilityCommonizer.result, supertypes = supertypesCommonizer.result,
modality = modalityCommonizer.result, visibility = visibilityCommonizer.result,
kind = kind, modality = modalityCommonizer.result,
companion = null, kind = kind,
isCompanion = isCompanion, companion = null,
isData = false, isCompanion = isCompanion,
isValue = isValue, isData = false,
isInner = isInner, isValue = isValue,
isExternal = false isInner = isInner,
) isExternal = false
)
}
override fun initialize(first: CirClass) { override fun initialize(first: CirClass) {
name = first.name name = first.name
@@ -12,20 +12,20 @@ import org.jetbrains.kotlin.descriptors.Modality
class ClassConstructorCommonizer( class ClassConstructorCommonizer(
typeCommonizer: TypeCommonizer, typeCommonizer: TypeCommonizer,
) : AbstractStandardCommonizer<CirClassConstructor, CirClassConstructor>() { ) : AbstractStandardCommonizer<CirClassConstructor, CirClassConstructor?>() {
private var isPrimary = false private var isPrimary = false
private val visibility = VisibilityCommonizer.equalizing() private val visibility = VisibilityCommonizer.equalizing()
private val typeParameterListCommonizer = TypeParameterListCommonizer(typeCommonizer) private val typeParameterListCommonizer = TypeParameterListCommonizer(typeCommonizer)
private val valueParametersCommonizer = CallableValueParametersCommonizer(typeCommonizer) private val valueParametersCommonizer = CallableValueParametersCommonizer(typeCommonizer)
private val annotationsCommonizer: AnnotationsCommonizer = AnnotationsCommonizer() private val annotationsCommonizer: AnnotationsCommonizer = AnnotationsCommonizer()
override fun commonizationResult(): CirClassConstructor { override fun commonizationResult(): CirClassConstructor? {
val valueParameters = valueParametersCommonizer.result val valueParameters = valueParametersCommonizer.result ?: return null
valueParameters.patchCallables() valueParameters.patchCallables()
return CirClassConstructor.create( return CirClassConstructor.create(
annotations = annotationsCommonizer.result, annotations = annotationsCommonizer.result,
typeParameters = typeParameterListCommonizer.result, typeParameters = typeParameterListCommonizer.result ?: return null,
visibility = visibility.result, visibility = visibility.result,
containingClass = CONTAINING_CLASS_DOES_NOT_MATTER, // does not matter containingClass = CONTAINING_CLASS_DOES_NOT_MATTER, // does not matter
valueParameters = valueParameters.valueParameters, valueParameters = valueParameters.valueParameters,
@@ -10,19 +10,21 @@ import org.jetbrains.kotlin.commonizer.cir.CirType
import org.jetbrains.kotlin.commonizer.cir.CirTypeParameter import org.jetbrains.kotlin.commonizer.cir.CirTypeParameter
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
class TypeParameterCommonizer(typeCommonizer: TypeCommonizer) : AbstractStandardCommonizer<CirTypeParameter, CirTypeParameter>() { class TypeParameterCommonizer(typeCommonizer: TypeCommonizer) : AbstractStandardCommonizer<CirTypeParameter, CirTypeParameter?>() {
private lateinit var name: CirName private lateinit var name: CirName
private var isReified = false private var isReified = false
private lateinit var variance: Variance private lateinit var variance: Variance
private val upperBounds = TypeParameterUpperBoundsCommonizer(typeCommonizer) private val upperBounds = TypeParameterUpperBoundsCommonizer(typeCommonizer)
override fun commonizationResult() = CirTypeParameter( override fun commonizationResult(): CirTypeParameter? {
annotations = emptyList(), return CirTypeParameter(
name = name, annotations = emptyList(),
isReified = isReified, name = name,
variance = variance, isReified = isReified,
upperBounds = upperBounds.result variance = variance,
) upperBounds = upperBounds.result ?: return null
)
}
override fun initialize(first: CirTypeParameter) { override fun initialize(first: CirTypeParameter) {
name = first.name name = first.name
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.commonizer.utils.mockClassType
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
import org.junit.Test import org.junit.Test
class TypeParameterCommonizerTest : AbstractCommonizerTest<CirTypeParameter, CirTypeParameter>() { class TypeParameterCommonizerTest : AbstractCommonizerTest<CirTypeParameter, CirTypeParameter?>() {
override fun createCommonizer() = TypeParameterCommonizer(TypeCommonizer(MOCK_CLASSIFIERS)) override fun createCommonizer() = TypeParameterCommonizer(TypeCommonizer(MOCK_CLASSIFIERS))
@Test @Test
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.commonizer.cir.CirTypeParameter
import org.jetbrains.kotlin.commonizer.utils.MOCK_CLASSIFIERS import org.jetbrains.kotlin.commonizer.utils.MOCK_CLASSIFIERS
import org.junit.Test import org.junit.Test
class TypeParameterListCommonizerTest : AbstractCommonizerTest<List<CirTypeParameter>, List<CirTypeParameter>>() { class TypeParameterListCommonizerTest : AbstractCommonizerTest<List<CirTypeParameter>, List<CirTypeParameter>?>() {
@Test @Test
fun emptyValueParameters() = doTestSuccess( fun emptyValueParameters() = doTestSuccess(
@@ -8,8 +8,9 @@ package org.jetbrains.kotlin.commonizer.core
import org.jetbrains.kotlin.commonizer.cir.CirValueParameter import org.jetbrains.kotlin.commonizer.cir.CirValueParameter
import org.jetbrains.kotlin.commonizer.utils.MOCK_CLASSIFIERS import org.jetbrains.kotlin.commonizer.utils.MOCK_CLASSIFIERS
import org.junit.Test import org.junit.Test
import kotlin.test.assertEquals
class ValueParameterListCommonizerTest : AbstractCommonizerTest<List<CirValueParameter>, List<CirValueParameter>>() { class ValueParameterListCommonizerTest : AbstractCommonizerTest<List<CirValueParameter>, List<CirValueParameter>?>() {
@Test @Test
fun emptyValueParameters() = doTestSuccess( fun emptyValueParameters() = doTestSuccess(
@@ -130,24 +131,30 @@ class ValueParameterListCommonizerTest : AbstractCommonizerTest<List<CirValuePar
) )
) )
@Test(expected = IllegalCommonizerStateException::class) @Test
fun mismatchedParameterTypes() = doTestFailure( fun mismatchedParameterTypes() {
mockValueParams( assertEquals(
"a" to "kotlin/String", null, createCommonizer().commonize(
"b" to "kotlin/Int", listOf(
"c" to "org/sample/Foo" mockValueParams(
), "a" to "kotlin/String",
mockValueParams( "b" to "kotlin/Int",
"a" to "kotlin/String", "c" to "org/sample/Foo"
"b" to "kotlin/Int", ),
"c" to "org/sample/Foo" mockValueParams(
), "a" to "kotlin/String",
mockValueParams( "b" to "kotlin/Int",
"a" to "kotlin/Int", "c" to "org/sample/Foo"
"b" to "kotlin/String", ),
"c" to "org/sample/Bar" mockValueParams(
"a" to "kotlin/Int",
"b" to "kotlin/String",
"c" to "org/sample/Bar"
)
)
)
) )
) }
override fun createCommonizer() = ValueParameterListCommonizer(TypeCommonizer(MOCK_CLASSIFIERS)) override fun createCommonizer() = ValueParameterListCommonizer(TypeCommonizer(MOCK_CLASSIFIERS))