Rollback parameter descriptor propagation to CapturedTypeConstructor

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