FIR: Reuse callables copying parts in FirClassSubstitutionScope
It changes the behavior in FirTypeIntersectionScope: - now type parameters are also get copied - value parameters are being copied unchanged
This commit is contained in:
+49
-7
@@ -290,17 +290,41 @@ class FirClassSubstitutionScope(
|
|||||||
newReturnType: ConeKotlinType? = null,
|
newReturnType: ConeKotlinType? = null,
|
||||||
newParameterTypes: List<ConeKotlinType?>? = null,
|
newParameterTypes: List<ConeKotlinType?>? = null,
|
||||||
newTypeParameters: List<FirTypeParameter>? = null,
|
newTypeParameters: List<FirTypeParameter>? = null,
|
||||||
isExpect: Boolean = baseFunction.isExpect
|
isExpect: Boolean = baseFunction.isExpect,
|
||||||
): FirSimpleFunction {
|
): FirSimpleFunction {
|
||||||
// TODO: consider using here some light-weight functions instead of pseudo-real FirMemberFunctionImpl
|
// TODO: consider using here some light-weight functions instead of pseudo-real FirMemberFunctionImpl
|
||||||
// As second alternative, we can invent some light-weight kind of FirRegularClass
|
// As second alternative, we can invent some light-weight kind of FirRegularClass
|
||||||
|
return createCopyForFirFunction(
|
||||||
|
fakeOverrideSymbol,
|
||||||
|
baseFunction,
|
||||||
|
session,
|
||||||
|
FirDeclarationOrigin.FakeOverride,
|
||||||
|
isExpect,
|
||||||
|
newParameterTypes,
|
||||||
|
newTypeParameters,
|
||||||
|
newReceiverType,
|
||||||
|
newReturnType
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createCopyForFirFunction(
|
||||||
|
newSymbol: FirFunctionSymbol<FirSimpleFunction>,
|
||||||
|
baseFunction: FirSimpleFunction,
|
||||||
|
session: FirSession,
|
||||||
|
origin: FirDeclarationOrigin,
|
||||||
|
isExpect: Boolean = baseFunction.isExpect,
|
||||||
|
newParameterTypes: List<ConeKotlinType?>? = null,
|
||||||
|
newTypeParameters: List<FirTypeParameter>? = null,
|
||||||
|
newReceiverType: ConeKotlinType? = null,
|
||||||
|
newReturnType: ConeKotlinType? = null
|
||||||
|
): FirSimpleFunction {
|
||||||
return buildSimpleFunction {
|
return buildSimpleFunction {
|
||||||
source = baseFunction.source
|
source = baseFunction.source
|
||||||
this.session = session
|
this.session = session
|
||||||
origin = FirDeclarationOrigin.FakeOverride
|
this.origin = origin
|
||||||
name = baseFunction.name
|
name = baseFunction.name
|
||||||
status = baseFunction.status.withExpect(isExpect)
|
status = baseFunction.status.withExpect(isExpect)
|
||||||
symbol = fakeOverrideSymbol
|
symbol = newSymbol
|
||||||
resolvePhase = baseFunction.resolvePhase
|
resolvePhase = baseFunction.resolvePhase
|
||||||
|
|
||||||
typeParameters += configureAnnotationsTypeParametersAndSignature(
|
typeParameters += configureAnnotationsTypeParametersAndSignature(
|
||||||
@@ -413,21 +437,39 @@ class FirClassSubstitutionScope(
|
|||||||
CallableId(derivedClassId ?: baseSymbol.callableId.classId!!, baseProperty.name),
|
CallableId(derivedClassId ?: baseSymbol.callableId.classId!!, baseProperty.name),
|
||||||
isFakeOverride = true, overriddenSymbol = baseSymbol
|
isFakeOverride = true, overriddenSymbol = baseSymbol
|
||||||
)
|
)
|
||||||
buildProperty {
|
createCopyForFirProperty(
|
||||||
|
symbol, baseProperty, session, isExpect,
|
||||||
|
newTypeParameters, newReceiverType, newReturnType
|
||||||
|
)
|
||||||
|
return symbol
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createCopyForFirProperty(
|
||||||
|
newSymbol: FirPropertySymbol,
|
||||||
|
baseProperty: FirProperty,
|
||||||
|
session: FirSession,
|
||||||
|
isExpect: Boolean = baseProperty.isExpect,
|
||||||
|
newTypeParameters: List<FirTypeParameter>? = null,
|
||||||
|
newReceiverType: ConeKotlinType? = null,
|
||||||
|
newReturnType: ConeKotlinType? = null,
|
||||||
|
): FirProperty {
|
||||||
|
return buildProperty {
|
||||||
source = baseProperty.source
|
source = baseProperty.source
|
||||||
this.session = session
|
this.session = session
|
||||||
origin = FirDeclarationOrigin.FakeOverride
|
origin = FirDeclarationOrigin.FakeOverride
|
||||||
name = baseProperty.name
|
name = baseProperty.name
|
||||||
isVar = baseProperty.isVar
|
isVar = baseProperty.isVar
|
||||||
this.symbol = symbol
|
this.symbol = newSymbol
|
||||||
isLocal = false
|
isLocal = false
|
||||||
status = baseProperty.status.withExpect(isExpect)
|
status = baseProperty.status.withExpect(isExpect)
|
||||||
resolvePhase = baseProperty.resolvePhase
|
resolvePhase = baseProperty.resolvePhase
|
||||||
typeParameters += configureAnnotationsTypeParametersAndSignature(
|
typeParameters += configureAnnotationsTypeParametersAndSignature(
|
||||||
baseProperty, newTypeParameters, newReceiverType, newReturnType
|
baseProperty,
|
||||||
|
newTypeParameters,
|
||||||
|
newReceiverType,
|
||||||
|
newReturnType
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
return symbol
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirPropertyBuilder.configureAnnotationsTypeParametersAndSignature(
|
private fun FirPropertyBuilder.configureAnnotationsTypeParametersAndSignature(
|
||||||
|
|||||||
+9
-28
@@ -7,10 +7,7 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker
|
import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||||
@@ -145,36 +142,20 @@ class FirTypeIntersectionScope private constructor(
|
|||||||
isIntersectionOverride = true
|
isIntersectionOverride = true
|
||||||
)
|
)
|
||||||
val mostSpecificFunction = mostSpecific.fir
|
val mostSpecificFunction = mostSpecific.fir
|
||||||
createFunctionCopy(mostSpecific.fir, newSymbol).apply {
|
FirClassSubstitutionScope.createCopyForFirFunction(
|
||||||
resolvePhase = mostSpecificFunction.resolvePhase
|
newSymbol,
|
||||||
origin = FirDeclarationOrigin.IntersectionOverride
|
mostSpecificFunction, session, FirDeclarationOrigin.IntersectionOverride,
|
||||||
typeParameters += mostSpecificFunction.typeParameters
|
mostSpecificFunction.isExpect,
|
||||||
valueParameters += mostSpecificFunction.valueParameters.mapIndexed { index, mostSpecificParameter ->
|
)
|
||||||
val overriddenWithDefault =
|
|
||||||
extractedOverrides.firstOrNull {
|
|
||||||
it.member.fir.valueParameters.getOrNull(index)?.defaultValue != null
|
|
||||||
}?.member?.fir
|
|
||||||
if (overriddenWithDefault == null) {
|
|
||||||
mostSpecificParameter
|
|
||||||
} else {
|
|
||||||
val overriddenWithDefaultParameter = overriddenWithDefault.valueParameters[index]
|
|
||||||
createValueParameterCopy(mostSpecificParameter, null).apply {
|
|
||||||
annotations += mostSpecificParameter.annotations
|
|
||||||
}.build()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.build()
|
|
||||||
return newSymbol
|
return newSymbol
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createIntersectionOverride(mostSpecific: FirPropertySymbol): FirPropertySymbol {
|
private fun createIntersectionOverride(mostSpecific: FirPropertySymbol): FirPropertySymbol {
|
||||||
val newSymbol = FirPropertySymbol(mostSpecific.callableId, mostSpecific.isFakeOverride, mostSpecific, isIntersectionOverride = true)
|
val newSymbol = FirPropertySymbol(mostSpecific.callableId, mostSpecific.isFakeOverride, mostSpecific, isIntersectionOverride = true)
|
||||||
val mostSpecificProperty = mostSpecific.fir
|
val mostSpecificProperty = mostSpecific.fir
|
||||||
createPropertyCopy(mostSpecific.fir, newSymbol).apply {
|
FirClassSubstitutionScope.createCopyForFirProperty(
|
||||||
resolvePhase = mostSpecificProperty.resolvePhase
|
newSymbol, mostSpecificProperty, mostSpecificProperty.session
|
||||||
origin = FirDeclarationOrigin.IntersectionOverride
|
)
|
||||||
typeParameters += mostSpecificProperty.typeParameters
|
|
||||||
}.build()
|
|
||||||
return newSymbol
|
return newSymbol
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user