K2: deal with callable copy return type update more accurately

Related to KT-61443
This commit is contained in:
Mikhail Glukhikh
2023-09-14 13:40:01 +02:00
committed by Space Team
parent f8ada456e4
commit 5e8741db1a
4 changed files with 10 additions and 7 deletions
@@ -90,7 +90,7 @@ class DelegatedMemberGenerator(private val components: Fir2IrComponents) : Fir2I
val delegateToScope = firField.initializer!!.resolvedType
.fullyExpandedType(session)
.lowerBoundIfFlexible()
.scope(session, scopeSession, CallableCopyTypeCalculator.DoNothing, null) ?: return
.scope(session, scopeSession, CallableCopyTypeCalculator.Forced, null) ?: return
val subClassLookupTag = firSubClass.symbol.toLookupTag()
@@ -6,8 +6,7 @@
package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.isDelegated
import org.jetbrains.kotlin.fir.isSubstitutionOrIntersectionOverride
import org.jetbrains.kotlin.fir.isCopyCreatedInScope
import org.jetbrains.kotlin.fir.scopes.CallableCopyTypeCalculator
import org.jetbrains.kotlin.fir.scopes.FirDelegatingTypeScope
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
@@ -60,7 +59,7 @@ class FirScopeWithCallableCopyReturnTypeUpdater(
}
private fun updateReturnType(declaration: FirCallableDeclaration) {
if (declaration.isSubstitutionOrIntersectionOverride || declaration.isDelegated) {
if (declaration.isCopyCreatedInScope) {
callableCopyTypeCalculator.computeReturnType(declaration)
}
}
@@ -228,7 +228,7 @@ open class ReturnTypeCalculatorWithJump(
}
}
if (declaration.isSubstitutionOrIntersectionOverride) {
if (declaration.isCopyCreatedInScope) {
val callableCopySubstitutionForTypeUpdater = declaration.attributes.callableCopySubstitutionForTypeUpdater
?: return declaration.returnTypeRef as FirResolvedTypeRef
@@ -278,8 +278,9 @@ open class ReturnTypeCalculatorWithJump(
private fun computeReturnTypeRef(declaration: FirCallableDeclaration): FirResolvedTypeRef {
(declaration.returnTypeRef as? FirResolvedTypeRef)?.let { return it }
val symbol = declaration.symbol
require(!symbol.isSubstitutionOrIntersectionOverride) {
"fakeOverrideSubstitution was not calculated for substitution or intersection override: $symbol with ${declaration.returnTypeRef}"
require(!symbol.isCopyCreatedInScope) {
"callableCopySubstitution was not calculated for callable copy: " +
"$symbol with origin ${declaration.origin} and return type ${declaration.returnTypeRef}"
}
return resolveDeclaration(declaration)
@@ -70,10 +70,13 @@ val FirCallableDeclaration.isIntersectionOverride: Boolean get() = origin == Fir
val FirCallableDeclaration.isSubstitutionOverride: Boolean get() = origin is FirDeclarationOrigin.SubstitutionOverride
val FirCallableDeclaration.isSubstitutionOrIntersectionOverride: Boolean get() = isSubstitutionOverride || isIntersectionOverride
val FirCallableDeclaration.isDelegated: Boolean get() = origin == FirDeclarationOrigin.Delegated
val FirCallableDeclaration.isCopyCreatedInScope: Boolean get() = isSubstitutionOrIntersectionOverride || isDelegated
val FirCallableSymbol<*>.isIntersectionOverride: Boolean get() = origin == FirDeclarationOrigin.IntersectionOverride
val FirCallableSymbol<*>.isSubstitutionOverride: Boolean get() = origin is FirDeclarationOrigin.SubstitutionOverride
val FirCallableSymbol<*>.isSubstitutionOrIntersectionOverride: Boolean get() = isSubstitutionOverride || isIntersectionOverride
val FirCallableSymbol<*>.isDelegated: Boolean get() = origin == FirDeclarationOrigin.Delegated
val FirCallableSymbol<*>.isCopyCreatedInScope: Boolean get() = isSubstitutionOrIntersectionOverride || isDelegated
inline val <reified D : FirCallableDeclaration> D.originalForSubstitutionOverride: D?
get() = if (isSubstitutionOverride || isSynthetic) originalForSubstitutionOverrideAttr else null