FIR substitution: use standard approximation to remove captured types
This commit is contained in:
+25
-9
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusIm
|
|||||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
|
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.inference.inferenceComponents
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor
|
import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.chain
|
import org.jetbrains.kotlin.fir.resolve.substitution.chain
|
||||||
@@ -28,6 +29,7 @@ import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
|||||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
|
||||||
|
|
||||||
class FirClassSubstitutionScope(
|
class FirClassSubstitutionScope(
|
||||||
private val session: FirSession,
|
private val session: FirSession,
|
||||||
@@ -128,6 +130,18 @@ class FirClassSubstitutionScope(
|
|||||||
return substitutor.substituteOrNull(this)
|
return substitutor.substituteOrNull(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun ConeKotlinType.approximateCapturedCovariant(): ConeKotlinType {
|
||||||
|
return session.inferenceComponents.approximator.approximateToSuperType(
|
||||||
|
this, TypeApproximatorConfiguration.SubtypeCapturedTypesApproximation
|
||||||
|
) as? ConeKotlinType ?: this
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun ConeKotlinType.approximateCapturedContravariant(): ConeKotlinType {
|
||||||
|
return session.inferenceComponents.approximator.approximateToSubType(
|
||||||
|
this, TypeApproximatorConfiguration.SubtypeCapturedTypesApproximation
|
||||||
|
) as? ConeKotlinType ?: this
|
||||||
|
}
|
||||||
|
|
||||||
private fun createFakeOverrideFunction(original: FirFunctionSymbol<*>): FirFunctionSymbol<*> {
|
private fun createFakeOverrideFunction(original: FirFunctionSymbol<*>): FirFunctionSymbol<*> {
|
||||||
if (substitutor == ConeSubstitutor.Empty) return original
|
if (substitutor == ConeSubstitutor.Empty) return original
|
||||||
val member = when (original) {
|
val member = when (original) {
|
||||||
@@ -139,7 +153,7 @@ class FirClassSubstitutionScope(
|
|||||||
|
|
||||||
val (newTypeParameters, newReceiverType, newReturnType, newSubstitutor) = createSubstitutedData(member)
|
val (newTypeParameters, newReceiverType, newReturnType, newSubstitutor) = createSubstitutedData(member)
|
||||||
val newParameterTypes = member.valueParameters.map {
|
val newParameterTypes = member.valueParameters.map {
|
||||||
it.returnTypeRef.coneType.substitute(newSubstitutor)
|
it.returnTypeRef.coneType.substitute(newSubstitutor)?.approximateCapturedContravariant()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newReceiverType == null && newReturnType == null && newParameterTypes.all { it == null } &&
|
if (newReceiverType == null && newReturnType == null && newParameterTypes.all { it == null } &&
|
||||||
@@ -171,7 +185,7 @@ class FirClassSubstitutionScope(
|
|||||||
|
|
||||||
val (newTypeParameters, _, newReturnType, newSubstitutor) = createSubstitutedData(constructor)
|
val (newTypeParameters, _, newReturnType, newSubstitutor) = createSubstitutedData(constructor)
|
||||||
val newParameterTypes = constructor.valueParameters.map {
|
val newParameterTypes = constructor.valueParameters.map {
|
||||||
it.returnTypeRef.coneType.substitute(newSubstitutor)
|
it.returnTypeRef.coneType.substitute(newSubstitutor)?.approximateCapturedContravariant()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newReturnType == null && newParameterTypes.all { it == null } && newTypeParameters === constructor.typeParameters) {
|
if (newReturnType == null && newParameterTypes.all { it == null } && newTypeParameters === constructor.typeParameters) {
|
||||||
@@ -188,7 +202,7 @@ class FirClassSubstitutionScope(
|
|||||||
val member = original.fir
|
val member = original.fir
|
||||||
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
|
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
|
||||||
|
|
||||||
val (newTypeParameters, newReceiverType, newReturnType) = createSubstitutedData(member)
|
val (newTypeParameters, newReceiverType, newReturnType, _) = createSubstitutedData(member)
|
||||||
if (newReceiverType == null &&
|
if (newReceiverType == null &&
|
||||||
newReturnType == null && newTypeParameters === member.typeParameters
|
newReturnType == null && newTypeParameters === member.typeParameters
|
||||||
) {
|
) {
|
||||||
@@ -223,10 +237,10 @@ class FirClassSubstitutionScope(
|
|||||||
)
|
)
|
||||||
|
|
||||||
val receiverType = member.receiverTypeRef?.coneType
|
val receiverType = member.receiverTypeRef?.coneType
|
||||||
val newReceiverType = receiverType?.substitute(substitutor)
|
val newReceiverType = receiverType?.substitute(substitutor)?.approximateCapturedContravariant()
|
||||||
|
|
||||||
val returnType = typeCalculator.tryCalculateReturnType(member).type
|
val returnType = typeCalculator.tryCalculateReturnType(member).type
|
||||||
val newReturnType = returnType.substitute(substitutor)
|
val newReturnType = returnType.substitute(substitutor)?.approximateCapturedCovariant()
|
||||||
return SubstitutedData(newTypeParameters, newReceiverType, newReturnType, substitutor)
|
return SubstitutedData(newTypeParameters, newReceiverType, newReturnType, substitutor)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,7 +250,7 @@ class FirClassSubstitutionScope(
|
|||||||
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
|
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
|
||||||
|
|
||||||
val returnType = typeCalculator.tryCalculateReturnType(member).type
|
val returnType = typeCalculator.tryCalculateReturnType(member).type
|
||||||
val newReturnType = returnType.substitute() ?: return original
|
val newReturnType = returnType.substitute()?.approximateCapturedCovariant() ?: return original
|
||||||
|
|
||||||
return createFakeOverrideField(session, member, original, newReturnType, derivedClassId)
|
return createFakeOverrideField(session, member, original, newReturnType, derivedClassId)
|
||||||
}
|
}
|
||||||
@@ -247,10 +261,10 @@ class FirClassSubstitutionScope(
|
|||||||
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
|
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
|
||||||
|
|
||||||
val returnType = typeCalculator.tryCalculateReturnType(member).type
|
val returnType = typeCalculator.tryCalculateReturnType(member).type
|
||||||
val newReturnType = returnType.substitute()
|
val newReturnType = returnType.substitute()?.approximateCapturedCovariant()
|
||||||
|
|
||||||
val newParameterTypes = member.getter.valueParameters.map {
|
val newParameterTypes = member.getter.valueParameters.map {
|
||||||
it.returnTypeRef.coneType.substitute()
|
it.returnTypeRef.coneType.substitute()?.approximateCapturedContravariant()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newReturnType == null && newParameterTypes.all { it == null }) {
|
if (newReturnType == null && newParameterTypes.all { it == null }) {
|
||||||
@@ -423,7 +437,9 @@ class FirClassSubstitutionScope(
|
|||||||
isLocal = false
|
isLocal = false
|
||||||
status = baseProperty.status.withExpect(isExpect)
|
status = baseProperty.status.withExpect(isExpect)
|
||||||
resolvePhase = baseProperty.resolvePhase
|
resolvePhase = baseProperty.resolvePhase
|
||||||
typeParameters += configureAnnotationsTypeParametersAndSignature(baseProperty, newTypeParameters, newReceiverType, newReturnType)
|
typeParameters += configureAnnotationsTypeParametersAndSignature(
|
||||||
|
baseProperty, newTypeParameters, newReceiverType, newReturnType
|
||||||
|
)
|
||||||
}
|
}
|
||||||
return symbol
|
return symbol
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user