[FIR-IDE] Properly calculate return type for fake overrides
This commit is contained in:
committed by
TeamCityServer
parent
37a34e12d0
commit
a13696072d
+16
-16
@@ -18,14 +18,13 @@ import org.jetbrains.kotlin.fir.resolve.transformers.FirTransformerBasedResolveP
|
|||||||
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
|
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.TransformImplicitType
|
import org.jetbrains.kotlin.fir.resolve.transformers.TransformImplicitType
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.contracts.runContractResolveForLocalClass
|
import org.jetbrains.kotlin.fir.resolve.transformers.contracts.runContractResolveForLocalClass
|
||||||
import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator
|
import org.jetbrains.kotlin.fir.scopes.fakeOverrideSubstitution
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
|
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
|
||||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
|
||||||
|
|
||||||
@OptIn(AdapterForResolveProcessor::class)
|
@OptIn(AdapterForResolveProcessor::class)
|
||||||
class FirImplicitTypeBodyResolveProcessor(
|
class FirImplicitTypeBodyResolveProcessor(
|
||||||
@@ -225,21 +224,22 @@ private class ReturnTypeCalculatorWithJump(
|
|||||||
return tryCalculateReturnType(declaration.getter.delegate)
|
return tryCalculateReturnType(declaration.getter.delegate)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (declaration.isIntersectionOverride) {
|
if (declaration.isSubstitutionOrIntersectionOverride) {
|
||||||
val result = tryCalculateReturnType(declaration.symbol.baseForIntersectionOverride!!.fir)
|
val fakeOverrideSubstitution = declaration.attributes.fakeOverrideSubstitution
|
||||||
declaration.replaceReturnTypeRef(result)
|
?: return declaration.returnTypeRef as FirResolvedTypeRef
|
||||||
session.lookupTracker?.recordTypeResolveAsLookup(result, declaration.source, null)
|
synchronized(fakeOverrideSubstitution) {
|
||||||
return result
|
(declaration.returnTypeRef as? FirResolvedTypeRef)?.let { return it }
|
||||||
}
|
declaration.attributes.fakeOverrideSubstitution = null
|
||||||
|
val (substitutor, baseSymbol) = fakeOverrideSubstitution
|
||||||
runIf(declaration.isSubstitutionOverride) {
|
val baseDeclaration = baseSymbol.fir as FirTypedDeclaration
|
||||||
val overriddenDeclaration = declaration.originalForSubstitutionOverride ?: return@runIf
|
val baseReturnTypeRef = tryCalculateReturnType(baseDeclaration)
|
||||||
tryCalculateReturnType(overriddenDeclaration)
|
val baseReturnType = baseReturnTypeRef.type
|
||||||
val result = FakeOverrideTypeCalculator.Forced.computeReturnType(declaration)
|
session.lookupTracker?.recordTypeResolveAsLookup(baseReturnTypeRef, declaration.source, null)
|
||||||
(declaration.returnTypeRef as? FirResolvedTypeRef)?.let {
|
val coneType = substitutor.substituteOrSelf(baseReturnType)
|
||||||
session.lookupTracker?.recordTypeResolveAsLookup(it, declaration.source, null)
|
val returnType = declaration.returnTypeRef.resolvedTypeFromPrototype(coneType)
|
||||||
|
declaration.replaceReturnTypeRef(returnType)
|
||||||
|
return returnType
|
||||||
}
|
}
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return when (val status = implicitBodyResolveComputationSession.getStatus(declaration.symbol)) {
|
return when (val status = implicitBodyResolveComputationSession.getStatus(declaration.symbol)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user