diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/GenericCandidateResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/GenericCandidateResolver.kt index db9cf3bc4e6..35b738a95f4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/GenericCandidateResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/GenericCandidateResolver.kt @@ -48,9 +48,7 @@ import org.jetbrains.kotlin.types.TypeUtils.DONT_CARE import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils -class GenericCandidateResolver( - private val argumentTypeResolver: ArgumentTypeResolver -) { +class GenericCandidateResolver(private val argumentTypeResolver: ArgumentTypeResolver) { fun inferTypeArguments(context: CallCandidateResolutionContext): ResolutionStatus { val candidateCall = context.candidateCall val candidate = candidateCall.candidateDescriptor @@ -67,7 +65,7 @@ class GenericCandidateResolver( val candidateWithFreshVariables = FunctionDescriptorUtil.alphaConvertTypeParameters(candidate) val conversionToOriginal = candidateWithFreshVariables.typeParameters.zip(candidate.typeParameters).toMap() - constraintSystem.registerTypeVariables(candidateWithFreshVariables.typeParameters, { Variance.INVARIANT }, { conversionToOriginal[it]!! }) + constraintSystem.registerTypeVariables(candidateWithFreshVariables.typeParameters, { conversionToOriginal[it]!! }) val substituteDontCare = makeConstantSubstitutor(candidate.typeParameters, DONT_CARE) @@ -166,7 +164,7 @@ class GenericCandidateResolver( val conversion = candidateDescriptor.typeParameters.zip(candidateWithFreshVariables.typeParameters).toMap() val freshVariables = nestedTypeVariables.map { conversion[it] }.filterNotNull() - constraintSystem.registerTypeVariables(freshVariables, { Variance.INVARIANT }, { it }, external = true) + constraintSystem.registerTypeVariables(freshVariables, external = true) constraintSystem.addSubtypeConstraint(candidateWithFreshVariables.returnType, effectiveExpectedType, constraintPosition) return true 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 93586b34367..09603e4f607 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 @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPosition import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeSubstitutor -import org.jetbrains.kotlin.types.Variance public interface ConstraintSystem { /** @@ -29,8 +28,7 @@ public interface ConstraintSystem { */ public fun registerTypeVariables( typeVariables: Collection, - variance: (TypeParameterDescriptor) -> Variance, - mapToOriginal: (TypeParameterDescriptor) -> TypeParameterDescriptor, + mapToOriginal: (TypeParameterDescriptor) -> TypeParameterDescriptor = { it }, external: Boolean = false ) 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 d03fde2417f..56e5aaa10f5 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 @@ -142,14 +142,13 @@ public class ConstraintSystemImpl : ConstraintSystem { override fun registerTypeVariables( typeVariables: Collection, - variance: (TypeParameterDescriptor) -> Variance, mapToOriginal: (TypeParameterDescriptor) -> TypeParameterDescriptor, external: Boolean ) { if (external) externalTypeParameters.addAll(typeVariables) for (typeVariable in typeVariables) { - allTypeParameterBounds.put(typeVariable, TypeBoundsImpl(typeVariable, variance(typeVariable))) + allTypeParameterBounds.put(typeVariable, TypeBoundsImpl(typeVariable)) val original = mapToOriginal(typeVariable) originalToVariables[original] = typeVariable variablesToOriginal[typeVariable] = original @@ -555,17 +554,6 @@ class SubstitutionFilteringInternalResolveAnnotations(substitution: TypeSubstitu } } -public fun ConstraintSystemImpl.registerTypeVariables(typeVariables: Map) { - registerTypeVariables(typeVariables.keySet(), { typeVariables[it]!! }, { it }) -} - -public fun ConstraintSystemImpl.registerTypeVariables( - typeVariables: Collection, - variance: (TypeParameterDescriptor) -> Variance -) { - registerTypeVariables(typeVariables, variance, { it }) -} - public fun createTypeSubstitutor(conversion: (TypeParameterDescriptor) -> TypeParameterDescriptor?): TypeSubstitutor { return TypeSubstitutor.create(object : TypeConstructorSubstitution() { override fun get(key: TypeConstructor): TypeProjection? { @@ -577,4 +565,4 @@ public fun createTypeSubstitutor(conversion: (TypeParameterDescriptor) -> TypePa return TypeProjectionImpl(type) } }) -} \ No newline at end of file +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/TypeBounds.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/TypeBounds.kt index 5e4a6603935..ffd214287fe 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/TypeBounds.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/TypeBounds.kt @@ -23,17 +23,14 @@ import org.jetbrains.kotlin.resolve.calls.inference.TypeBounds.BoundKind.LOWER_B import org.jetbrains.kotlin.resolve.calls.inference.TypeBounds.BoundKind.UPPER_BOUND import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPosition import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.Variance public interface TypeBounds { - public val varianceOfPosition: Variance - public val typeVariable: TypeParameterDescriptor public val bounds: Collection public val value: KotlinType? - get() = if (values.size() == 1) values.first() else null + get() = if (values.size == 1) values.first() else null public val values: Collection diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/TypeBoundsImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/TypeBoundsImpl.kt index 8b98681f615..4e19ea1fd17 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/TypeBoundsImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/TypeBoundsImpl.kt @@ -28,10 +28,7 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.utils.addIfNotNull import java.util.* -public class TypeBoundsImpl( - override val typeVariable: TypeParameterDescriptor, - override val varianceOfPosition: Variance -) : TypeBounds { +public class TypeBoundsImpl(override val typeVariable: TypeParameterDescriptor) : TypeBounds { override val bounds = ArrayList() private var resultValues: Collection? = null @@ -67,7 +64,7 @@ public class TypeBoundsImpl( } public fun filter(condition: (ConstraintPosition) -> Boolean): TypeBoundsImpl { - val result = TypeBoundsImpl(typeVariable, varianceOfPosition) + val result = TypeBoundsImpl(typeVariable) result.bounds.addAll(bounds.filter { condition(it.position) }) return result } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/TypeIntersector.java b/compiler/frontend/src/org/jetbrains/kotlin/types/TypeIntersector.java index 3fe6c4884ee..5b515ac1bf7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/TypeIntersector.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/TypeIntersector.java @@ -32,7 +32,6 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker; import java.util.*; -import static org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemImplKt.registerTypeVariables; import static org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.SPECIAL; import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getBuiltIns; @@ -186,7 +185,12 @@ public class TypeIntersector { processAllTypeParameters(withParameters, Variance.INVARIANT, processor); processAllTypeParameters(expected, Variance.INVARIANT, processor); ConstraintSystemImpl constraintSystem = new ConstraintSystemImpl(); - registerTypeVariables(constraintSystem, parameters); + constraintSystem.registerTypeVariables(parameters.keySet(), new Function1() { + @Override + public TypeParameterDescriptor invoke(TypeParameterDescriptor descriptor) { + return descriptor; + } + }, false); constraintSystem.addSubtypeConstraint(withParameters, expected, SPECIAL.position()); return constraintSystem.getStatus().isSuccessful(); diff --git a/compiler/tests/org/jetbrains/kotlin/resolve/constraintSystem/AbstractConstraintSystemTest.kt b/compiler/tests/org/jetbrains/kotlin/resolve/constraintSystem/AbstractConstraintSystemTest.kt index 813e3541de8..868cb8b3bf4 100644 --- a/compiler/tests/org/jetbrains/kotlin/resolve/constraintSystem/AbstractConstraintSystemTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/resolve/constraintSystem/AbstractConstraintSystemTest.kt @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.resolve.TypeResolver import org.jetbrains.kotlin.resolve.calls.inference.ConstraintContext import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemImpl import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.SPECIAL -import org.jetbrains.kotlin.resolve.calls.inference.registerTypeVariables import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil import org.jetbrains.kotlin.test.ConfigurationKind import org.jetbrains.kotlin.test.KotlinLiteFixture @@ -33,7 +32,6 @@ import org.jetbrains.kotlin.types.ErrorUtils import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.Variance import java.io.File -import java.util.ArrayList abstract public class AbstractConstraintSystemTest() : KotlinLiteFixture() { @@ -83,7 +81,7 @@ abstract public class AbstractConstraintSystemTest() : KotlinLiteFixture() { val variables = parseVariables(constraintsFileText) val fixVariables = constraintsFileText.contains("FIX_VARIABLES") val typeParameterDescriptors = variables.map { testDeclarations.getParameterDescriptor(it) } - constraintSystem.registerTypeVariables(typeParameterDescriptors, { Variance.INVARIANT }) + constraintSystem.registerTypeVariables(typeParameterDescriptors) val constraints = parseConstraints(constraintsFileText) fun KotlinType.assertNotError(): KotlinType { 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 135a39de1f5..1c3d4d636fc 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,7 +22,6 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemImpl import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind -import org.jetbrains.kotlin.resolve.calls.inference.registerTypeVariables import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.Variance @@ -118,8 +117,8 @@ class FuzzyType( } val constraintSystem = ConstraintSystemImpl() - constraintSystem.registerTypeVariables(freeParameters, { Variance.INVARIANT }) - constraintSystem.registerTypeVariables(otherType.freeParameters, { Variance.INVARIANT }) + constraintSystem.registerTypeVariables(freeParameters) + constraintSystem.registerTypeVariables(otherType.freeParameters) when (matchKind) { MatchKind.IS_SUBTYPE -> constraintSystem.addSubtypeConstraint(type, otherType.type, ConstraintPositionKind.RECEIVER_POSITION.position())