FIR: Provide BodyResolveComponents instead of InferenceComponents to resolution

It seems to be more reasonable to store SamResolver, ScopeSession
and other per-transformer/per-thread components there
This commit is contained in:
Denis Zharkov
2019-09-12 12:37:58 +03:00
parent 5567620563
commit 5ebde93eb9
10 changed files with 48 additions and 41 deletions
@@ -12,13 +12,14 @@ import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedQualifierImpl import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedQualifierImpl
import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.references.FirBackingFieldReferenceImpl
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl
import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.ImplicitReceiverStack import org.jetbrains.kotlin.fir.resolve.ImplicitReceiverStack
import org.jetbrains.kotlin.fir.resolve.calls.* import org.jetbrains.kotlin.fir.resolve.calls.*
import org.jetbrains.kotlin.fir.resolve.transformers.* import org.jetbrains.kotlin.fir.resolve.transformers.*
import org.jetbrains.kotlin.fir.resolve.transformers.StoreNameReference
import org.jetbrains.kotlin.fir.resolve.transformers.resultType
import org.jetbrains.kotlin.fir.resolve.typeForQualifier import org.jetbrains.kotlin.fir.resolve.typeForQualifier
import org.jetbrains.kotlin.fir.resolve.typeFromCallee import org.jetbrains.kotlin.fir.resolve.typeFromCallee
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
@@ -60,12 +61,12 @@ class FirCallResolver(
transformer.container transformer.container
) { it.resultType } ) { it.resultType }
val resolver = CallResolver( val resolver = CallResolver(
returnTypeCalculator, inferenceComponents, resolutionStageRunner, returnTypeCalculator, this, resolutionStageRunner,
topLevelScopes = topLevelScopes.asReversed(), topLevelScopes = topLevelScopes.asReversed(),
localScopes = localScopes.asReversed() localScopes = localScopes.asReversed()
) )
val consumer = createFunctionConsumer(session, name, info, inferenceComponents, resolver.collector, resolver) val consumer = createFunctionConsumer(session, name, info, this, resolver.collector, resolver)
val result = resolver.runTowerResolver(consumer, implicitReceiverStack.receiversAsReversed()) val result = resolver.runTowerResolver(consumer, implicitReceiverStack.receiversAsReversed())
val bestCandidates = result.bestCandidates() val bestCandidates = result.bestCandidates()
val reducedCandidates = if (result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED) { val reducedCandidates = if (result.currentApplicability < CandidateApplicability.SYNTHETIC_RESOLVED) {
@@ -154,7 +155,7 @@ class FirCallResolver(
transformer.container transformer.container
) { it.resultType } ) { it.resultType }
val resolver = CallResolver( val resolver = CallResolver(
returnTypeCalculator, inferenceComponents, resolutionStageRunner, returnTypeCalculator, this, resolutionStageRunner,
topLevelScopes = topLevelScopes.asReversed(), topLevelScopes = topLevelScopes.asReversed(),
localScopes = localScopes.asReversed() localScopes = localScopes.asReversed()
) )
@@ -162,7 +163,7 @@ class FirCallResolver(
val consumer = createVariableAndObjectConsumer( val consumer = createVariableAndObjectConsumer(
session, session,
callee.name, callee.name,
info, inferenceComponents, info, this,
resolver.collector resolver.collector
) )
val result = resolver.runTowerResolver(consumer, implicitReceiverStack.receiversAsReversed()) val result = resolver.runTowerResolver(consumer, implicitReceiverStack.receiversAsReversed())
@@ -252,4 +253,4 @@ class FirCallResolver(
else -> "$symbol" else -> "$symbol"
} }
} }
} }
@@ -30,7 +30,8 @@ interface BodyResolveComponents : SessionHolder {
val container: FirDeclaration val container: FirDeclaration
val inferenceComponents: InferenceComponents val inferenceComponents: InferenceComponents
val resolutionStageRunner: ResolutionStageRunner val resolutionStageRunner: ResolutionStageRunner
val scopeSession: ScopeSession
val <D> AbstractFirBasedSymbol<D>.phasedFir: D where D : FirDeclaration, D : FirSymbolOwner<D> val <D> AbstractFirBasedSymbol<D>.phasedFir: D where D : FirDeclaration, D : FirSymbolOwner<D>
get() = phasedFir(session, FirResolvePhase.DECLARATIONS) get() = phasedFir(session, FirResolvePhase.DECLARATIONS)
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.resolve.calls package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope
@@ -17,8 +18,8 @@ enum class TowerDataKind {
class CallResolver( class CallResolver(
val typeCalculator: ReturnTypeCalculator, val typeCalculator: ReturnTypeCalculator,
val components: InferenceComponents, val components: BodyResolveComponents,
val resolutionStageRunner: ResolutionStageRunner, private val resolutionStageRunner: ResolutionStageRunner,
val topLevelScopes: List<FirScope>, val topLevelScopes: List<FirScope>,
val localScopes: List<FirLocalScope> val localScopes: List<FirLocalScope>
) { ) {
@@ -207,4 +208,4 @@ class CallResolver(
return collector return collector
} }
} }
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
@@ -49,17 +50,17 @@ class Candidate(
val dispatchReceiverValue: ClassDispatchReceiverValue?, val dispatchReceiverValue: ClassDispatchReceiverValue?,
val implicitExtensionReceiverValue: ImplicitReceiverValue<*>?, val implicitExtensionReceiverValue: ImplicitReceiverValue<*>?,
val explicitReceiverKind: ExplicitReceiverKind, val explicitReceiverKind: ExplicitReceiverKind,
private val inferenceComponents: InferenceComponents, private val bodyResolveComponents: BodyResolveComponents,
private val baseSystem: ConstraintStorage, private val baseSystem: ConstraintStorage,
val callInfo: CallInfo val callInfo: CallInfo
) { ) {
val system by lazy { val system by lazy {
val system = inferenceComponents.createConstraintSystem() val system = bodyResolveComponents.inferenceComponents.createConstraintSystem()
system.addOtherSystem(baseSystem) system.addOtherSystem(baseSystem)
system system
} }
val samResolver get() = inferenceComponents.samResolver val samResolver get() = bodyResolveComponents.inferenceComponents.samResolver
lateinit var substitutor: ConeSubstitutor lateinit var substitutor: ConeSubstitutor
@@ -6,12 +6,13 @@
package org.jetbrains.kotlin.fir.resolve.calls package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
open class CandidateCollector( open class CandidateCollector(
val components: InferenceComponents, val components: BodyResolveComponents,
val resolutionStageRunner: ResolutionStageRunner val resolutionStageRunner: ResolutionStageRunner
) { ) {
val groupNumbers = mutableListOf<Int>() val groupNumbers = mutableListOf<Int>()
@@ -70,7 +71,7 @@ open class CandidateCollector(
class InvokeReceiverCandidateCollector( class InvokeReceiverCandidateCollector(
val callResolver: CallResolver, val callResolver: CallResolver,
val invokeCallInfo: CallInfo, val invokeCallInfo: CallInfo,
components: InferenceComponents, components: BodyResolveComponents,
val invokeConsumer: AccumulatingTowerDataConsumer, val invokeConsumer: AccumulatingTowerDataConsumer,
resolutionStageRunner: ResolutionStageRunner resolutionStageRunner: ResolutionStageRunner
) : CandidateCollector(components, resolutionStageRunner) { ) : CandidateCollector(components, resolutionStageRunner) {
@@ -104,7 +105,7 @@ class InvokeReceiverCandidateCollector(
invokeConsumer.addConsumer( invokeConsumer.addConsumer(
createSimpleFunctionConsumer( createSimpleFunctionConsumer(
session, OperatorNameConventions.INVOKE, session, OperatorNameConventions.INVOKE,
boundInvokeCallInfo, components, callResolver.collector boundInvokeCallInfo, callResolver.components, callResolver.collector
) )
) )
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.resolve.calls package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.returnExpressions import org.jetbrains.kotlin.fir.returnExpressions
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer
@@ -13,14 +14,14 @@ import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
class CandidateFactory( class CandidateFactory(
val inferenceComponents: InferenceComponents, val bodyResolveComponents: BodyResolveComponents,
val callInfo: CallInfo private val callInfo: CallInfo
) { ) {
val baseSystem: ConstraintStorage private val baseSystem: ConstraintStorage
init { init {
val system = inferenceComponents.createConstraintSystem() val system = bodyResolveComponents.inferenceComponents.createConstraintSystem()
callInfo.explicitReceiver?.let { system.addSubsystemFromExpression(it) } callInfo.explicitReceiver?.let { system.addSubsystemFromExpression(it) }
callInfo.arguments.forEach { callInfo.arguments.forEach {
system.addSubsystemFromExpression(it) system.addSubsystemFromExpression(it)
@@ -36,7 +37,7 @@ class CandidateFactory(
): Candidate { ): Candidate {
return Candidate( return Candidate(
symbol, dispatchReceiverValue, implicitExtensionReceiverValue, symbol, dispatchReceiverValue, implicitExtensionReceiverValue,
explicitReceiverKind, inferenceComponents, baseSystem, callInfo explicitReceiverKind, bodyResolveComponents, baseSystem, callInfo
) )
} }
} }
@@ -54,4 +55,4 @@ internal fun FirResolvable.candidate(): Candidate? {
is FirNamedReferenceWithCandidate -> return callee.candidate is FirNamedReferenceWithCandidate -> return callee.candidate
else -> null else -> null
} }
} }
@@ -7,13 +7,14 @@ package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
fun createVariableAndObjectConsumer( fun createVariableAndObjectConsumer(
session: FirSession, session: FirSession,
name: Name, name: Name,
callInfo: CallInfo, callInfo: CallInfo,
inferenceComponents: InferenceComponents, bodyResolveComponents: BodyResolveComponents,
resultCollector: CandidateCollector resultCollector: CandidateCollector
): TowerDataConsumer { ): TowerDataConsumer {
return PrioritizedTowerDataConsumer( return PrioritizedTowerDataConsumer(
@@ -23,7 +24,7 @@ fun createVariableAndObjectConsumer(
name, name,
TowerScopeLevel.Token.Properties, TowerScopeLevel.Token.Properties,
callInfo, callInfo,
inferenceComponents, bodyResolveComponents,
resultCollector resultCollector
), ),
createSimpleConsumer( createSimpleConsumer(
@@ -31,7 +32,7 @@ fun createVariableAndObjectConsumer(
name, name,
TowerScopeLevel.Token.Objects, TowerScopeLevel.Token.Objects,
callInfo, callInfo,
inferenceComponents, bodyResolveComponents,
resultCollector resultCollector
) )
) )
@@ -41,7 +42,7 @@ fun createSimpleFunctionConsumer(
session: FirSession, session: FirSession,
name: Name, name: Name,
callInfo: CallInfo, callInfo: CallInfo,
inferenceComponents: InferenceComponents, bodyResolveComponents: BodyResolveComponents,
resultCollector: CandidateCollector resultCollector: CandidateCollector
): TowerDataConsumer { ): TowerDataConsumer {
return createSimpleConsumer( return createSimpleConsumer(
@@ -49,7 +50,7 @@ fun createSimpleFunctionConsumer(
name, name,
TowerScopeLevel.Token.Functions, TowerScopeLevel.Token.Functions,
callInfo, callInfo,
inferenceComponents, bodyResolveComponents,
resultCollector resultCollector
) )
} }
@@ -58,7 +59,7 @@ fun createFunctionConsumer(
session: FirSession, session: FirSession,
name: Name, name: Name,
callInfo: CallInfo, callInfo: CallInfo,
inferenceComponents: InferenceComponents, bodyResolveComponents: BodyResolveComponents,
resultCollector: CandidateCollector, resultCollector: CandidateCollector,
callResolver: CallResolver callResolver: CallResolver
): TowerDataConsumer { ): TowerDataConsumer {
@@ -68,7 +69,7 @@ fun createFunctionConsumer(
emptyList(), emptyList(),
callInfo.isSafeCall, callInfo.isSafeCall,
callInfo.typeArguments, callInfo.typeArguments,
inferenceComponents.session, bodyResolveComponents.session,
callInfo.containingFile, callInfo.containingFile,
callInfo.container, callInfo.container,
callInfo.typeProvider callInfo.typeProvider
@@ -80,7 +81,7 @@ fun createFunctionConsumer(
name, name,
TowerScopeLevel.Token.Functions, TowerScopeLevel.Token.Functions,
callInfo, callInfo,
inferenceComponents, bodyResolveComponents,
resultCollector resultCollector
), ),
AccumulatingTowerDataConsumer(resultCollector).apply { AccumulatingTowerDataConsumer(resultCollector).apply {
@@ -89,11 +90,11 @@ fun createFunctionConsumer(
name, name,
TowerScopeLevel.Token.Properties, TowerScopeLevel.Token.Properties,
varCallInfo, varCallInfo,
inferenceComponents, bodyResolveComponents,
InvokeReceiverCandidateCollector( InvokeReceiverCandidateCollector(
callResolver, callResolver,
invokeCallInfo = callInfo, invokeCallInfo = callInfo,
components = inferenceComponents, components = bodyResolveComponents,
invokeConsumer = this, invokeConsumer = this,
resolutionStageRunner = resultCollector.resolutionStageRunner resolutionStageRunner = resultCollector.resolutionStageRunner
) )
@@ -107,10 +108,10 @@ fun createSimpleConsumer(
name: Name, name: Name,
token: TowerScopeLevel.Token<*>, token: TowerScopeLevel.Token<*>,
callInfo: CallInfo, callInfo: CallInfo,
inferenceComponents: InferenceComponents, bodyResolveComponents: BodyResolveComponents,
resultCollector: CandidateCollector resultCollector: CandidateCollector
): TowerDataConsumer { ): TowerDataConsumer {
val factory = CandidateFactory(inferenceComponents, callInfo) val factory = CandidateFactory(bodyResolveComponents, callInfo)
val explicitReceiver = callInfo.explicitReceiver val explicitReceiver = callInfo.explicitReceiver
return if (explicitReceiver != null) { return if (explicitReceiver != null) {
val receiverValue = ExpressionReceiverValue(explicitReceiver, callInfo.typeProvider) val receiverValue = ExpressionReceiverValue(explicitReceiver, callInfo.typeProvider)
@@ -167,7 +167,7 @@ class ExplicitReceiverTowerDataConsumer<T : AbstractFirBasedSymbol<*>>(
if (skipGroup(group, resultCollector)) return ProcessorAction.NEXT if (skipGroup(group, resultCollector)) return ProcessorAction.NEXT
return when (kind) { return when (kind) {
TowerDataKind.EMPTY -> TowerDataKind.EMPTY ->
MemberScopeTowerLevel(session, explicitReceiver, scopeSession = candidateFactory.inferenceComponents.scopeSession) MemberScopeTowerLevel(session, explicitReceiver, scopeSession = candidateFactory.bodyResolveComponents.scopeSession)
.processElementsByName( .processElementsByName(
token, token,
name, name,
@@ -220,7 +220,7 @@ class ExplicitReceiverTowerDataConsumer<T : AbstractFirBasedSymbol<*>>(
val declarationReceiverType = declarationReceiverTypeRef?.type val declarationReceiverType = declarationReceiverTypeRef?.type
if (declarationReceiverType is ConeClassType) { if (declarationReceiverType is ConeClassType) {
if (!AbstractTypeChecker.isSubtypeOf( if (!AbstractTypeChecker.isSubtypeOf(
candidateFactory.inferenceComponents.ctx, candidateFactory.bodyResolveComponents.inferenceComponents.ctx,
explicitReceiverType, explicitReceiverType,
declarationReceiverType.lookupTag.constructClassType( declarationReceiverType.lookupTag.constructClassType(
declarationReceiverType.typeArguments.map { ConeStarProjection }.toTypedArray(), declarationReceiverType.typeArguments.map { ConeStarProjection }.toTypedArray(),
@@ -46,7 +46,7 @@ open class FirBodyResolveTransformer(
final override val session: FirSession, final override val session: FirSession,
phase: FirResolvePhase, phase: FirResolvePhase,
implicitTypeOnly: Boolean, implicitTypeOnly: Boolean,
val scopeSession: ScopeSession = ScopeSession() final override val scopeSession: ScopeSession = ScopeSession()
) : FirAbstractPhaseTransformer<Any?>(phase), BodyResolveComponents { ) : FirAbstractPhaseTransformer<Any?>(phase), BodyResolveComponents {
var implicitTypeOnly: Boolean = implicitTypeOnly var implicitTypeOnly: Boolean = implicitTypeOnly
private set private set
@@ -87,7 +87,7 @@ class FirSyntheticCallGenerator(private val transformer: FirBodyResolveTransform
} }
private fun generateCandidate(callInfo: CallInfo, function: FirMemberFunctionImpl): Candidate = private fun generateCandidate(callInfo: CallInfo, function: FirMemberFunctionImpl): Candidate =
CandidateFactory(inferenceComponents, callInfo).createCandidate( CandidateFactory(transformer, callInfo).createCandidate(
symbol = function.symbol, symbol = function.symbol,
dispatchReceiverValue = null, dispatchReceiverValue = null,
implicitExtensionReceiverValue = null, implicitExtensionReceiverValue = null,
@@ -156,4 +156,4 @@ class FirSyntheticCallGenerator(private val transformer: FirBodyResolveTransform
).apply { ).apply {
this.resolvePhase = FirResolvePhase.BODY_RESOLVE this.resolvePhase = FirResolvePhase.BODY_RESOLVE
} }
} }