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
|
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()
|
||||||
|
|
||||||
|
|||||||
+2
-3
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user