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 val delegateToScope = firField.initializer!!.resolvedType
.fullyExpandedType(session) .fullyExpandedType(session)
.lowerBoundIfFlexible() .lowerBoundIfFlexible()
.scope(session, scopeSession, CallableCopyTypeCalculator.DoNothing, null) ?: return .scope(session, scopeSession, CallableCopyTypeCalculator.Forced, null) ?: return
val subClassLookupTag = firSubClass.symbol.toLookupTag() val subClassLookupTag = firSubClass.symbol.toLookupTag()
@@ -6,8 +6,7 @@
package org.jetbrains.kotlin.fir.scopes.impl package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.isDelegated import org.jetbrains.kotlin.fir.isCopyCreatedInScope
import org.jetbrains.kotlin.fir.isSubstitutionOrIntersectionOverride
import org.jetbrains.kotlin.fir.scopes.CallableCopyTypeCalculator import org.jetbrains.kotlin.fir.scopes.CallableCopyTypeCalculator
import org.jetbrains.kotlin.fir.scopes.FirDelegatingTypeScope import org.jetbrains.kotlin.fir.scopes.FirDelegatingTypeScope
import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.scopes.FirTypeScope
@@ -60,7 +59,7 @@ class FirScopeWithCallableCopyReturnTypeUpdater(
} }
private fun updateReturnType(declaration: FirCallableDeclaration) { private fun updateReturnType(declaration: FirCallableDeclaration) {
if (declaration.isSubstitutionOrIntersectionOverride || declaration.isDelegated) { if (declaration.isCopyCreatedInScope) {
callableCopyTypeCalculator.computeReturnType(declaration) callableCopyTypeCalculator.computeReturnType(declaration)
} }
} }
@@ -228,7 +228,7 @@ open class ReturnTypeCalculatorWithJump(
} }
} }
if (declaration.isSubstitutionOrIntersectionOverride) { if (declaration.isCopyCreatedInScope) {
val callableCopySubstitutionForTypeUpdater = declaration.attributes.callableCopySubstitutionForTypeUpdater val callableCopySubstitutionForTypeUpdater = declaration.attributes.callableCopySubstitutionForTypeUpdater
?: return declaration.returnTypeRef as FirResolvedTypeRef ?: return declaration.returnTypeRef as FirResolvedTypeRef
@@ -278,8 +278,9 @@ open class ReturnTypeCalculatorWithJump(
private fun computeReturnTypeRef(declaration: FirCallableDeclaration): FirResolvedTypeRef { private fun computeReturnTypeRef(declaration: FirCallableDeclaration): FirResolvedTypeRef {
(declaration.returnTypeRef as? FirResolvedTypeRef)?.let { return it } (declaration.returnTypeRef as? FirResolvedTypeRef)?.let { return it }
val symbol = declaration.symbol val symbol = declaration.symbol
require(!symbol.isSubstitutionOrIntersectionOverride) { require(!symbol.isCopyCreatedInScope) {
"fakeOverrideSubstitution was not calculated for substitution or intersection override: $symbol with ${declaration.returnTypeRef}" "callableCopySubstitution was not calculated for callable copy: " +
"$symbol with origin ${declaration.origin} and return type ${declaration.returnTypeRef}"
} }
return resolveDeclaration(declaration) 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.isSubstitutionOverride: Boolean get() = origin is FirDeclarationOrigin.SubstitutionOverride
val FirCallableDeclaration.isSubstitutionOrIntersectionOverride: Boolean get() = isSubstitutionOverride || isIntersectionOverride val FirCallableDeclaration.isSubstitutionOrIntersectionOverride: Boolean get() = isSubstitutionOverride || isIntersectionOverride
val FirCallableDeclaration.isDelegated: Boolean get() = origin == FirDeclarationOrigin.Delegated 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<*>.isIntersectionOverride: Boolean get() = origin == FirDeclarationOrigin.IntersectionOverride
val FirCallableSymbol<*>.isSubstitutionOverride: Boolean get() = origin is FirDeclarationOrigin.SubstitutionOverride val FirCallableSymbol<*>.isSubstitutionOverride: Boolean get() = origin is FirDeclarationOrigin.SubstitutionOverride
val FirCallableSymbol<*>.isSubstitutionOrIntersectionOverride: Boolean get() = isSubstitutionOverride || isIntersectionOverride 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? inline val <reified D : FirCallableDeclaration> D.originalForSubstitutionOverride: D?
get() = if (isSubstitutionOverride || isSynthetic) originalForSubstitutionOverrideAttr else null get() = if (isSubstitutionOverride || isSynthetic) originalForSubstitutionOverrideAttr else null