[FIR-IDE] Properly calculate return type for fake overrides

This commit is contained in:
Dmitriy Novozhilov
2021-09-03 13:22:18 +03:00
committed by TeamCityServer
parent 37a34e12d0
commit a13696072d
@@ -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)) {