FIR: Fix phase requirement for call resolution

This commit is contained in:
Denis Zharkov
2020-08-26 16:13:14 +03:00
parent ff182f191e
commit fcc2abcf40
2 changed files with 15 additions and 3 deletions
@@ -5,11 +5,10 @@
package org.jetbrains.kotlin.fir.resolve.calls.tower
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.resolve.calls.*
import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolved
import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolvedForCalls
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
@@ -150,7 +149,7 @@ private class TowerScopeLevelProcessor(
implicitExtensionReceiverValue: ImplicitReceiverValue<*>?,
builtInExtensionFunctionReceiverValue: ReceiverValue?
) {
symbol.ensureResolved(FirResolvePhase.CONTRACTS, candidateFactory.bodyResolveComponents.session)
symbol.ensureResolvedForCalls(candidateFactory.bodyResolveComponents.session)
// Check explicit extension receiver for default package members
if (symbol is FirNamedFunctionSymbol && dispatchReceiverValue == null &&
(implicitExtensionReceiverValue == null) != (explicitReceiver == null) &&
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
@@ -33,3 +35,14 @@ fun <D> AbstractFirBasedSymbol<D>.ensureResolved(
resolver.ensureResolved(this, requiredPhase)
}
fun <D> AbstractFirBasedSymbol<D>.ensureResolvedForCalls(
useSiteSession: FirSession,
) where D : FirDeclaration, D : FirSymbolOwner<D> {
val requiredPhase = when (this.fir) {
is FirFunction<*>, is FirProperty -> FirResolvePhase.CONTRACTS
else -> FirResolvePhase.STATUS
}
ensureResolved(requiredPhase, useSiteSession)
}