FIR: Do not add trivial constraints

This commit is contained in:
Denis Zharkov
2020-05-12 17:41:34 +03:00
parent 27aa0040be
commit 295f7d7500
@@ -5,14 +5,14 @@
package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.resolve.inference.TypeParameterBasedTypeVariable
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.FirTypePlaceholderProjection
@@ -30,7 +30,8 @@ internal object CreateFreshTypeVariableSubstitutorStage : ResolutionStage() {
return
}
val csBuilder = candidate.system.getBuilder()
val (substitutor, freshVariables) = createToFreshVariableSubstitutorAndAddInitialConstraints(declaration, candidate, csBuilder)
val (substitutor, freshVariables) =
createToFreshVariableSubstitutorAndAddInitialConstraints(declaration, candidate, csBuilder, callInfo.session)
candidate.substitutor = substitutor
candidate.freshVariables = freshVariables
@@ -113,7 +114,8 @@ internal object CreateFreshTypeVariableSubstitutorStage : ResolutionStage() {
fun createToFreshVariableSubstitutorAndAddInitialConstraints(
declaration: FirTypeParameterRefsOwner,
candidate: Candidate,
csBuilder: ConstraintSystemOperation
csBuilder: ConstraintSystemOperation,
session: FirSession
): Pair<ConeSubstitutor, List<ConeTypeVariable>> {
val typeParameters = declaration.typeParameters
@@ -130,7 +132,17 @@ fun createToFreshVariableSubstitutorAndAddInitialConstraints(
upperBound: ConeKotlinType//,
//position: DeclaredUpperBoundConstraintPosition
) {
csBuilder.addSubtypeConstraint(defaultType, toFreshVariables.substituteOrSelf(upperBound), FirDeclaredUpperBoundConstraintPosition())
if ((upperBound.lowerBoundIfFlexible() as? ConeClassLikeType)?.lookupTag?.classId == StandardClassIds.Any &&
upperBound.upperBoundIfFlexible().isMarkedNullable
) {
return
}
csBuilder.addSubtypeConstraint(
defaultType,
toFreshVariables.substituteOrSelf(upperBound),
FirDeclaredUpperBoundConstraintPosition()
)
}
for (index in typeParameters.indices) {