[API Usage] Add refinement to ConstraintInjector (NI)

This commit is contained in:
Dmitriy Novozhilov
2019-06-11 12:10:07 +03:00
committed by Dmitry Savvinov
parent 6c44b6b859
commit 9add14a2a1
2 changed files with 20 additions and 6 deletions
@@ -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 {
@@ -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)
}
}