diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt index 2e992bec087..01e62242d8b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt @@ -157,7 +157,7 @@ class CoroutineInferenceSession( private fun updateCalls(lambda: ResolvedLambdaAtom, commonSystem: NewConstraintSystemImpl) { val nonFixedToVariablesSubstitutor = createNonFixedTypeToVariableSubstitutor() - val commonSystemSubstitutor = commonSystem.buildCurrentSubstitutor() + val commonSystemSubstitutor = commonSystem.buildCurrentSubstitutor() as NewTypeSubstitutor val nonFixedTypesToResult = nonFixedToVariablesSubstitutor.map.mapValues { commonSystemSubstitutor.safeSubstitute(it.value) } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt index 9c2f53206fa..9a009a88ab7 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemOperation import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintInjector +import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor import org.jetbrains.kotlin.resolve.calls.inference.components.SimpleConstraintSystemImpl import org.jetbrains.kotlin.resolve.calls.model.* import org.jetbrains.kotlin.resolve.calls.results.FlatSignature @@ -68,7 +69,7 @@ class CallableReferenceResolver( diagnosticsHolder: KotlinDiagnosticsHolder ) { val argument = resolvedAtom.atom - val expectedType = resolvedAtom.expectedType?.let { csBuilder.buildCurrentSubstitutor().safeSubstitute(it) } + val expectedType = resolvedAtom.expectedType?.let { (csBuilder.buildCurrentSubstitutor() as NewTypeSubstitutor).safeSubstitute(it) } val scopeTower = callComponents.statelessCallbacks.getScopeTowerForCallableReferenceArgument(argument) val candidates = runRHSResolution(scopeTower, argument, expectedType) { checkCallableReference -> diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponeArgumentsChecks.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponeArgumentsChecks.kt index c7f9b7ae916..d23ffd97890 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponeArgumentsChecks.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponeArgumentsChecks.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.calls.components import org.jetbrains.kotlin.builtins.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder +import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor import org.jetbrains.kotlin.resolve.calls.inference.model.ArgumentConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.LHSArgumentConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableForLambdaReturnType @@ -140,7 +141,7 @@ private fun extractLambdaParameters(expectedType: UnwrappedType, argument: Lambd } fun LambdaWithTypeVariableAsExpectedTypeAtom.transformToResolvedLambda(csBuilder: ConstraintSystemBuilder): ResolvedLambdaAtom { - val fixedExpectedType = csBuilder.buildCurrentSubstitutor().safeSubstitute(expectedType) + val fixedExpectedType = (csBuilder.buildCurrentSubstitutor() as NewTypeSubstitutor).safeSubstitute(expectedType) val resolvedLambdaAtom = preprocessLambdaArgument(csBuilder, atom, fixedExpectedType, forceResolution = true) as ResolvedLambdaAtom setAnalyzed(resolvedLambdaAtom) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer.kt index d3d40fe0a3c..d45d45d6db3 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.builtins.getValueParameterTypesFromFunctionType import org.jetbrains.kotlin.builtins.isBuiltinFunctionalType import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder import org.jetbrains.kotlin.resolve.calls.inference.addSubsystemFromArgument -import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor import org.jetbrains.kotlin.resolve.calls.inference.model.* import org.jetbrains.kotlin.resolve.calls.model.* import org.jetbrains.kotlin.types.UnwrappedType @@ -22,7 +21,7 @@ class PostponedArgumentsAnalyzer( private val callableReferenceResolver: CallableReferenceResolver ) { interface Context : TypeSystemInferenceExtensionContext { - fun buildCurrentSubstitutor(additionalBindings: Map): NewTypeSubstitutor + fun buildCurrentSubstitutor(additionalBindings: Map): TypeSubstitutorMarker fun bindingStubsForPostponedVariables(): Map // type can be proper if it not contains not fixed type variables @@ -69,7 +68,7 @@ class PostponedArgumentsAnalyzer( val stubsForPostponedVariables = c.bindingStubsForPostponedVariables() val currentSubstitutor = c.buildCurrentSubstitutor(stubsForPostponedVariables.mapKeys { it.key.freshTypeConstructor(c) }) - fun substitute(type: UnwrappedType) = currentSubstitutor.safeSubstitute(type) + fun substitute(type: UnwrappedType) = currentSubstitutor.safeSubstitute(c, type) as UnwrappedType fun expectedOrActualType(expected: UnwrappedType?, actual: UnwrappedType?): UnwrappedType? { val expectedSubstituted = expected?.let(::substitute) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/SimpleArgumentsChecks.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/SimpleArgumentsChecks.kt index ca40dbef3d5..901ed6d7f72 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/SimpleArgumentsChecks.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/SimpleArgumentsChecks.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder import org.jetbrains.kotlin.resolve.calls.inference.addSubtypeConstraintIfCompatible +import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor import org.jetbrains.kotlin.resolve.calls.inference.model.ArgumentConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.ReceiverConstraintPosition @@ -153,7 +154,9 @@ private fun checkSubCallArgument( // subArgument cannot has stable smartcast // return type can contains fixed type variables - val currentReturnType = csBuilder.buildCurrentSubstitutor().safeSubstitute(subCallArgument.receiver.receiverValue.type.unwrap()) + val currentReturnType = + (csBuilder.buildCurrentSubstitutor() as NewTypeSubstitutor) + .safeSubstitute(subCallArgument.receiver.receiverValue.type.unwrap()) if (subCallArgument.isSafeCall) { csBuilder.addSubtypeConstraint(currentReturnType, expectedNullableType, position) return subCallResult diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilder.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilder.kt index b975d0c5767..71cf58dd8d5 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilder.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilder.kt @@ -16,16 +16,13 @@ package org.jetbrains.kotlin.resolve.calls.inference -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer -import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage -import org.jetbrains.kotlin.resolve.calls.inference.model.NewTypeVariable import org.jetbrains.kotlin.resolve.calls.model.* -import org.jetbrains.kotlin.types.TypeConstructor import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.TypeConstructorMarker +import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker import org.jetbrains.kotlin.types.model.TypeVariableMarker import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -50,7 +47,7 @@ interface ConstraintSystemBuilder : ConstraintSystemOperation { // if runOperations return true, then this operation will be applied, and function return true fun runTransaction(runOperations: ConstraintSystemOperation.() -> Boolean): Boolean - fun buildCurrentSubstitutor(): NewTypeSubstitutor + fun buildCurrentSubstitutor(): TypeSubstitutorMarker fun currentStorage(): ConstraintStorage } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/InferenceUtils.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/InferenceUtils.kt index 4d7d642db1b..98c4f520fd0 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/InferenceUtils.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/InferenceUtils.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.resolve.calls.inference import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor -import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutorByConstructorMap import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.types.* @@ -27,10 +26,13 @@ import org.jetbrains.kotlin.types.model.StubTypeMarker import org.jetbrains.kotlin.types.model.TypeConstructorMarker import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContext -import org.jetbrains.kotlin.utils.addToStdlib.cast -fun ConstraintStorage.buildCurrentSubstitutor(additionalBindings: Map): NewTypeSubstitutorByConstructorMap = - NewTypeSubstitutorByConstructorMap((fixedTypeVariables.entries.associate { it.key to it.value } + additionalBindings).cast()) // TODO: SUB +fun ConstraintStorage.buildCurrentSubstitutor( + context: TypeSystemInferenceExtensionContext, + additionalBindings: Map +): TypeSubstitutorMarker { + return context.typeSubstitutorByTypeConstructor(fixedTypeVariables.entries.associate { it.key to it.value } + additionalBindings) +} fun ConstraintStorage.buildAbstractResultingSubstitutor(context: TypeSystemInferenceExtensionContext): TypeSubstitutorMarker = with(context) { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/TypeVariableDependencyInformationProvider.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/TypeVariableDependencyInformationProvider.kt index ee15d217cd5..899bfe93c25 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/TypeVariableDependencyInformationProvider.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/TypeVariableDependencyInformationProvider.kt @@ -17,7 +17,7 @@ package org.jetbrains.kotlin.resolve.calls.inference.components import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints -import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtom +import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.TypeConstructorMarker import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContext @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.utils.SmartSet class TypeVariableDependencyInformationProvider( private val notFixedTypeVariables: Map, - private val postponedKtPrimitives: List, + private val postponedKtPrimitives: List, private val topLevelType: KotlinTypeMarker?, private val typeSystemContext: TypeSystemInferenceExtensionContext ) { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt index 88ae1d6081d..5b7c27acff0 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintS import org.jetbrains.kotlin.resolve.calls.inference.model.Constraint import org.jetbrains.kotlin.resolve.calls.inference.model.DeclaredUpperBoundConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints -import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtom +import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.TypeConstructorMarker import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContext @@ -44,7 +44,7 @@ class VariableFixationFinder( fun findFirstVariableForFixation( c: Context, allTypeVariables: List, - postponedKtPrimitives: List, + postponedKtPrimitives: List, completionMode: ConstraintSystemCompletionMode, topLevelType: KotlinTypeMarker ): VariableForFixation? = c.findTypeVariableForFixation(allTypeVariables, postponedKtPrimitives, completionMode, topLevelType) @@ -73,7 +73,7 @@ class VariableFixationFinder( private fun Context.findTypeVariableForFixation( allTypeVariables: List, - postponedArguments: List, + postponedArguments: List, completionMode: ConstraintSystemCompletionMode, topLevelType: KotlinTypeMarker ): VariableForFixation? { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt index 8136c2536d4..fdff56af3b9 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt @@ -273,14 +273,14 @@ class NewConstraintSystemImpl( } // PostponedArgumentsAnalyzer.Context - override fun buildCurrentSubstitutor(): NewTypeSubstitutor { + override fun buildCurrentSubstitutor(): TypeSubstitutorMarker { checkState(State.BUILDING, State.COMPLETION) return buildCurrentSubstitutor(emptyMap()) } - override fun buildCurrentSubstitutor(additionalBindings: Map): NewTypeSubstitutor { + override fun buildCurrentSubstitutor(additionalBindings: Map): TypeSubstitutorMarker { checkState(State.BUILDING, State.COMPLETION) - return storage.buildCurrentSubstitutor(additionalBindings) + return storage.buildCurrentSubstitutor(this, additionalBindings) } override fun bindingStubsForPostponedVariables(): Map { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionAtoms.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionAtoms.kt index 8e55c818229..64b3b3dc824 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionAtoms.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionAtoms.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableForLambdaReturnType import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.kotlin.types.UnwrappedType +import org.jetbrains.kotlin.types.model.KotlinTypeMarker /** * Call, Callable reference, lambda & function expression, collection literal. @@ -71,9 +72,15 @@ class ResolvedExpressionAtom(override val atom: ExpressionKotlinCallArgument) : } } -sealed class PostponedResolvedAtom : ResolvedAtom() { - abstract val inputTypes: Collection - abstract val outputType: UnwrappedType? +interface PostponedResolvedAtomMarker { + val inputTypes: Collection + val outputType: KotlinTypeMarker? + val analyzed: Boolean +} + +sealed class PostponedResolvedAtom : ResolvedAtom(), PostponedResolvedAtomMarker { + abstract override val inputTypes: Collection + abstract override val outputType: UnwrappedType? } class LambdaWithTypeVariableAsExpectedTypeAtom(