From 5e8741db1a78de13e4292bc73862bb45cbfb5952 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 14 Sep 2023 13:40:01 +0200 Subject: [PATCH] K2: deal with callable copy return type update more accurately Related to KT-61443 --- .../fir/backend/generators/DelegatedMemberGenerator.kt | 2 +- .../impl/FirScopeWithCallableCopyReturnTypeUpdater.kt | 5 ++--- .../transformers/body/resolve/FirImplicitBodyResolve.kt | 7 ++++--- .../fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt | 3 +++ 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt index 197f0b462c8..d463b49473f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt @@ -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() diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirScopeWithCallableCopyReturnTypeUpdater.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirScopeWithCallableCopyReturnTypeUpdater.kt index 27c96e3e236..04947569ab7 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirScopeWithCallableCopyReturnTypeUpdater.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirScopeWithCallableCopyReturnTypeUpdater.kt @@ -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) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt index bd8f1110a72..44259d7aaa3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt @@ -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) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt index b6f2eae9f1b..04b1cf2fac9 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt @@ -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 D.originalForSubstitutionOverride: D? get() = if (isSubstitutionOverride || isSynthetic) originalForSubstitutionOverrideAttr else null