diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/NewKotlinTypeChecker.kt b/core/descriptors/src/org/jetbrains/kotlin/types/checker/NewKotlinTypeChecker.kt index 5366a48202e..a3e43294e31 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/NewKotlinTypeChecker.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/NewKotlinTypeChecker.kt @@ -177,8 +177,12 @@ object NewKotlinTypeChecker : KotlinTypeChecker { } private fun TypeCheckerContext.isSubtypeOfForSingleClassifierType(subType: SimpleType, superType: SimpleType): Boolean { - assert(subType.isSingleClassifierType || subType.isIntersectionType) { "Not singleClassifierType and not intersection subType: $subType" } - assert(superType.isSingleClassifierType) { "Not singleClassifierType superType: $superType" } + assert(subType.isSingleClassifierType || subType.isIntersectionType || subType.isAllowedTypeVariable) { + "Not singleClassifierType and not intersection subType: $subType" + } + assert(superType.isSingleClassifierType || superType.isAllowedTypeVariable) { + "Not singleClassifierType superType: $superType" + } if (!NullabilityChecker.isPossibleSubtype(this, subType, superType)) return false @@ -342,8 +346,12 @@ object NullabilityChecker { private fun TypeCheckerContext.runIsPossibleSubtype(subType: SimpleType, superType: SimpleType): Boolean { // it makes for case String? & Any <: String - assert(subType.isIntersectionType || subType.isSingleClassifierType) {"Not singleClassifierType superType: $superType"} - assert(superType.isSingleClassifierType) {"Not singleClassifierType superType: $superType"} + assert(subType.isIntersectionType || subType.isSingleClassifierType || subType.isAllowedTypeVariable) { + "Not singleClassifierType superType: $superType" + } + assert(superType.isSingleClassifierType || subType.isAllowedTypeVariable) { + "Not singleClassifierType superType: $superType" + } // superType is actually nullable if (superType.isMarkedNullable) return true diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/TypeCheckerContext.kt b/core/descriptors/src/org/jetbrains/kotlin/types/checker/TypeCheckerContext.kt index c33e482a3b1..3e88a04ea3e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/TypeCheckerContext.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/TypeCheckerContext.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.utils.SmartSet import java.util.* -open class TypeCheckerContext(val errorTypeEqualsToAnything: Boolean) { +open class TypeCheckerContext(val errorTypeEqualsToAnything: Boolean, val allowedTypeVariable: Boolean = true) { protected var argumentsDepth = 0 private var supertypesLocked = false @@ -116,4 +116,6 @@ open class TypeCheckerContext(val errorTypeEqualsToAnything: Boolean) { substitutor.safeSubstitute(type.lowerIfFlexible(), Variance.INVARIANT).asSimpleType() } } + + val UnwrappedType.isAllowedTypeVariable: Boolean get() = allowedTypeVariable && constructor is NewTypeVariableConstructor } \ No newline at end of file diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/utils.kt b/core/descriptors/src/org/jetbrains/kotlin/types/checker/utils.kt index c9105618594..3d9ec2883a7 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/utils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/utils.kt @@ -100,3 +100,5 @@ private fun TypeConstructor.debugInfo() = buildString { declarationDescriptor = declarationDescriptor.containingDeclaration } } + +interface NewTypeVariableConstructor