From cf6ff8c6b386c1cffd2ff6824a8cfe1f1614ea42 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 26 Jun 2019 23:44:26 +0200 Subject: [PATCH] Simplify implementation of TypeSystemCommonSuperTypesContext.typeDepth --- .../fir/resolve/calls/ConeInferenceContext.kt | 18 ++---------- .../kotlin/ir/types/IrTypeSystemContext.kt | 2 -- .../types/checker/ClassicTypeSystemContext.kt | 29 ++++--------------- .../kotlin/types/model/TypeSystemContext.kt | 7 ++++- 4 files changed, 14 insertions(+), 42 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeInferenceContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeInferenceContext.kt index aa7f192b78f..28441129bde 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeInferenceContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeInferenceContext.kt @@ -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) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt index 40d06394965..0edae9a85ef 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt @@ -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? = irBuiltIns.intType as IrSimpleType diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt index e003bc9b8ca..77adc010a6c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt @@ -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 { @@ -514,23 +514,6 @@ private fun containsInternal(type: KotlinType, predicate: (KotlinTypeMarker) -> private fun singleBestRepresentative(collection: Collection) = 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}" diff --git a/core/type-system/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt b/core/type-system/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt index 5bd7ee5c383..cf3dfa76c0c 100644 --- a/core/type-system/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt +++ b/core/type-system/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt @@ -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? }