From 89dfd52363d6d277da4b9b56b735d22e76f31e73 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 30 Oct 2015 19:45:56 +0300 Subject: [PATCH] Remove ConstraintSystem.partialSubstitutor, move logic to FuzzyType --- .../calls/inference/ConstraintSystem.kt | 5 --- .../calls/inference/ConstraintSystemImpl.kt | 31 ++++++------------- .../jetbrains/kotlin/idea/util/FuzzyType.kt | 14 ++++++--- 3 files changed, 20 insertions(+), 30 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystem.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystem.kt index 76eaf6ad063..571eb610320 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystem.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystem.kt @@ -54,11 +54,6 @@ interface ConstraintSystem { */ val currentSubstitutor: TypeSubstitutor - /** - * Returns the substitution only for type parameters that have result values, otherwise returns the type parameter itself. - */ - val partialSubstitutor: TypeSubstitutor - fun getNestedTypeVariables(type: KotlinType): List fun toBuilder(filterConstraintPosition: (ConstraintPosition) -> Boolean = { true }): Builder diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemImpl.kt index ad9b09a0777..453efc34f18 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemImpl.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.resolve.calls.inference import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor -import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilderImpl.ConstraintKind.EQUAL import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilderImpl.ConstraintKind.SUB_TYPE import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPosition @@ -25,7 +24,6 @@ import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.Constrain import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.TYPE_BOUND_POSITION import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.derivedFrom import org.jetbrains.kotlin.resolve.descriptorUtil.hasOnlyInputTypesAnnotation -import org.jetbrains.kotlin.resolve.scopes.KtScope import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.TypeUtils.DONT_CARE import org.jetbrains.kotlin.types.checker.KotlinTypeChecker @@ -84,27 +82,23 @@ class ConstraintSystemImpl( private fun getParameterToInferredValueMap( typeParameterBounds: Map, - getDefaultTypeProjection: (TypeParameterDescriptor) -> TypeProjection, + getDefaultType: (TypeParameterDescriptor) -> KotlinType, substituteOriginal: Boolean ): Map { val substitutionContext = HashMap() for ((variable, typeBounds) in typeParameterBounds) { - val typeProjection: TypeProjection val value = typeBounds.value val typeParameter = if (substituteOriginal) variablesToOriginal[variable]!! else variable - if (value != null && !TypeUtils.containsSpecialType(value, DONT_CARE)) { - typeProjection = TypeProjectionImpl(value) - } - else { - typeProjection = getDefaultTypeProjection(typeParameter) - } - substitutionContext.put(typeParameter, typeProjection) + val type = + if (value != null && !TypeUtils.containsSpecialType(value, DONT_CARE)) value + else getDefaultType(typeParameter) + substitutionContext.put(typeParameter, TypeProjectionImpl(type)) } return substitutionContext } private fun replaceUninferredBy( - getDefaultValue: (TypeParameterDescriptor) -> TypeProjection, + getDefaultValue: (TypeParameterDescriptor) -> KotlinType, substituteOriginal: Boolean ): TypeSubstitutor { val parameterToInferredValueMap = getParameterToInferredValueMap(allTypeParameterBounds, getDefaultValue, substituteOriginal) @@ -131,22 +125,17 @@ class ConstraintSystemImpl( } override val resultingSubstitutor: TypeSubstitutor - get() = getSubstitutor(substituteOriginal = true) { TypeProjectionImpl(ErrorUtils.createUninferredParameterType(it)) } + get() = getSubstitutor(substituteOriginal = true) { ErrorUtils.createUninferredParameterType(it) } override val currentSubstitutor: TypeSubstitutor - get() = getSubstitutor(substituteOriginal = true) { TypeProjectionImpl(TypeUtils.DONT_CARE) } + get() = getSubstitutor(substituteOriginal = true) { TypeUtils.DONT_CARE } - override val partialSubstitutor: TypeSubstitutor - get() = getSubstitutor(substituteOriginal = true) { - TypeProjectionImpl(KotlinTypeImpl.create(Annotations.EMPTY, it.typeConstructor, false, listOf(), KtScope.Empty)) - } - - private fun getSubstitutor(substituteOriginal: Boolean, getDefaultValue: (TypeParameterDescriptor) -> TypeProjection) = + private fun getSubstitutor(substituteOriginal: Boolean, getDefaultValue: (TypeParameterDescriptor) -> KotlinType) = replaceUninferredBy(getDefaultValue, substituteOriginal).setApproximateCapturedTypes() private fun satisfyInitialConstraints(): Boolean { fun KotlinType.substitute(): KotlinType? { - val substitutor = getSubstitutor(substituteOriginal = false) { TypeProjectionImpl(ErrorUtils.createUninferredParameterType(it)) } + val substitutor = getSubstitutor(substituteOriginal = false) { ErrorUtils.createUninferredParameterType(it) } return substitutor.substitute(this, Variance.INVARIANT) ?: return null } return initialConstraints.all { diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/FuzzyType.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/FuzzyType.kt index e61881d25b0..dde6b666af3 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/FuzzyType.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/FuzzyType.kt @@ -22,9 +22,7 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilderImpl import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind -import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.TypeSubstitutor -import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.typeUtil.* import java.util.* @@ -138,6 +136,14 @@ class FuzzyType( if (substitutedType.isError) return null val otherSubstitutedType = substitutor.substitute(otherType.type, Variance.INVARIANT) ?: return null if (otherSubstitutedType.isError) return null - return if (substitutedType.checkInheritance(otherSubstitutedType)) constraintSystem.partialSubstitutor else null + if (!substitutedType.checkInheritance(otherSubstitutedType)) return null + + val substitution = constraintSystem.typeVariables.toMap({ it.typeConstructor }) { + val type = it.defaultType + val solution = substitutor.substitute(type, Variance.INVARIANT) + TypeProjectionImpl(if (solution != null && !ErrorUtils.containsUninferredParameter(solution)) solution else type) + } + + return TypeSubstitutor.create(TypeConstructorSubstitution.createByConstructorsMap(substitution)) } }