From e6b17e4bb58dd6fdff5be08245a6c23afc4cdff8 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Sun, 8 Sep 2019 16:28:00 +0700 Subject: [PATCH] [Commonizer] Internal improvements, p.2 --- .../core/AbstractCallableMemberCommonizer.kt | 4 +- .../commonizer/core/AbstractListCommonizer.kt | 3 +- .../core/AbstractNamedListCommonizer.kt | 3 +- .../core/AbstractNullableCommonizer.kt | 9 ++-- .../descriptors/commonizer/core/Commonizer.kt | 2 + .../core/ExtensionReceiverCommonizer.kt | 8 +-- .../commonizer/core/FunctionCommonizer.kt | 4 +- .../core/FunctionModifiersCommonizer.kt | 2 +- .../commonizer/core/ModalityCommonizer.kt | 2 +- .../commonizer/core/PropertyCommonizer.kt | 4 +- .../core/PropertySetterCommonizer.kt | 1 - .../commonizer/core/TypeCommonizer.kt | 17 +++--- .../core/TypeParameterCommonizer.kt | 4 +- .../core/ValueParameterCommonizer.kt | 7 ++- .../commonizer/core/VisibilityCommonizer.kt | 2 +- .../commonizer/core/AbstractCommonizerTest.kt | 2 +- .../DefaultExtensionReceiverCommonizerTest.kt | 6 +-- .../DefaultFunctionModifiersCommonizerTest.kt | 4 +- .../core/DefaultModalityCommonizerTest.kt | 6 +-- .../DefaultPropertySetterCommonizerTest.kt | 20 +++---- .../core/DefaultTypeCommonizerTest.kt | 52 +++++++++---------- .../DefaultTypeParameterCommonizerTest.kt | 14 ++--- .../DefaultTypeParameterListCommonizerTest.kt | 8 +-- .../DefaultValueParameterCommonizerTest.kt | 12 ++--- ...DefaultValueParameterListCommonizerTest.kt | 12 ++--- .../EqualizingVisibilityCommonizerTest.kt | 12 ++--- .../core/LoweringVisibilityCommonizerTest.kt | 8 +-- 27 files changed, 110 insertions(+), 118 deletions(-) diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractCallableMemberCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractCallableMemberCommonizer.kt index 93cafb22721..7d2b38c8710 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractCallableMemberCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractCallableMemberCommonizer.kt @@ -16,7 +16,7 @@ abstract class AbstractCallableMemberCommonizer( - private val subject: String, private val singleElementCommonizerFactory: () -> Commonizer ) : Commonizer, List> { private var commonizers: List>? = null private var error = false final override val result: List - get() = commonizers?.takeIf { !error }?.map { it.result } ?: error("Can't commonize list of $subject") + get() = commonizers?.takeIf { !error }?.map { it.result } ?: throw IllegalCommonizerStateException() final override fun commonizeWith(next: List): Boolean { if (error) diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractNamedListCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractNamedListCommonizer.kt index 4dd0b5dd6f4..45deafbdd22 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractNamedListCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractNamedListCommonizer.kt @@ -9,14 +9,13 @@ import org.jetbrains.kotlin.descriptors.Named import org.jetbrains.kotlin.name.Name abstract class AbstractNamedListCommonizer( - private val subject: String, private val singleElementCommonizerFactory: () -> Commonizer ) : Commonizer, List> { private var commonizers: List>>? = null private var error = false final override val result: List - get() = commonizers?.takeIf { !error }?.map { it.second.result } ?: error("Can't commonize list of $subject") + get() = commonizers?.takeIf { !error }?.map { it.second.result } ?: throw IllegalCommonizerStateException() final override fun commonizeWith(next: List): Boolean { if (error) diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractNullableCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractNullableCommonizer.kt index acd251b581b..16b85fdfa38 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractNullableCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractNullableCommonizer.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.descriptors.commonizer.core abstract class AbstractNullableCommonizer( - private val subject: String, private val wrappedCommonizerFactory: () -> Commonizer, private val extractor: (T) -> WT, private val builder: (WR) -> R @@ -19,12 +18,12 @@ abstract class AbstractNullableCommonizer( } private var state = State.EMPTY - private var wrapped: Commonizer? = null + private lateinit var wrapped: Commonizer final override val result: R? get() = when (state) { - State.EMPTY, State.ERROR -> error("$subject setter can't be commonized") - State.WITH_WRAPPED -> builder(wrapped!!.result) + State.EMPTY, State.ERROR -> throw IllegalCommonizerStateException() + State.WITH_WRAPPED -> builder(wrapped.result) State.WITHOUT_WRAPPED -> null // null means there is no commonized result } @@ -43,5 +42,5 @@ abstract class AbstractNullableCommonizer( } private fun doCommonizeWith(next: T) = - if (wrapped!!.commonizeWith(extractor(next))) State.WITH_WRAPPED else State.ERROR + if (wrapped.commonizeWith(extractor(next))) State.WITH_WRAPPED else State.ERROR } diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/Commonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/Commonizer.kt index ce833202e99..6ca0efe4514 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/Commonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/Commonizer.kt @@ -9,3 +9,5 @@ interface Commonizer { val result: R fun commonizeWith(next: T): Boolean } + +class IllegalCommonizerStateException : IllegalStateException("Illegal commonizer state: error or empty") diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ExtensionReceiverCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ExtensionReceiverCommonizer.kt index 309a5cf7c97..af02cde578d 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ExtensionReceiverCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ExtensionReceiverCommonizer.kt @@ -23,12 +23,12 @@ private class DefaultExtensionReceiverCommonizer : ExtensionReceiverCommonizer { } private var state = State.EMPTY - private var receiverType: TypeCommonizer? = null + private lateinit var receiverType: TypeCommonizer override val result: UnwrappedType? get() = when (state) { - State.EMPTY, State.ERROR -> error("Receiver parameter type can't be commonized") - State.WITH_RECEIVER -> receiverType!!.result + State.EMPTY, State.ERROR -> throw IllegalCommonizerStateException() + State.WITH_RECEIVER -> receiverType.result State.WITHOUT_RECEIVER -> null // null receiverType means there is no extension receiver } @@ -47,5 +47,5 @@ private class DefaultExtensionReceiverCommonizer : ExtensionReceiverCommonizer { } private fun doCommonizeWith(receiverParameter: ReceiverParameterDescriptor) = - if (receiverType!!.commonizeWith(receiverParameter.type)) State.WITH_RECEIVER else State.ERROR + if (receiverType.commonizeWith(receiverParameter.type)) State.WITH_RECEIVER else State.ERROR } diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionCommonizer.kt index 88789bd5ec0..e732a47b1b9 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionCommonizer.kt @@ -16,9 +16,9 @@ class FunctionCommonizer : AbstractCallableMemberCommonizer error("Can't commonize function") + State.EMPTY, State.ERROR -> throw IllegalCommonizerStateException() State.IN_PROGRESS -> CommonFunction( - name = name!!, + name = name, modality = modality.result, visibility = visibility.result, extensionReceiver = extensionReceiver.result?.toReceiverNoAnnotations(), diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionModifiersCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionModifiersCommonizer.kt index 86be8044aab..15e69e8d75a 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionModifiersCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/FunctionModifiersCommonizer.kt @@ -19,7 +19,7 @@ private class DefaultFunctionModifiersCommonizer : FunctionModifiersCommonizer { private var error = false override val result: FunctionModifiers - get() = modifiers?.takeIf { !error } ?: error("Function modifiers setter can't be commonized") + get() = modifiers?.takeIf { !error } ?: throw IllegalCommonizerStateException() override fun commonizeWith(next: SimpleFunctionDescriptor): Boolean { if (error) diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ModalityCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ModalityCommonizer.kt index 2d638fefbae..959340ba2ee 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ModalityCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ModalityCommonizer.kt @@ -64,7 +64,7 @@ private class DefaultModalityCommonizer : ModalityCommonizer { State.CAN_HAVE_ONLY_ABSTRACT -> Modality.ABSTRACT State.HAS_FINAL, State.HAS_FINAL_AND_OPEN -> Modality.FINAL State.HAS_OPEN -> Modality.OPEN - else -> error("Modality can't be commonized") + else -> throw IllegalCommonizerStateException() } override fun commonizeWith(next: Modality): Boolean { diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/PropertyCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/PropertyCommonizer.kt index 91295e280b6..7b89358871e 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/PropertyCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/PropertyCommonizer.kt @@ -16,9 +16,9 @@ class PropertyCommonizer : AbstractCallableMemberCommonizer error("Can't commonize property") + State.EMPTY, State.ERROR -> throw IllegalCommonizerStateException() State.IN_PROGRESS -> CommonProperty( - name = name!!, + name = name, modality = modality.result, visibility = visibility.result, isExternal = isExternal, diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/PropertySetterCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/PropertySetterCommonizer.kt index 7a6b977bd16..45fb9070ef4 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/PropertySetterCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/PropertySetterCommonizer.kt @@ -18,7 +18,6 @@ interface PropertySetterCommonizer : Commonizer( - subject = "Property", wrappedCommonizerFactory = { VisibilityCommonizer.equalizing() }, extractor = { it.visibility }, builder = { Setter.createDefaultNoAnnotations(it) } diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt index ff34421672d..9045e260b50 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt @@ -28,12 +28,12 @@ private class DefaultTypeCommonizer : TypeCommonizer { } private var state = State.EMPTY - private var temp: UnwrappedType? = null + private lateinit var temp: UnwrappedType override val result: UnwrappedType get() = when (state) { - State.EMPTY, State.ERROR -> error("Can't commonize type") - State.IN_PROGRESS -> temp!! + State.EMPTY, State.ERROR -> throw IllegalCommonizerStateException() + State.IN_PROGRESS -> temp } override fun commonizeWith(next: KotlinType): Boolean { @@ -45,7 +45,7 @@ private class DefaultTypeCommonizer : TypeCommonizer { } // TODO: maybe cache type comparison results? State.IN_PROGRESS -> { - if (!areTypesEqual(temp!!, next.unwrap())) State.ERROR else State.IN_PROGRESS + if (!areTypesEqual(temp, next.unwrap())) State.ERROR else State.IN_PROGRESS } } @@ -89,11 +89,10 @@ private fun areAbbreviatedTypesEqual(a: SimpleType, aExpanded: SimpleType, b: Si // N.B. only for descriptors that represent classes or type aliases, but not type parameters: val aFqName = aDescriptor.fqNameSafe - val bFqName = bDescriptor.fqNameSafe aFqName.isUnderStandardKotlinPackages // make sure that FQ names of abbreviated types (e.g. representing type aliases) are equal - && aFqName == bFqName + && aFqName == bDescriptor.fqNameSafe // if classes are from the standard Kotlin packages, compare them only by type constructors // effectively, this includes 1) comparison of FQ names and 2) number of type constructor parameters // see org.jetbrains.kotlin.types.AbstractClassTypeConstructor.equals() for details @@ -110,9 +109,7 @@ private fun areAbbreviatedTypesEqual(a: SimpleType, aExpanded: SimpleType, b: Si if (!descriptorsCanBeCommonized) return false - if (a.arguments.size != b.arguments.size) - return false - + // N.B. both lists of arguments are already known to be of the same size for (i in 0 until a.arguments.size) { val aArg = a.arguments[i] val bArg = b.arguments[i] @@ -170,7 +167,7 @@ private fun canBeCommonized(a: TypeAliasDescriptor, b: TypeAliasDescriptor): Boo } private fun canBeCommonized(a: TypeParameterDescriptor, b: TypeParameterDescriptor): Boolean { - // N.B. real type parameter commonization is performed in TypeParameterCommonizer, + // real type parameter commonization is performed in TypeParameterCommonizer, // here it is enough to check FQ names return areFqNamesEqual(a, b) } diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeParameterCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeParameterCommonizer.kt index b41125cee26..df4b3ac4fe5 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeParameterCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeParameterCommonizer.kt @@ -34,7 +34,7 @@ private class DefaultTypeParameterCommonizer : TypeParameterCommonizer { override val result: TypeParameter get() = when (state) { - State.EMPTY, State.ERROR -> error("Can't commonize type parameter") + State.EMPTY, State.ERROR -> throw IllegalCommonizerStateException() State.IN_PROGRESS -> CommonTypeParameter( name = name, isReified = isReified, @@ -66,7 +66,6 @@ private class DefaultTypeParameterCommonizer : TypeParameterCommonizer { } private class TypeParameterUpperBoundsCommonizer : AbstractListCommonizer( - subject = "type parameter upper bounds", singleElementCommonizerFactory = { TypeCommonizer.default() } ) @@ -79,6 +78,5 @@ interface TypeParameterListCommonizer : Commonizer private class DefaultTypeParameterListCommonizer : TypeParameterListCommonizer, AbstractNamedListCommonizer( - subject = "type parameters", singleElementCommonizerFactory = { TypeParameterCommonizer.default() } ) diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ValueParameterCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ValueParameterCommonizer.kt index f2d8109d7b0..01811851b9b 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ValueParameterCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ValueParameterCommonizer.kt @@ -25,7 +25,7 @@ private class DefaultValueParameterCommonizer : ValueParameterCommonizer { IN_PROGRESS } - private var name: Name? = null + private lateinit var name: Name private val returnType = TypeCommonizer.default() private var varargElementType: UnwrappedType? = null private var isCrossinline = true @@ -35,9 +35,9 @@ private class DefaultValueParameterCommonizer : ValueParameterCommonizer { override val result: ValueParameter get() = when (state) { - State.EMPTY, State.ERROR -> error("Can't commonize value parameter") + State.EMPTY, State.ERROR -> throw IllegalCommonizerStateException() State.IN_PROGRESS -> CommonValueParameter( - name = name!!, + name = name, returnType = returnType.result, varargElementType = varargElementType, isCrossinline = isCrossinline, @@ -83,6 +83,5 @@ interface ValueParameterListCommonizer : Commonizer( - subject = "value parameters", singleElementCommonizerFactory = { ValueParameterCommonizer.default() } ) diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/VisibilityCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/VisibilityCommonizer.kt index db518ccdddf..1ec9c58d68f 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/VisibilityCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/VisibilityCommonizer.kt @@ -19,7 +19,7 @@ abstract class VisibilityCommonizer : Commonizer { override val result: Visibility get() { - return temp?.takeIf { it != Visibilities.UNKNOWN } ?: error("Visibility can't be commonized") + return temp?.takeIf { it != Visibilities.UNKNOWN } ?: throw IllegalCommonizerStateException() } override fun commonizeWith(next: Visibility): Boolean { diff --git a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractCommonizerTest.kt b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractCommonizerTest.kt index b85ecea4363..34fd9496763 100644 --- a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractCommonizerTest.kt +++ b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractCommonizerTest.kt @@ -10,7 +10,7 @@ import org.junit.Test abstract class AbstractCommonizerTest { - @Test(expected = IllegalStateException::class) + @Test(expected = IllegalCommonizerStateException::class) fun failOnNoVariantsSubmitted() { createCommonizer().result fail() diff --git a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultExtensionReceiverCommonizerTest.kt b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultExtensionReceiverCommonizerTest.kt index b822fdc8408..5dd887d43a8 100644 --- a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultExtensionReceiverCommonizerTest.kt +++ b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultExtensionReceiverCommonizerTest.kt @@ -31,21 +31,21 @@ class DefaultExtensionReceiverCommonizerTest : AbstractCommonizerTest @Test fun onlyAbstract() = doTestSuccess(ABSTRACT, ABSTRACT, ABSTRACT, ABSTRACT) - @Test(expected = IllegalStateException::class) + @Test(expected = IllegalCommonizerStateException::class) fun sealedAndAbstract() = doTestFailure(SEALED, ABSTRACT) - @Test(expected = IllegalStateException::class) + @Test(expected = IllegalCommonizerStateException::class) fun sealedAndFinal() = doTestFailure(SEALED, FINAL) - @Test(expected = IllegalStateException::class) + @Test(expected = IllegalCommonizerStateException::class) fun abstractAndFinal() = doTestFailure(ABSTRACT, FINAL) @Test diff --git a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultPropertySetterCommonizerTest.kt b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultPropertySetterCommonizerTest.kt index 56ea083a033..dc5eaffd1ea 100644 --- a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultPropertySetterCommonizerTest.kt +++ b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultPropertySetterCommonizerTest.kt @@ -19,16 +19,16 @@ class DefaultPropertySetterCommonizerTest : AbstractCommonizerTest