K2: deal with callable copy return type update more accurately
Related to KT-61443
This commit is contained in:
committed by
Space Team
parent
f8ada456e4
commit
5e8741db1a
+1
-1
@@ -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()
|
||||
|
||||
|
||||
+2
-3
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+4
-3
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user