[FIR] Don't copy VP default values for fake overrides

In general, overrides should not
contain default values, and it's
better to make fake overrides be close
to proper overrides as much as
possible. It will be important when
we begin running `FirOverrideChecker`
for fake overrides.

^KT-63879 Fixed
^KT-65534
This commit is contained in:
Nikolay Lunyak
2023-11-29 11:42:49 +02:00
committed by Space Team
parent 249886fb13
commit 3b5fff5473
39 changed files with 144 additions and 111 deletions
@@ -135,7 +135,8 @@ object FirFakeOverrideGenerator {
attributes = baseFunction.attributes.copy()
typeParameters += configureAnnotationsTypeParametersAndSignature(
session, baseFunction, newParameterTypes, newTypeParameters,
newReceiverType, newContextReceiverTypes, newReturnType, deferredReturnTypeCalculation, newSymbol
newReceiverType, newContextReceiverTypes, newReturnType, deferredReturnTypeCalculation, newSymbol,
copyDefaultValues = false,
).filterIsInstance<FirTypeParameter>()
deprecationsProvider = baseFunction.deprecationsProvider
}.apply {
@@ -181,7 +182,13 @@ object FirFakeOverrideGenerator {
newContextReceiverTypes,
newReturnType,
deferredReturnTypeCalculation,
fakeOverrideSymbol
fakeOverrideSymbol,
// Copying default values here is important, because constructors don't
// override anything and we rely on this fact when mapping arguments
// during resolution.
// See: FirDefaultParametersResolver.declaresDefaultValue()
// See: testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/constructor-declaration/p-5/pos/3.4.kt
copyDefaultValues = true,
)
dispatchReceiverType = newDispatchReceiverType
@@ -204,6 +211,7 @@ object FirFakeOverrideGenerator {
newReturnType: ConeKotlinType?,
deferredReturnTypeCalculation: CallableCopyDeferredReturnTypeCalculation?,
symbolForOverride: FirFunctionSymbol<*>,
copyDefaultValues: Boolean = false,
): List<FirTypeParameterRef> {
return when {
baseFunction.typeParameters.isEmpty() -> {
@@ -216,6 +224,7 @@ object FirFakeOverrideGenerator {
newReturnType,
deferredReturnTypeCalculation,
origin,
copyDefaultValues,
)
emptyList()
}
@@ -243,6 +252,7 @@ object FirFakeOverrideGenerator {
copiedReturnType,
newCallableCopySubstitutionForTypeUpdater,
origin,
copyDefaultValues,
)
copiedTypeParameters
}
@@ -256,6 +266,7 @@ object FirFakeOverrideGenerator {
newReturnType,
deferredReturnTypeCalculation,
origin,
copyDefaultValues,
)
newTypeParameters
}
@@ -271,6 +282,7 @@ object FirFakeOverrideGenerator {
newReturnType: ConeKotlinType?,
deferredTypeCalculation: CallableCopyDeferredReturnTypeCalculation?,
origin: FirDeclarationOrigin,
copyDefaultValues: Boolean = false,
) {
checkStatusIsResolved(baseFunction)
annotations += baseFunction.annotations
@@ -304,7 +316,8 @@ object FirFakeOverrideGenerator {
valueParameter.returnTypeRef.withReplacedConeType(newType),
origin,
fakeFunctionSymbol,
this@configureAnnotationsAndSignature.source ?: valueParameter.source
this@configureAnnotationsAndSignature.source ?: valueParameter.source,
copyDefaultValues,
)
}
@@ -322,18 +335,21 @@ object FirFakeOverrideGenerator {
returnTypeRef: FirTypeRef,
origin: FirDeclarationOrigin,
containingFunctionSymbol: FirFunctionSymbol<*>,
source: KtSourceElement?
source: KtSourceElement?,
copyDefaultValues: Boolean = true,
): FirValueParameter = buildValueParameterCopy(original) {
this.origin = origin
this.source = source
this.returnTypeRef = returnTypeRef
symbol = FirValueParameterSymbol(original.name)
this.containingFunctionSymbol = containingFunctionSymbol
defaultValue = defaultValue?.let {
buildExpressionStub {
coneTypeOrNull = returnTypeRef.coneTypeOrNull
defaultValue = defaultValue
?.takeIf { copyDefaultValues }
?.let {
buildExpressionStub {
coneTypeOrNull = returnTypeRef.coneTypeOrNull
}
}
}
resolvePhase = origin.resolvePhaseForCopy
}