FIR: Optimize Java types mapping
- Avoid duplicated computations for arguments - Do not recreate types if they weren't enhanced
This commit is contained in:
@@ -96,12 +96,11 @@ internal fun JavaClassifierType.toFirResolvedTypeRef(
|
|||||||
forTypeParameterBounds: Boolean
|
forTypeParameterBounds: Boolean
|
||||||
): FirResolvedTypeRef {
|
): FirResolvedTypeRef {
|
||||||
val coneType =
|
val coneType =
|
||||||
this.toConeKotlinTypeWithoutEnhancement(session, javaTypeParameterStack, forTypeParameterBounds).run {
|
if (isForSupertypes)
|
||||||
if (isForSupertypes)
|
toConeKotlinTypeForFlexibleBound(session, javaTypeParameterStack, isLowerBound = true, forTypeParameterBounds)
|
||||||
this.lowerBoundIfFlexible()
|
else
|
||||||
else
|
toConeKotlinTypeWithoutEnhancement(session, javaTypeParameterStack, forTypeParameterBounds)
|
||||||
this
|
|
||||||
}
|
|
||||||
return buildResolvedTypeRef {
|
return buildResolvedTypeRef {
|
||||||
type = coneType
|
type = coneType
|
||||||
this@toFirResolvedTypeRef.annotations.mapTo(annotations) { it.toFirAnnotationCall(session, javaTypeParameterStack) }
|
this@toFirResolvedTypeRef.annotations.mapTo(annotations) { it.toFirAnnotationCall(session, javaTypeParameterStack) }
|
||||||
@@ -166,7 +165,10 @@ private fun JavaClassifierType.toConeKotlinTypeWithoutEnhancement(
|
|||||||
forTypeParameterBounds: Boolean = false
|
forTypeParameterBounds: Boolean = false
|
||||||
): ConeKotlinType {
|
): ConeKotlinType {
|
||||||
val lowerBound = toConeKotlinTypeForFlexibleBound(session, javaTypeParameterStack, isLowerBound = true, forTypeParameterBounds)
|
val lowerBound = toConeKotlinTypeForFlexibleBound(session, javaTypeParameterStack, isLowerBound = true, forTypeParameterBounds)
|
||||||
val upperBound = toConeKotlinTypeForFlexibleBound(session, javaTypeParameterStack, isLowerBound = false, forTypeParameterBounds)
|
val upperBound =
|
||||||
|
toConeKotlinTypeForFlexibleBound(
|
||||||
|
session, javaTypeParameterStack, isLowerBound = false, forTypeParameterBounds, lowerBound
|
||||||
|
)
|
||||||
|
|
||||||
return if (isRaw) ConeRawType(lowerBound, upperBound) else ConeFlexibleType(lowerBound, upperBound)
|
return if (isRaw) ConeRawType(lowerBound, upperBound) else ConeFlexibleType(lowerBound, upperBound)
|
||||||
}
|
}
|
||||||
@@ -263,8 +265,9 @@ private fun JavaClassifierType.toConeKotlinTypeForFlexibleBound(
|
|||||||
session: FirSession,
|
session: FirSession,
|
||||||
javaTypeParameterStack: JavaTypeParameterStack,
|
javaTypeParameterStack: JavaTypeParameterStack,
|
||||||
isLowerBound: Boolean,
|
isLowerBound: Boolean,
|
||||||
forTypeParameterBounds: Boolean
|
forTypeParameterBounds: Boolean,
|
||||||
): ConeKotlinType {
|
lowerBound: ConeLookupTagBasedType? = null
|
||||||
|
): ConeLookupTagBasedType {
|
||||||
return when (val classifier = classifier) {
|
return when (val classifier = classifier) {
|
||||||
is JavaClass -> {
|
is JavaClass -> {
|
||||||
//val classId = classifier.classId!!
|
//val classId = classifier.classId!!
|
||||||
@@ -275,6 +278,11 @@ private fun JavaClassifierType.toConeKotlinTypeForFlexibleBound(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val lookupTag = ConeClassLikeLookupTagImpl(classId)
|
val lookupTag = ConeClassLikeLookupTagImpl(classId)
|
||||||
|
if (!isLowerBound && !isRaw && lookupTag == lowerBound?.lookupTag) {
|
||||||
|
return lookupTag.constructClassType(
|
||||||
|
lowerBound.typeArguments, isNullable = true
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
val mappedTypeArguments = if (isRaw) {
|
val mappedTypeArguments = if (isRaw) {
|
||||||
|
|
||||||
@@ -306,7 +314,7 @@ private fun JavaClassifierType.toConeKotlinTypeForFlexibleBound(
|
|||||||
val symbol = javaTypeParameterStack[classifier]
|
val symbol = javaTypeParameterStack[classifier]
|
||||||
ConeTypeParameterTypeImpl(symbol.toLookupTag(), isNullable = !isLowerBound)
|
ConeTypeParameterTypeImpl(symbol.toLookupTag(), isNullable = !isLowerBound)
|
||||||
}
|
}
|
||||||
else -> ConeClassErrorType(reason = "Unexpected classifier: $classifier")
|
else -> ConeKotlinErrorType("Unexpected classifier: $classifier")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -91,8 +91,9 @@ private fun ConeKotlinType.enhanceConeKotlinType(
|
|||||||
session, TypeComponentPosition.FLEXIBLE_UPPER, qualifiers, index
|
session, TypeComponentPosition.FLEXIBLE_UPPER, qualifiers, index
|
||||||
)
|
)
|
||||||
|
|
||||||
when (this) {
|
when {
|
||||||
is ConeRawType -> ConeRawType(lowerResult, upperResult)
|
lowerResult === lowerBound && upperResult === upperBound -> this
|
||||||
|
this is ConeRawType -> ConeRawType(lowerResult, upperResult)
|
||||||
else -> coneFlexibleOrSimpleType(
|
else -> coneFlexibleOrSimpleType(
|
||||||
session, lowerResult, upperResult, isNotNullTypeParameter = qualifiers(index).isNotNullTypeParameter
|
session, lowerResult, upperResult, isNotNullTypeParameter = qualifiers(index).isNotNullTypeParameter
|
||||||
)
|
)
|
||||||
@@ -165,6 +166,8 @@ private fun ConeKotlinType.enhanceInflexibleType(
|
|||||||
val effectiveQualifiers = qualifiers(index)
|
val effectiveQualifiers = qualifiers(index)
|
||||||
val enhancedTag = originalTag.enhanceMutability(effectiveQualifiers, position)
|
val enhancedTag = originalTag.enhanceMutability(effectiveQualifiers, position)
|
||||||
|
|
||||||
|
var wereChangesInArgs = false
|
||||||
|
|
||||||
val enhancedArguments = if (this is RawType) {
|
val enhancedArguments = if (this is RawType) {
|
||||||
// TODO: Support enhancing for raw types
|
// TODO: Support enhancing for raw types
|
||||||
typeArguments
|
typeArguments
|
||||||
@@ -178,13 +181,19 @@ private fun ConeKotlinType.enhanceInflexibleType(
|
|||||||
require(arg is ConeKotlinType) { "Should be invariant type: $arg" }
|
require(arg is ConeKotlinType) { "Should be invariant type: $arg" }
|
||||||
globalArgIndex += arg.subtreeSize()
|
globalArgIndex += arg.subtreeSize()
|
||||||
|
|
||||||
arg.enhanceConeKotlinType(session, qualifiers, globalArgIndex)
|
arg.enhanceConeKotlinType(session, qualifiers, globalArgIndex).also {
|
||||||
|
if (it !== arg) {
|
||||||
|
wereChangesInArgs = true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}.toTypedArray()
|
}.toTypedArray()
|
||||||
}
|
}
|
||||||
|
|
||||||
val enhancedNullability = getEnhancedNullability(effectiveQualifiers, position)
|
val enhancedNullability = getEnhancedNullability(effectiveQualifiers, position)
|
||||||
|
|
||||||
|
if (!wereChangesInArgs && originalTag == enhancedTag && enhancedNullability == isNullable) return this
|
||||||
|
|
||||||
val enhancedType = enhancedTag.constructType(enhancedArguments, enhancedNullability)
|
val enhancedType = enhancedTag.constructType(enhancedArguments, enhancedNullability)
|
||||||
|
|
||||||
// TODO: why all of these is needed
|
// TODO: why all of these is needed
|
||||||
|
|||||||
@@ -185,7 +185,7 @@ fun ConeKotlinType.toTypeProjection(variance: Variance): ConeKotlinTypeProjectio
|
|||||||
fun ConeClassLikeLookupTag.constructClassType(
|
fun ConeClassLikeLookupTag.constructClassType(
|
||||||
typeArguments: Array<out ConeKotlinTypeProjection>,
|
typeArguments: Array<out ConeKotlinTypeProjection>,
|
||||||
isNullable: Boolean,
|
isNullable: Boolean,
|
||||||
): ConeLookupTagBasedType {
|
): ConeClassLikeType {
|
||||||
return ConeClassLikeTypeImpl(this, typeArguments, isNullable)
|
return ConeClassLikeTypeImpl(this, typeArguments, isNullable)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user