From 833cdb0706640dbf537a1a40e9ee71c34cf69449 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Tue, 5 Jan 2016 12:47:31 +0300 Subject: [PATCH] TypeParameterDescriptor propagation to CapturedTypeConstructor --- .../inference/ConstraintSystemBuilderImpl.kt | 2 +- .../calls/inference/constraintIncorporation.kt | 4 ++-- .../CapturedTypeApproximationTest.kt | 2 +- .../calls/inference/CapturedTypeConstructor.kt | 15 +++++++++------ 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilderImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilderImpl.kt index c8295ad38e1..3fa6ecf1dc5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilderImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilderImpl.kt @@ -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) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/constraintIncorporation.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/constraintIncorporation.kt index 07b1b8385c7..5fcf63b46ed 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/constraintIncorporation.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/constraintIncorporation.kt @@ -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) diff --git a/compiler/tests/org/jetbrains/kotlin/resolve/typeApproximation/CapturedTypeApproximationTest.kt b/compiler/tests/org/jetbrains/kotlin/resolve/typeApproximation/CapturedTypeApproximationTest.kt index e7d709f2827..60705758825 100644 --- a/compiler/tests/org/jetbrains/kotlin/resolve/typeApproximation/CapturedTypeApproximationTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/resolve/typeApproximation/CapturedTypeApproximationTest.kt @@ -84,7 +84,7 @@ class CapturedTypeApproximationTest() : KotlinLiteFixture() { fun createTestSubstitutor(testSubstitution: Map): 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) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor.kt index 844c7e283aa..fec8fc34428 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor.kt @@ -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)) }