diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/BuilderInferenceSession.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/BuilderInferenceSession.kt index cb7ea5d2af5..9f1a97fc7a0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/BuilderInferenceSession.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/BuilderInferenceSession.kt @@ -63,7 +63,7 @@ class BuilderInferenceSession( private var nestedBuilderInferenceSessions: MutableSet = mutableSetOf() private lateinit var lambda: ResolvedLambdaAtom - private val commonSystem = NewConstraintSystemImpl(callComponents.constraintInjector, builtIns) + private val commonSystem = NewConstraintSystemImpl(callComponents.constraintInjector, builtIns, callComponents.kotlinTypeRefiner) init { if (topLevelCallContext.inferenceSession is BuilderInferenceSession) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl.kt index f1f62a92921..302c3be020a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl.kt @@ -40,12 +40,15 @@ import org.jetbrains.kotlin.resolve.calls.model.SimpleKotlinCallArgument import org.jetbrains.kotlin.resolve.calls.results.SimpleConstraintSystem import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.KotlinTypeRefinerImpl import org.jetbrains.kotlin.types.TypeIntersector +import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.utils.addToStdlib.safeAs class KotlinResolutionStatelessCallbacksImpl( private val deprecationResolver: DeprecationResolver, private val languageVersionSettings: LanguageVersionSettings, + private val kotlinTypeRefiner: KotlinTypeRefiner ) : KotlinResolutionStatelessCallbacks { override fun isDescriptorFromSource(descriptor: CallableDescriptor) = DescriptorToSourceUtils.descriptorToDeclaration(descriptor) != null @@ -107,10 +110,10 @@ class KotlinResolutionStatelessCallbacksImpl( } override fun createConstraintSystemForOverloadResolution( - constraintInjector: ConstraintInjector, builtIns: KotlinBuiltIns, + constraintInjector: ConstraintInjector, builtIns: KotlinBuiltIns ): SimpleConstraintSystem { return if (languageVersionSettings.getFlag(AnalysisFlags.constraintSystemForOverloadResolution).forNewInference()) - SimpleConstraintSystemImpl(constraintInjector, builtIns) + SimpleConstraintSystemImpl(constraintInjector, builtIns, kotlinTypeRefiner) else ConstraintSystemBuilderImpl.forSpecificity() } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ManyCandidatesResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ManyCandidatesResolver.kt index 53d9c1c9937..946b7f25e28 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ManyCandidatesResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ManyCandidatesResolver.kt @@ -109,7 +109,7 @@ abstract class ManyCandidatesResolver( for (callInfo in listOf(goodCandidate, badCandidate)) { val atomsToAnalyze = mutableListOf(callInfo.callResolutionResult) - val system = NewConstraintSystemImpl(callComponents.constraintInjector, builtIns).apply { + val system = NewConstraintSystemImpl(callComponents.constraintInjector, builtIns, callComponents.kotlinTypeRefiner).apply { addOtherSystem(callInfo.callResolutionResult.constraintSystem) /* * This is needed for very stupid case, when we have some delegate with good `getValue` and bad `setValue` that @@ -144,7 +144,7 @@ abstract class ManyCandidatesResolver( ) } } else { - val commonSystem = NewConstraintSystemImpl(callComponents.constraintInjector, builtIns).apply { + val commonSystem = NewConstraintSystemImpl(callComponents.constraintInjector, builtIns, callComponents.kotlinTypeRefiner).apply { addOtherSystem(currentConstraintSystem()) } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ClassicTypeSystemContextForCS.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ClassicTypeSystemContextForCS.kt index 419ba7b9660..c9978a8a7ad 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ClassicTypeSystemContextForCS.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ClassicTypeSystemContextForCS.kt @@ -16,13 +16,14 @@ import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImp import org.jetbrains.kotlin.resolve.calls.inference.model.NewTypeVariable import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableTypeConstructor import org.jetbrains.kotlin.types.* -import org.jetbrains.kotlin.types.checker.ClassicTypeSystemContext -import org.jetbrains.kotlin.types.checker.NewCapturedType -import org.jetbrains.kotlin.types.checker.NewCapturedTypeConstructor +import org.jetbrains.kotlin.types.checker.* import org.jetbrains.kotlin.types.model.* import org.jetbrains.kotlin.utils.addToStdlib.cast -class ClassicTypeSystemContextForCS(override val builtIns: KotlinBuiltIns) : TypeSystemInferenceExtensionContextDelegate, +class ClassicTypeSystemContextForCS( + override val builtIns: KotlinBuiltIns, + val kotlinTypeRefiner: KotlinTypeRefiner +) : TypeSystemInferenceExtensionContextDelegate, ClassicTypeSystemContext, BuiltInsProvider { @@ -97,6 +98,15 @@ class ClassicTypeSystemContextForCS(override val builtIns: KotlinBuiltIns) : Typ require(this is TypeVariableTypeConstructor) return isContainedInInvariantOrContravariantPositions } + + override fun newTypeCheckerState(errorTypesEqualToAnything: Boolean, stubTypesEqualToAnything: Boolean): TypeCheckerState { + return createClassicTypeCheckerState( + errorTypesEqualToAnything, + stubTypesEqualToAnything, + typeSystemContext = this, + kotlinTypeRefiner = kotlinTypeRefiner + ) + } } @@ -109,7 +119,8 @@ private inline fun Any?.errorMessage(): String { @Suppress("FunctionName") fun NewConstraintSystemImpl( constraintInjector: ConstraintInjector, - builtIns: KotlinBuiltIns + builtIns: KotlinBuiltIns, + kotlinTypeRefiner: KotlinTypeRefiner ): NewConstraintSystemImpl { - return NewConstraintSystemImpl(constraintInjector, ClassicTypeSystemContextForCS(builtIns)) + return NewConstraintSystemImpl(constraintInjector, ClassicTypeSystemContextForCS(builtIns, kotlinTypeRefiner)) } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/SimpleConstraintSystemImpl.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/SimpleConstraintSystemImpl.kt index fbe6cf68285..b42882159db 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/SimpleConstraintSystemImpl.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/SimpleConstraintSystemImpl.kt @@ -26,11 +26,16 @@ import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableFromCallab import org.jetbrains.kotlin.resolve.calls.inference.substitute import org.jetbrains.kotlin.resolve.calls.results.SimpleConstraintSystem import org.jetbrains.kotlin.types.TypeConstructorSubstitution +import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.types.model.* import org.jetbrains.kotlin.types.typeUtil.asTypeProjection -class SimpleConstraintSystemImpl(constraintInjector: ConstraintInjector, builtIns: KotlinBuiltIns) : SimpleConstraintSystem { - val system = NewConstraintSystemImpl(constraintInjector, ClassicTypeSystemContextForCS(builtIns)) +class SimpleConstraintSystemImpl( + constraintInjector: ConstraintInjector, + builtIns: KotlinBuiltIns, + kotlinTypeRefiner: KotlinTypeRefiner +) : SimpleConstraintSystem { + val system = NewConstraintSystemImpl(constraintInjector, ClassicTypeSystemContextForCS(builtIns, kotlinTypeRefiner)) val csBuilder: ConstraintSystemBuilder = system.getBuilder() diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt index dd371b1c5f0..9a6e2926484 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.resolve.sam.SamConversionResolver import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValueWithSmartCastInfo import org.jetbrains.kotlin.types.ErrorUtils import org.jetbrains.kotlin.types.TypeSubstitutor +import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker import org.jetbrains.kotlin.types.isDynamic @@ -49,7 +50,8 @@ class KotlinCallComponents( val samConversionOracle: SamConversionOracle, val samConversionResolver: SamConversionResolver, val kotlinTypeChecker: NewKotlinTypeChecker, - val lookupTracker: LookupTracker + val lookupTracker: LookupTracker, + val kotlinTypeRefiner: KotlinTypeRefiner, ) class SimpleCandidateFactory( @@ -64,7 +66,7 @@ class SimpleCandidateFactory( val baseSystem: ConstraintStorage init { - val baseSystem = NewConstraintSystemImpl(callComponents.constraintInjector, callComponents.builtIns) + val baseSystem = NewConstraintSystemImpl(callComponents.constraintInjector, callComponents.builtIns, callComponents.kotlinTypeRefiner) if (!inferenceSession.resolveReceiverIndependently()) { baseSystem.addSubsystemFromArgument(kotlinCall.explicitReceiver) baseSystem.addSubsystemFromArgument(kotlinCall.dispatchReceiverForInvokeExtension) @@ -243,4 +245,3 @@ class GivenCandidate( val dispatchReceiver: ReceiverValueWithSmartCastInfo?, val knownTypeParametersResultingSubstitutor: TypeSubstitutor? ) - diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidate.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidate.kt index 48c507415a5..f47c2dc136b 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidate.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidate.kt @@ -92,7 +92,7 @@ class KotlinResolutionCandidate( fun getSystem(): NewConstraintSystem { if (newSystem == null) { - newSystem = NewConstraintSystemImpl(callComponents.constraintInjector, callComponents.builtIns) + newSystem = NewConstraintSystemImpl(callComponents.constraintInjector, callComponents.builtIns, callComponents.kotlinTypeRefiner) newSystem!!.addOtherSystem(baseSystem) } return newSystem!! diff --git a/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt b/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt index 88df5fa71e7..7c69cda3b89 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt @@ -20,11 +20,15 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.resolve.calls.components.ClassicTypeSystemContextForCS +import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner class TypeApproximator( builtIns: KotlinBuiltIns, languageVersionSettings: LanguageVersionSettings, -) : AbstractTypeApproximator(ClassicTypeSystemContextForCS(builtIns), languageVersionSettings) { +) : AbstractTypeApproximator( + ClassicTypeSystemContextForCS(builtIns, KotlinTypeRefiner.Default), + languageVersionSettings +) { fun approximateDeclarationType(baseType: KotlinType, local: Boolean): UnwrappedType { if (!languageVersionSettings.supportsFeature(LanguageFeature.NewInference)) return baseType.unwrap() @@ -42,4 +46,3 @@ class TypeApproximator( fun approximateToSubType(type: UnwrappedType, conf: TypeApproximatorConfiguration): UnwrappedType? = super.approximateToSubType(type, conf) as UnwrappedType? } -