FIR type enhancement: fold flexible types when it's possible

Related to KT-29937
This commit is contained in:
Mikhail Glukhikh
2019-03-06 18:01:42 +03:00
parent 3d29b31177
commit be412baf9f
25 changed files with 113 additions and 101 deletions
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.service
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
@@ -33,6 +34,7 @@ import org.jetbrains.kotlin.load.java.structure.*
import org.jetbrains.kotlin.load.java.typeEnhancement.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
@@ -65,7 +67,7 @@ private fun JavaType?.enhancePossiblyFlexible(
FirResolvedTypeRefImpl(
session, psi = null,
type = ConeFlexibleType(lowerResult, upperResult),
type = coneFlexibleOrSimpleType(session, lowerResult, upperResult),
isMarkedNullable = false, annotations = annotations
)
}
@@ -81,6 +83,17 @@ private fun JavaType?.subtreeSize(): Int {
return 1 + typeArguments.sumBy { it?.subtreeSize() ?: 0 }
}
private fun coneFlexibleOrSimpleType(
session: FirSession,
lowerBound: ConeLookupTagBasedType,
upperBound: ConeLookupTagBasedType
): ConeKotlinType {
if (AbstractStrictEqualityTypeChecker.strictEqualTypes(session.typeContext, lowerBound, upperBound)) {
return lowerBound
}
return ConeFlexibleType(lowerBound, upperBound)
}
private val KOTLIN_COLLECTIONS = FqName("kotlin.collections")
private val KOTLIN_COLLECTIONS_PREFIX_LENGTH = KOTLIN_COLLECTIONS.asString().length + 1
@@ -33,15 +33,6 @@ class JavaClassUseSiteScope(
//base symbol as key, overridden as value
private val overriddenByBase = mutableMapOf<ConeFunctionSymbol, ConeFunctionSymbol?>()
@Suppress("UNUSED_PARAMETER")
private fun isSubtypeOf(subType: ConeKotlinType, superType: ConeKotlinType): Boolean {
// TODO: introduce normal sub-typing
return true
}
private fun isSubtypeOf(subType: FirTypeRef, superType: FirTypeRef) =
isSubtypeOf(subType.toNotNullConeKotlinType(), superType.toNotNullConeKotlinType())
@Suppress("UNUSED_PARAMETER")
private fun isEqualTypes(a: ConeKotlinType, b: ConeKotlinType): Boolean {
// TODO: introduce normal type comparison
@@ -73,7 +64,6 @@ class JavaClassUseSiteScope(
val member = (it as FirFunctionSymbol).fir as FirNamedFunction
self.modality != Modality.FINAL
&& sameReceivers(member.receiverTypeRef, self.receiverTypeRef)
&& isSubtypeOf(member.returnTypeRef, self.returnTypeRef)
&& isOverriddenFunCheck(member, self)
} // TODO: two or more overrides for one fun?
overriddenByBase[this] = overriding