Simplify implementation of TypeSystemCommonSuperTypesContext.typeDepth

This commit is contained in:
Alexander Udalov
2019-06-26 23:44:26 +02:00
parent 331f0291ce
commit cf6ff8c6b3
4 changed files with 14 additions and 42 deletions
@@ -91,7 +91,8 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext,
|| this is ConeTypeParameterType
}
fun ConeKotlinType.typeDepthSimple(): Int {
override fun SimpleTypeMarker.typeDepth(): Int {
require(this is ConeKotlinType)
// if (this is TypeUtils.SpecialType) return 0 // TODO: WTF?
val maxInArguments = this.typeArguments.asSequence().map {
@@ -101,21 +102,6 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext,
return maxInArguments + 1
}
override fun SimpleTypeMarker.typeDepth(): Int {
require(this is ConeKotlinType)
return this.typeDepthSimple()
}
override fun KotlinTypeMarker.typeDepth(): Int {
require(this is ConeKotlinType) {
"Incorrect type of class ${this::class.java}: $this"
}
return when (this) {
is ConeFlexibleType -> Math.max(lowerBound.typeDepthSimple(), upperBound.typeDepthSimple())
else -> typeDepthSimple()
}
}
override fun KotlinTypeMarker.contains(predicate: (KotlinTypeMarker) -> Boolean): Boolean {
return this.containsInternal(predicate)
}
@@ -217,8 +217,6 @@ interface IrTypeSystemContext : TypeSystemInferenceExtensionContext {
override fun SimpleTypeMarker.typeDepth() = 2
override fun KotlinTypeMarker.typeDepth() = if (this is IrStarProjection) 1 else 0
override fun findCommonIntegerLiteralTypesSuperType(explicitSupertypes: List<SimpleTypeMarker>): SimpleTypeMarker? =
irBuiltIns.intType as IrSimpleType
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.types.typeUtil.asTypeProjection
import org.jetbrains.kotlin.types.typeUtil.contains
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
import kotlin.math.max
interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext {
override fun TypeConstructorMarker.isDenotable(): Boolean {
@@ -268,12 +267,13 @@ interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext {
override fun SimpleTypeMarker.typeDepth(): Int {
require(this is SimpleType, this::errorMessage)
return this.typeDepthInternal()
}
if (this is TypeUtils.SpecialType) return 0
override fun KotlinTypeMarker.typeDepth(): Int {
require(this is UnwrappedType, this::errorMessage)
return this.typeDepthInternal()
val maxInArguments = arguments.asSequence().map {
if (it.isStarProjection) 1 else it.type.unwrap().typeDepth()
}.max() ?: 0
return maxInArguments + 1
}
override fun intersectTypes(types: List<KotlinTypeMarker>): KotlinTypeMarker {
@@ -514,23 +514,6 @@ private fun containsInternal(type: KotlinType, predicate: (KotlinTypeMarker) ->
private fun singleBestRepresentative(collection: Collection<KotlinType>) = collection.singleBestRepresentative()
internal fun UnwrappedType.typeDepthInternal() =
when (this) {
is SimpleType -> typeDepthInternal()
is FlexibleType -> max(lowerBound.typeDepthInternal(), upperBound.typeDepthInternal())
}
internal fun SimpleType.typeDepthInternal(): Int {
if (this is TypeUtils.SpecialType) return 0
val maxInArguments = arguments.asSequence().map {
if (it.isStarProjection) 1 else it.type.unwrap().typeDepthInternal()
}.max() ?: 0
return maxInArguments + 1
}
@Suppress("NOTHING_TO_INLINE")
private inline fun Any.errorMessage(): String {
return "ClassicTypeSystemContext couldn't handle: $this, ${this::class}"
@@ -76,7 +76,12 @@ interface TypeSystemCommonSuperTypesContext : TypeSystemContext, TypeSystemTypeF
fun KotlinTypeMarker.canHaveUndefinedNullability(): Boolean
fun SimpleTypeMarker.typeDepth(): Int
fun KotlinTypeMarker.typeDepth(): Int
fun KotlinTypeMarker.typeDepth(): Int = when (this) {
is SimpleTypeMarker -> typeDepth()
is FlexibleTypeMarker -> maxOf(lowerBound().typeDepth(), upperBound().typeDepth())
else -> error("Type should be simple or flexible: $this")
}
fun findCommonIntegerLiteralTypesSuperType(explicitSupertypes: List<SimpleTypeMarker>): SimpleTypeMarker?
}