diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractListCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractListCommonizer.kt index c75a20a5d95..63bfaa2da16 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractListCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractListCommonizer.kt @@ -22,7 +22,7 @@ abstract class AbstractListCommonizer( private var error = false final override val result: List - get() = commonizers?.takeIf { !error }?.map { it.result } ?: throw IllegalCommonizerStateException() + get() = checkState(commonizers, error).map { it.result } final override fun commonizeWith(next: List): Boolean { if (error) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractNullableCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractNullableCommonizer.kt index a7bbcae3850..380c7e9bb89 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractNullableCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AbstractNullableCommonizer.kt @@ -27,7 +27,8 @@ abstract class AbstractNullableCommonizer( final override val result: R? get() = when (state) { - State.EMPTY, State.ERROR -> throw IllegalCommonizerStateException() + State.EMPTY -> failInEmptyState() + State.ERROR -> failInErrorState() State.WITH_WRAPPED -> builder(wrapped.result) State.WITHOUT_WRAPPED -> null // null means there is no commonized result } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizer.kt index 3fc3b3cdda6..73796f84813 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizer.kt @@ -61,7 +61,7 @@ private class DeprecatedAnnotationCommonizer : Commonizer> = if (level == WARNING) { diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/Commonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/Commonizer.kt index 025f3be9a81..d073f21474c 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/Commonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/Commonizer.kt @@ -20,13 +20,14 @@ abstract class AbstractStandardCommonizer : Commonizer { private var state = State.EMPTY protected val hasResult: Boolean - get() = when (state) { - State.EMPTY, State.ERROR -> false - State.IN_PROGRESS -> true - } + get() = state == State.IN_PROGRESS final override val result: R - get() = if (hasResult) commonizationResult() else throw IllegalCommonizerStateException() + get() = when (state) { + State.EMPTY -> failInEmptyState() + State.ERROR -> failInErrorState() + State.IN_PROGRESS -> commonizationResult() + } final override fun commonizeWith(next: T): Boolean { val result = when (state) { @@ -49,4 +50,16 @@ abstract class AbstractStandardCommonizer : Commonizer { protected abstract fun doCommonizeWith(next: T): Boolean } -class IllegalCommonizerStateException : IllegalStateException("Illegal commonizer state: error or empty") +@Suppress("unused") +fun Commonizer<*, *>.failInEmptyState(): Nothing = throw IllegalCommonizerStateException("empty") + +@Suppress("unused") +fun Commonizer<*, *>.failInErrorState(): Nothing = throw IllegalCommonizerStateException("empty") + +fun Commonizer<*, *>.checkState(value: T?, error: Boolean): T = when { + value == null -> failInEmptyState() + error -> failInErrorState() + else -> value +} + +class IllegalCommonizerStateException(message: String) : IllegalStateException("Illegal commonizer state: $message") diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ModalityCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ModalityCommonizer.kt index 7a2939a703b..2bd5571dbaf 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ModalityCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ModalityCommonizer.kt @@ -12,7 +12,7 @@ class ModalityCommonizer : Commonizer { private var error = false override val result: Modality - get() = temp?.takeIf { !error } ?: throw IllegalCommonizerStateException() + get() = checkState(temp, error) override fun commonizeWith(next: Modality): Boolean { if (error) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/VisibilityCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/VisibilityCommonizer.kt index e62c754a16e..4a68c1b1f29 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/VisibilityCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/VisibilityCommonizer.kt @@ -20,7 +20,7 @@ abstract class VisibilityCommonizer : Commonizer { private var temp: Visibility? = null override val result: Visibility - get() = temp?.takeIf { it != Visibilities.UNKNOWN } ?: throw IllegalCommonizerStateException() + get() = checkState(temp, temp == Visibilities.UNKNOWN) override fun commonizeWith(next: CirHasVisibility): Boolean { if (temp == Visibilities.UNKNOWN)