[Minor] Rename fresh variable substitutor in resolved atom

This commit is contained in:
Pavel Kirpichenkov
2019-11-08 12:10:21 +03:00
parent 25f3de2085
commit ea66f02035
7 changed files with 18 additions and 19 deletions
@@ -53,14 +53,14 @@ class DelegatedPropertyInferenceSession(
?: builtIns.nullableNothingType ?: builtIns.nullableNothingType
val valueParameterForThis = descriptor.valueParameters.getOrNull(0) ?: return val valueParameterForThis = descriptor.valueParameters.getOrNull(0) ?: return
val substitutedType = substitutor.safeSubstitute(valueParameterForThis.type.unwrap()) val substitutedType = freshVariablesSubstitutor.safeSubstitute(valueParameterForThis.type.unwrap())
commonSystem.addSubtypeConstraint(typeOfThis.unwrap(), substitutedType, DelegatedPropertyConstraintPosition(atom)) commonSystem.addSubtypeConstraint(typeOfThis.unwrap(), substitutedType, DelegatedPropertyConstraintPosition(atom))
} }
private fun ResolvedCallAtom.addConstraintsForGetValueMethod(commonSystem: ConstraintSystemBuilder) { private fun ResolvedCallAtom.addConstraintsForGetValueMethod(commonSystem: ConstraintSystemBuilder) {
if (expectedType != null) { if (expectedType != null) {
val unsubstitutedReturnType = candidateDescriptor.returnType?.unwrap() ?: return val unsubstitutedReturnType = candidateDescriptor.returnType?.unwrap() ?: return
val substitutedReturnType = substitutor.safeSubstitute(unsubstitutedReturnType) val substitutedReturnType = freshVariablesSubstitutor.safeSubstitute(unsubstitutedReturnType)
commonSystem.addSubtypeConstraint(substitutedReturnType, expectedType, DelegatedPropertyConstraintPosition(atom)) commonSystem.addSubtypeConstraint(substitutedReturnType, expectedType, DelegatedPropertyConstraintPosition(atom))
} }
@@ -71,7 +71,7 @@ class DelegatedPropertyInferenceSession(
private fun ResolvedCallAtom.addConstraintsForSetValueMethod(commonSystem: ConstraintSystemBuilder) { private fun ResolvedCallAtom.addConstraintsForSetValueMethod(commonSystem: ConstraintSystemBuilder) {
if (expectedType != null) { if (expectedType != null) {
val unsubstitutedParameterType = candidateDescriptor.valueParameters.getOrNull(2)?.type?.unwrap() ?: return val unsubstitutedParameterType = candidateDescriptor.valueParameters.getOrNull(2)?.type?.unwrap() ?: return
val substitutedParameterType = substitutor.safeSubstitute(unsubstitutedParameterType) val substitutedParameterType = freshVariablesSubstitutor.safeSubstitute(unsubstitutedParameterType)
commonSystem.addSubtypeConstraint(expectedType, substitutedParameterType, DelegatedPropertyConstraintPosition(atom)) commonSystem.addSubtypeConstraint(expectedType, substitutedParameterType, DelegatedPropertyConstraintPosition(atom))
} }
@@ -712,7 +712,7 @@ class NewResolvedCallImpl<D : CallableDescriptor>(
(candidateDescriptor.typeParameters.isNotEmpty() || shouldRunApproximation)) -> (candidateDescriptor.typeParameters.isNotEmpty() || shouldRunApproximation)) ->
// this code is very suspicious. Now it is very useful for BE, because they cannot do nothing with captured types, // this code is very suspicious. Now it is very useful for BE, because they cannot do nothing with captured types,
// but it seems like temporary solution. // but it seems like temporary solution.
candidateDescriptor.substitute(resolvedCallAtom.substitutor).substituteAndApproximateTypes( candidateDescriptor.substitute(resolvedCallAtom.freshVariablesSubstitutor).substituteAndApproximateTypes(
substitutor ?: FreshVariableNewTypeSubstitutor.Empty, typeApproximator substitutor ?: FreshVariableNewTypeSubstitutor.Empty, typeApproximator
) )
else -> else ->
@@ -720,7 +720,7 @@ class NewResolvedCallImpl<D : CallableDescriptor>(
} }
} as D } as D
typeArguments = resolvedCallAtom.substitutor.freshVariables.map { typeArguments = resolvedCallAtom.freshVariablesSubstitutor.freshVariables.map {
val substituted = (substitutor ?: FreshVariableNewTypeSubstitutor.Empty).safeSubstitute(it.defaultType) val substituted = (substitutor ?: FreshVariableNewTypeSubstitutor.Empty).safeSubstitute(it.defaultType)
typeApproximator typeApproximator
.approximateToSuperType(substituted, TypeApproximatorConfiguration.IntegerLiteralsTypesApproximation) .approximateToSuperType(substituted, TypeApproximatorConfiguration.IntegerLiteralsTypesApproximation)
@@ -738,7 +738,8 @@ class NewResolvedCallImpl<D : CallableDescriptor>(
expedtedTypeForSamConvertedArgumentMap = hashMapOf() expedtedTypeForSamConvertedArgumentMap = hashMapOf()
for ((argument, description) in resolvedCallAtom.argumentsWithConversion) { for ((argument, description) in resolvedCallAtom.argumentsWithConversion) {
val typeWithFreshVariables = resolvedCallAtom.substitutor.safeSubstitute(description.convertedTypeByCandidateParameter) val typeWithFreshVariables =
resolvedCallAtom.freshVariablesSubstitutor.safeSubstitute(description.convertedTypeByCandidateParameter)
val expectedType = substitutor?.safeSubstitute(typeWithFreshVariables) ?: typeWithFreshVariables val expectedType = substitutor?.safeSubstitute(typeWithFreshVariables) ?: typeWithFreshVariables
expedtedTypeForSamConvertedArgumentMap!![argument.psiCallArgument.valueArgument] = expectedType expedtedTypeForSamConvertedArgumentMap!![argument.psiCallArgument.valueArgument] = expectedType
} }
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem
import org.jetbrains.kotlin.resolve.calls.inference.addSubtypeConstraintIfCompatible import org.jetbrains.kotlin.resolve.calls.inference.addSubtypeConstraintIfCompatible
import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter
import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode
import org.jetbrains.kotlin.resolve.calls.inference.model.Constraint
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage.Empty.hasContradiction import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage.Empty.hasContradiction
import org.jetbrains.kotlin.resolve.calls.inference.model.ExpectedTypeConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.ExpectedTypeConstraintPosition
import org.jetbrains.kotlin.resolve.calls.model.* import org.jetbrains.kotlin.resolve.calls.model.*
@@ -20,7 +19,6 @@ import org.jetbrains.kotlin.types.ErrorUtils
import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.TypeUtils
import org.jetbrains.kotlin.types.UnwrappedType import org.jetbrains.kotlin.types.UnwrappedType
import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContext import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContext
import org.jetbrains.kotlin.types.model.defaultType
import org.jetbrains.kotlin.types.model.isIntegerLiteralTypeConstructor import org.jetbrains.kotlin.types.model.isIntegerLiteralTypeConstructor
import org.jetbrains.kotlin.types.model.typeConstructor import org.jetbrains.kotlin.types.model.typeConstructor
import org.jetbrains.kotlin.types.typeUtil.contains import org.jetbrains.kotlin.types.typeUtil.contains
@@ -147,7 +145,7 @@ class KotlinCallCompleter(
private fun KotlinResolutionCandidate.substitutedReturnType(): UnwrappedType? { private fun KotlinResolutionCandidate.substitutedReturnType(): UnwrappedType? {
val returnType = resolvedCall.candidateDescriptor.returnType?.unwrap() ?: return null val returnType = resolvedCall.candidateDescriptor.returnType?.unwrap() ?: return null
return resolvedCall.substitutor.safeSubstitute(returnType) return resolvedCall.freshVariablesSubstitutor.safeSubstitute(returnType)
} }
private fun KotlinResolutionCandidate.addExpectedTypeConstraint( private fun KotlinResolutionCandidate.addExpectedTypeConstraint(
@@ -125,11 +125,11 @@ internal object NoArguments : ResolutionPart() {
internal object CreateFreshVariablesSubstitutor : ResolutionPart() { internal object CreateFreshVariablesSubstitutor : ResolutionPart() {
override fun KotlinResolutionCandidate.process(workIndex: Int) { override fun KotlinResolutionCandidate.process(workIndex: Int) {
if (candidateDescriptor.typeParameters.isEmpty()) { if (candidateDescriptor.typeParameters.isEmpty()) {
resolvedCall.substitutor = FreshVariableNewTypeSubstitutor.Empty resolvedCall.freshVariablesSubstitutor = FreshVariableNewTypeSubstitutor.Empty
return return
} }
val toFreshVariables = createToFreshVariableSubstitutorAndAddInitialConstraints(candidateDescriptor, csBuilder) val toFreshVariables = createToFreshVariableSubstitutorAndAddInitialConstraints(candidateDescriptor, csBuilder)
resolvedCall.substitutor = toFreshVariables resolvedCall.freshVariablesSubstitutor = toFreshVariables
// bad function -- error on declaration side // bad function -- error on declaration side
if (csBuilder.hasContradiction) return if (csBuilder.hasContradiction) return
@@ -232,7 +232,7 @@ internal object PostponedVariablesInitializerResolutionPart : ResolutionPart() {
if (!callComponents.statelessCallbacks.isCoroutineCall(argument, parameter)) continue if (!callComponents.statelessCallbacks.isCoroutineCall(argument, parameter)) continue
val receiverType = parameter.type.getReceiverTypeFromFunctionType() ?: continue val receiverType = parameter.type.getReceiverTypeFromFunctionType() ?: continue
for (freshVariable in resolvedCall.substitutor.freshVariables) { for (freshVariable in resolvedCall.freshVariablesSubstitutor.freshVariables) {
if (resolvedCall.typeArgumentMappingByOriginal.getTypeArgument(freshVariable.originalTypeParameter) is SimpleTypeArgument) if (resolvedCall.typeArgumentMappingByOriginal.getTypeArgument(freshVariable.originalTypeParameter) is SimpleTypeArgument)
continue continue
@@ -284,7 +284,7 @@ private fun KotlinResolutionCandidate.prepareExpectedType(
callComponents.languageVersionSettings callComponents.languageVersionSettings
) )
val resultType = knownTypeParametersResultingSubstitutor?.substitute(argumentType) ?: argumentType val resultType = knownTypeParametersResultingSubstitutor?.substitute(argumentType) ?: argumentType
return resolvedCall.substitutor.safeSubstitute(resultType) return resolvedCall.freshVariablesSubstitutor.safeSubstitute(resultType)
} }
private fun KotlinResolutionCandidate.getExpectedTypeWithSAMConversion( private fun KotlinResolutionCandidate.getExpectedTypeWithSAMConversion(
@@ -414,7 +414,7 @@ internal object ErrorDescriptorResolutionPart : ResolutionPart() {
} }
resolvedCall.typeArgumentMappingByOriginal = TypeArgumentsToParametersMapper.TypeArgumentsMapping.NoExplicitArguments resolvedCall.typeArgumentMappingByOriginal = TypeArgumentsToParametersMapper.TypeArgumentsMapping.NoExplicitArguments
resolvedCall.argumentMappingByOriginal = emptyMap() resolvedCall.argumentMappingByOriginal = emptyMap()
resolvedCall.substitutor = FreshVariableNewTypeSubstitutor.Empty resolvedCall.freshVariablesSubstitutor = FreshVariableNewTypeSubstitutor.Empty
resolvedCall.argumentToCandidateParameter = emptyMap() resolvedCall.argumentToCandidateParameter = emptyMap()
kotlinCall.explicitReceiver?.safeAs<SimpleKotlinCallArgument>()?.let { kotlinCall.explicitReceiver?.safeAs<SimpleKotlinCallArgument>()?.let {
@@ -166,7 +166,7 @@ class KotlinConstraintSystemCompleter(
fun ResolvedAtom.process(to: LinkedHashSet<TypeConstructor>) { fun ResolvedAtom.process(to: LinkedHashSet<TypeConstructor>) {
val typeVariables = when (this) { val typeVariables = when (this) {
is ResolvedCallAtom -> substitutor.freshVariables is ResolvedCallAtom -> freshVariablesSubstitutor.freshVariables
is ResolvedCallableReferenceAtom -> candidate?.freshSubstitutor?.freshVariables.orEmpty() is ResolvedCallableReferenceAtom -> candidate?.freshSubstitutor?.freshVariables.orEmpty()
is ResolvedLambdaAtom -> listOfNotNull(typeVariableForLambdaReturnType) is ResolvedLambdaAtom -> listOfNotNull(typeVariableForLambdaReturnType)
else -> emptyList() else -> emptyList()
@@ -247,7 +247,7 @@ class KotlinConstraintSystemCompleter(
private fun findResolvedAtomBy(typeVariable: TypeVariableMarker, topLevelAtoms: List<ResolvedAtom>): ResolvedAtom? { private fun findResolvedAtomBy(typeVariable: TypeVariableMarker, topLevelAtoms: List<ResolvedAtom>): ResolvedAtom? {
fun ResolvedAtom.check(): ResolvedAtom? { fun ResolvedAtom.check(): ResolvedAtom? {
val suitableCall = when (this) { val suitableCall = when (this) {
is ResolvedCallAtom -> typeVariable in substitutor.freshVariables is ResolvedCallAtom -> typeVariable in freshVariablesSubstitutor.freshVariables
is ResolvedCallableReferenceAtom -> candidate?.freshSubstitutor?.freshVariables?.let { typeVariable in it } ?: false is ResolvedCallableReferenceAtom -> candidate?.freshSubstitutor?.freshVariables?.let { typeVariable in it } ?: false
is ResolvedLambdaAtom -> typeVariable == typeVariableForLambdaReturnType is ResolvedLambdaAtom -> typeVariable == typeVariableForLambdaReturnType
else -> false else -> false
@@ -63,7 +63,7 @@ abstract class ResolvedCallAtom : ResolvedAtom() {
abstract val extensionReceiverArgument: SimpleKotlinCallArgument? abstract val extensionReceiverArgument: SimpleKotlinCallArgument?
abstract val typeArgumentMappingByOriginal: TypeArgumentsToParametersMapper.TypeArgumentsMapping abstract val typeArgumentMappingByOriginal: TypeArgumentsToParametersMapper.TypeArgumentsMapping
abstract val argumentMappingByOriginal: Map<ValueParameterDescriptor, ResolvedCallArgument> abstract val argumentMappingByOriginal: Map<ValueParameterDescriptor, ResolvedCallArgument>
abstract val substitutor: FreshVariableNewTypeSubstitutor abstract val freshVariablesSubstitutor: FreshVariableNewTypeSubstitutor
abstract val argumentsWithConversion: Map<KotlinCallArgument, SamConversionDescription> abstract val argumentsWithConversion: Map<KotlinCallArgument, SamConversionDescription>
} }
@@ -237,7 +237,7 @@ fun CallResolutionResult.resultCallAtom(): ResolvedCallAtom? =
val ResolvedCallAtom.freshReturnType: UnwrappedType? val ResolvedCallAtom.freshReturnType: UnwrappedType?
get() { get() {
val returnType = candidateDescriptor.returnType ?: return null val returnType = candidateDescriptor.returnType ?: return null
return substitutor.safeSubstitute(returnType.unwrap()) return freshVariablesSubstitutor.safeSubstitute(returnType.unwrap())
} }
class PartialCallContainer(val result: PartialCallResolutionResult?) { class PartialCallContainer(val result: PartialCallResolutionResult?) {
@@ -178,7 +178,7 @@ class MutableResolvedCallAtom(
) : ResolvedCallAtom() { ) : ResolvedCallAtom() {
override lateinit var typeArgumentMappingByOriginal: TypeArgumentsToParametersMapper.TypeArgumentsMapping override lateinit var typeArgumentMappingByOriginal: TypeArgumentsToParametersMapper.TypeArgumentsMapping
override lateinit var argumentMappingByOriginal: Map<ValueParameterDescriptor, ResolvedCallArgument> override lateinit var argumentMappingByOriginal: Map<ValueParameterDescriptor, ResolvedCallArgument>
override lateinit var substitutor: FreshVariableNewTypeSubstitutor override lateinit var freshVariablesSubstitutor: FreshVariableNewTypeSubstitutor
lateinit var argumentToCandidateParameter: Map<KotlinCallArgument, ValueParameterDescriptor> lateinit var argumentToCandidateParameter: Map<KotlinCallArgument, ValueParameterDescriptor>
private var samAdapterMap: HashMap<KotlinCallArgument, SamConversionDescription>? = null private var samAdapterMap: HashMap<KotlinCallArgument, SamConversionDescription>? = null