TypeParameterDescriptor propagation to CapturedTypeConstructor

This commit is contained in:
Michael Bogdanov
2016-01-05 12:47:31 +03:00
parent 0bcae4e0c0
commit 833cdb0706
4 changed files with 13 additions and 10 deletions
@@ -320,7 +320,7 @@ class ConstraintSystemBuilderImpl : ConstraintSystem.Builder {
else {
constrainingTypeProjection
}
val capturedType = createCapturedType(typeProjection)
val capturedType = createCapturedType(typeProjection, typeVariable.originalTypeParameter)
addBound(typeVariable, capturedType, EXACT_BOUND, constraintContext)
}
@@ -87,8 +87,8 @@ private fun ConstraintSystemBuilderImpl.generateNewBound(bound: Bound, substitut
val substitutedType = when (substitution.kind) {
EXACT_BOUND -> substitution.constrainingType
UPPER_BOUND -> CapturedType(TypeProjectionImpl(Variance.OUT_VARIANCE, substitution.constrainingType))
LOWER_BOUND -> CapturedType(TypeProjectionImpl(Variance.IN_VARIANCE, substitution.constrainingType))
UPPER_BOUND -> CapturedType(TypeProjectionImpl(Variance.OUT_VARIANCE, substitution.constrainingType), substitution.typeVariable.originalTypeParameter)
LOWER_BOUND -> CapturedType(TypeProjectionImpl(Variance.IN_VARIANCE, substitution.constrainingType), substitution.typeVariable.originalTypeParameter)
}
val newTypeProjection = TypeProjectionImpl(substitutedType)
@@ -84,7 +84,7 @@ class CapturedTypeApproximationTest() : KotlinLiteFixture() {
fun createTestSubstitutor(testSubstitution: Map<TypeParameterDescriptor, TypeProjection>): TypeSubstitutor {
val substitutionContext = testSubstitution.map {
val (typeParameter, typeProjection) = it
typeParameter.typeConstructor to TypeProjectionImpl(createCapturedType(typeProjection))
typeParameter.typeConstructor to TypeProjectionImpl(createCapturedType(typeProjection, typeParameter))
}.toMap()
return TypeSubstitutor.create(substitutionContext)
}
@@ -25,7 +25,8 @@ import org.jetbrains.kotlin.types.Variance.OUT_VARIANCE
import org.jetbrains.kotlin.types.typeUtil.builtIns
class CapturedTypeConstructor(
val typeProjection: TypeProjection
val typeProjection: TypeProjection,
val typeParameterDescriptor: TypeParameterDescriptor
): TypeConstructor {
init {
assert(typeProjection.projectionKind != Variance.INVARIANT) {
@@ -47,7 +48,7 @@ class CapturedTypeConstructor(
override fun isDenotable() = false
override fun getDeclarationDescriptor() = null
override fun getDeclarationDescriptor() = typeParameterDescriptor
override fun getAnnotations() = Annotations.EMPTY
@@ -57,13 +58,14 @@ class CapturedTypeConstructor(
}
class CapturedType(
private val typeProjection: TypeProjection
private val typeProjection: TypeProjection,
private val typeParameterDescriptor: TypeParameterDescriptor
): DelegatingType(), SubtypingRepresentatives {
private val delegateType = run {
val scope = ErrorUtils.createErrorScope(
"No member resolution should be done on captured type, it used only during constraint system resolution", true)
KotlinTypeImpl.create(Annotations.EMPTY, CapturedTypeConstructor(typeProjection), false, listOf(), scope)
KotlinTypeImpl.create(Annotations.EMPTY, CapturedTypeConstructor(typeProjection, typeParameterDescriptor), false, listOf(), scope)
}
override fun getDelegate(): KotlinType = delegateType
@@ -93,7 +95,8 @@ class CapturedType(
override fun toString() = "Captured($typeProjection)"
}
fun createCapturedType(typeProjection: TypeProjection): KotlinType = CapturedType(typeProjection)
fun createCapturedType(typeProjection: TypeProjection, typeParameterDescriptor: TypeParameterDescriptor): KotlinType
= CapturedType(typeProjection, typeParameterDescriptor)
fun KotlinType.isCaptured(): Boolean = constructor is CapturedTypeConstructor
@@ -125,5 +128,5 @@ private fun TypeProjection.createCapturedIfNeeded(typeParameterDescriptor: TypeP
TypeProjectionImpl(this@createCapturedIfNeeded.type)
}
return TypeProjectionImpl(createCapturedType(this))
return TypeProjectionImpl(createCapturedType(this, typeParameterDescriptor))
}