From 9add14a2a19fd205ab16191c8fd8f08125369fbe Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 11 Jun 2019 12:10:07 +0300 Subject: [PATCH] [API Usage] Add refinement to ConstraintInjector (NI) --- .../kotlin/fir/resolve/calls/InferenceUtil.kt | 3 ++- .../components/ConstraintInjector.kt | 23 +++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/InferenceUtil.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/InferenceUtil.kt index 15c4b57a423..3366f9f2443 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/InferenceUtil.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/InferenceUtil.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.components.ResultTypeResolve import org.jetbrains.kotlin.resolve.calls.inference.components.TrivialConstraintTypeInferenceOracle import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl import org.jetbrains.kotlin.types.AbstractTypeApproximator +import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.types.model.SimpleTypeMarker import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContextDelegate import org.jetbrains.kotlin.types.model.TypeVariableMarker @@ -66,7 +67,7 @@ class InferenceComponents( } val trivialConstraintTypeInferenceOracle = TrivialConstraintTypeInferenceOracle(ctx) private val incorporator = ConstraintIncorporator(approximator, trivialConstraintTypeInferenceOracle) - private val injector = ConstraintInjector(incorporator, approximator) + private val injector = ConstraintInjector(incorporator, approximator, KotlinTypeRefiner.Default) val resultTypeResolver = ResultTypeResolver(approximator, trivialConstraintTypeInferenceOracle) fun createConstraintSystem(): NewConstraintSystemImpl { 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 fe1b27d0625..3ca8d614692 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 @@ -21,15 +21,18 @@ import org.jetbrains.kotlin.resolve.calls.inference.model.* import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind.LOWER import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind.UPPER import org.jetbrains.kotlin.resolve.calls.model.KotlinCallDiagnostic -import org.jetbrains.kotlin.types.AbstractTypeApproximator -import org.jetbrains.kotlin.types.AbstractTypeChecker -import org.jetbrains.kotlin.types.AbstractTypeCheckerContext -import org.jetbrains.kotlin.types.TypeApproximatorConfiguration +import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.types.model.* +import org.jetbrains.kotlin.types.refinement.TypeRefinement import java.util.* import kotlin.math.max -class ConstraintInjector(val constraintIncorporator: ConstraintIncorporator, val typeApproximator: AbstractTypeApproximator) { +class ConstraintInjector( + val constraintIncorporator: ConstraintIncorporator, + val typeApproximator: AbstractTypeApproximator, + val kotlinTypeRefiner: KotlinTypeRefiner +) { private val ALLOWED_DEPTH_DELTA_FOR_INCORPORATION = 1 interface Context : TypeSystemInferenceExtensionContext { @@ -137,10 +140,20 @@ class ConstraintInjector(val constraintIncorporator: ConstraintIncorporator, val return baseContext.prepareType(type) } + @UseExperimental(TypeRefinement::class) + override fun refineType(type: KotlinTypeMarker): KotlinTypeMarker { + return if (type is KotlinType) { + kotlinTypeRefiner.refineType(type) + } else { + type + } + } + fun runIsSubtypeOf(lowerType: KotlinTypeMarker, upperType: KotlinTypeMarker) { if (!AbstractTypeChecker.isSubtypeOf(this@TypeCheckerContext as AbstractTypeCheckerContext, lowerType, upperType)) { // todo improve error reporting -- add information about base types c.addError(NewConstraintError(lowerType, upperType, position)) + AbstractTypeChecker.isSubtypeOf(this@TypeCheckerContext as AbstractTypeCheckerContext, lowerType, upperType) } }