Do subtyping between self types with captured type in special way

This commit is contained in:
Victor Petukhov
2021-03-24 15:30:16 +03:00
parent 7f2c5cde55
commit bbf5c4412e
14 changed files with 185 additions and 11 deletions
@@ -44,6 +44,12 @@ interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext, TypeSy
return declarationDescriptor?.classId?.isLocal == true
}
override val TypeVariableTypeConstructorMarker.typeParameter: TypeParameterMarker?
get() {
require(this is NewTypeVariableConstructor, this::errorMessage)
return this.originalTypeParameter
}
override fun SimpleTypeMarker.possibleIntegerTypes(): Collection<KotlinTypeMarker> {
val typeConstructor = typeConstructor()
require(typeConstructor is IntegerLiteralTypeConstructor, this::errorMessage)
@@ -212,6 +218,13 @@ interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext, TypeSy
return this.typeConstructor
}
override fun TypeParameterMarker.doesFormSelfType(selfConstructor: TypeConstructorMarker): Boolean {
require(this is TypeParameterDescriptor, this::errorMessage)
require(selfConstructor is TypeConstructor, this::errorMessage)
return doesTypeParameterFormSelfType(this, selfConstructor)
}
override fun areEqualTypeConstructors(c1: TypeConstructorMarker, c2: TypeConstructorMarker): Boolean {
require(c1 is TypeConstructor, c1::errorMessage)
require(c2 is TypeConstructor, c2::errorMessage)
@@ -17,9 +17,11 @@
package org.jetbrains.kotlin.types.checker
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.resolve.calls.inference.wrapWithCapturingSubstitution
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.typeUtil.contains
import org.jetbrains.kotlin.types.typesApproximation.approximateCapturedTypes
import java.util.*
@@ -101,4 +103,11 @@ private fun TypeConstructor.debugInfo() = buildString {
}
}
interface NewTypeVariableConstructor
interface NewTypeVariableConstructor {
val originalTypeParameter: TypeParameterDescriptor?
}
fun doesTypeParameterFormSelfType(typeParameter: TypeParameterDescriptor, selfConstructor: TypeConstructor) =
typeParameter.upperBounds.any { upperBound ->
upperBound.contains { it.constructor == typeParameter.typeConstructor } && upperBound.constructor == selfConstructor
}