From fd1305c3694da3bf16eeb4f28248381bb544571d Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Wed, 15 Jan 2020 17:41:44 +0300 Subject: [PATCH] [NI] Refactor OnlyInputType annotation check Hold position consumed during incorporation in Constraint instead of ConstraintPosition. --- .../inference/components/ConstraintIncorporator.kt | 4 ++-- .../inference/components/ConstraintInjector.kt | 13 +++++-------- .../inference/model/ConstraintPositionAndErrors.kt | 2 -- .../calls/inference/model/ConstraintStorage.kt | 3 ++- .../inference/model/MutableConstraintStorage.kt | 9 +-------- 5 files changed, 10 insertions(+), 21 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintIncorporator.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintIncorporator.kt index ff36dbbed62..9b5260809c7 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintIncorporator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintIncorporator.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.model.* import org.jetbrains.kotlin.utils.SmartSet import org.jetbrains.kotlin.utils.addIfNotNull +import org.jetbrains.kotlin.utils.addToStdlib.safeAs import java.util.* // todo problem: intersection types in constrains: A <: Number, B <: Inv =>? B <: Inv @@ -172,8 +173,7 @@ class ConstraintIncorporator( val kind = if (isSubtype) ConstraintKind.LOWER else ConstraintKind.UPPER - val inputTypePosition = if (baseConstraint.position.from is OnlyInputTypeConstraintPosition) - baseConstraint.position else null + val inputTypePosition = baseConstraint.position.from.safeAs() val isNullabilityConstraint = isUsefulForNullabilityConstraint && newConstraint.isNullableNothing() val constraintContext = ConstraintContext(kind, derivedFrom, inputTypePosition, isNullabilityConstraint) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt index 0d15a3dd49d..a00f5e5e491 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt @@ -70,7 +70,7 @@ class ConstraintInjector( incorporatePosition: IncorporationConstraintPosition ) { val possibleNewConstraints = Stack>() - val typeCheckerContext = TypeCheckerContext(c, incorporatePosition, lowerType, upperType, possibleNewConstraints, mutableSetOf()) + val typeCheckerContext = TypeCheckerContext(c, incorporatePosition, lowerType, upperType, possibleNewConstraints) typeCheckerContext.runIsSubtypeOf(lowerType, upperType) while (possibleNewConstraints.isNotEmpty()) { @@ -85,8 +85,6 @@ class ConstraintInjector( constraintIncorporator.incorporate(typeCheckerContext, typeVariable, it) } } - - incorporatePosition.inputTypePositions = typeCheckerContext.preservedInputTypePositions } private fun updateAllowedTypeDepth(c: Context, initialType: KotlinTypeMarker) = with(c) { @@ -122,8 +120,7 @@ class ConstraintInjector( val position: IncorporationConstraintPosition, val baseLowerType: KotlinTypeMarker, val baseUpperType: KotlinTypeMarker, - val possibleNewConstraints: MutableList>, - val preservedInputTypePositions: MutableSet + val possibleNewConstraints: MutableList> ) : AbstractTypeCheckerContextForConstraintSystem(), ConstraintIncorporator.Context, TypeSystemInferenceExtensionContext by c { val baseContext: AbstractTypeCheckerContext = newBaseTypeCheckerContext(isErrorTypeEqualsToAnything, isStubTypeEqualsToAnything) @@ -234,10 +231,10 @@ class ConstraintInjector( val newConstraint = Constraint( kind, targetType, position, derivedFrom = derivedFrom, - isNullabilityConstraint = isNullabilityConstraint + isNullabilityConstraint = isNullabilityConstraint, + inputTypePositionBeforeIncorporation = inputTypePosition ) possibleNewConstraints.add(typeVariable to newConstraint) - inputTypePosition?.let { preservedInputTypePositions.add(it) } } override val allTypeVariablesWithConstraints: Collection @@ -269,6 +266,6 @@ class ConstraintInjector( data class ConstraintContext( val kind: ConstraintKind, val derivedFrom: Set, - val inputTypePosition: ConstraintPosition? = null, + val inputTypePositionBeforeIncorporation: OnlyInputTypeConstraintPosition? = null, val isNullabilityConstraint: Boolean ) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintPositionAndErrors.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintPositionAndErrors.kt index 1654e4b0f0a..ea0861043f0 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintPositionAndErrors.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintPositionAndErrors.kt @@ -86,8 +86,6 @@ class IncorporationConstraintPosition( val from: ConstraintPosition, val initialConstraint: InitialConstraint ) : ConstraintPosition() { - lateinit var inputTypePositions: Set - override fun toString() = "Incorporate $initialConstraint from position $from" } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintStorage.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintStorage.kt index 998afc527f4..161f3bd2da2 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintStorage.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintStorage.kt @@ -69,7 +69,8 @@ class Constraint( val position: IncorporationConstraintPosition, val typeHashCode: Int = type.hashCode(), val derivedFrom: Set, - val isNullabilityConstraint: Boolean + val isNullabilityConstraint: Boolean, + val inputTypePositionBeforeIncorporation: OnlyInputTypeConstraintPosition? = null ) { override fun equals(other: Any?): Boolean { if (this === other) return true diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/MutableConstraintStorage.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/MutableConstraintStorage.kt index 5e65ed3b553..49026b11e99 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/MutableConstraintStorage.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/MutableConstraintStorage.kt @@ -33,16 +33,9 @@ class MutableVariableWithConstraints( // see @OnlyInputTypes annotation val projectedInputCallTypes: Collection get() = mutableConstraints - .filter { it.position.isInputTypePosition } + .filter { it.position.from is OnlyInputTypeConstraintPosition || it.inputTypePositionBeforeIncorporation != null } .map { (it.type as KotlinType).unCapture().unwrap() } - private val ConstraintPosition?.isInputTypePosition: Boolean - get() = when (this) { - is OnlyInputTypeConstraintPosition -> true - !is IncorporationConstraintPosition -> false - else -> from.isInputTypePosition || inputTypePositions.any { it.isInputTypePosition } - } - private val mutableConstraints = ArrayList(constraints) private var simplifiedConstraints: List? = null