FIR: Get rid of SessionBasedTowerLevel

This commit is contained in:
Denis.Zharkov
2022-02-18 18:40:41 +03:00
committed by teamcity
parent 150f951fb2
commit 9a070ad4f6
4 changed files with 17 additions and 26 deletions
@@ -436,7 +436,7 @@ private class InvokeFunctionResolveTask(
}
private suspend fun processLevelForRegularInvoke(
towerLevel: SessionBasedTowerLevel,
towerLevel: TowerScopeLevel,
callInfo: CallInfo,
group: TowerGroup,
explicitReceiverKind: ExplicitReceiverKind
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.fir.resolve.calls.tower
import org.jetbrains.kotlin.fir.util.asReversedFrozen
import org.jetbrains.kotlin.fir.declarations.FirTowerDataContext
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
@@ -18,6 +17,7 @@ import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.FirWhenSubjectImportingScope
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef
import org.jetbrains.kotlin.fir.util.asReversedFrozen
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
import org.jetbrains.kotlin.resolve.descriptorUtil.HIDES_MEMBERS_NAME_LIST
@@ -66,7 +66,7 @@ internal abstract class FirBaseTowerResolveTask(
open fun onSuccessfulLevel(towerGroup: TowerGroup) {}
protected suspend inline fun processLevel(
towerLevel: SessionBasedTowerLevel,
towerLevel: TowerScopeLevel,
callInfo: CallInfo,
group: TowerGroup,
explicitReceiverKind: ExplicitReceiverKind = ExplicitReceiverKind.NO_EXPLICIT_RECEIVER,
@@ -82,7 +82,7 @@ internal abstract class FirBaseTowerResolveTask(
withHideMembersOnly: Boolean = false,
includeInnerConstructors: Boolean = extensionReceiver != null,
): ScopeTowerLevel = ScopeTowerLevel(
session, components, this,
components, this,
extensionReceiver, withHideMembersOnly, includeInnerConstructors
)
@@ -90,9 +90,8 @@ internal abstract class FirBaseTowerResolveTask(
extensionReceiver: ReceiverValue? = null,
implicitExtensionInvokeMode: Boolean = false
) = MemberScopeTowerLevel(
session, components, this,
components, this,
extensionReceiver, implicitExtensionInvokeMode,
scopeSession = components.scopeSession
)
protected inline fun enumerateTowerLevels(
@@ -126,7 +125,7 @@ internal abstract class FirBaseTowerResolveTask(
* @return true if level is empty
*/
private suspend fun processLevel(
towerLevel: SessionBasedTowerLevel,
towerLevel: TowerScopeLevel,
callInfo: CallInfo,
group: TowerGroup,
explicitReceiverKind: ExplicitReceiverKind
@@ -29,7 +29,7 @@ internal class TowerLevelHandler {
info: CallInfo,
explicitReceiverKind: ExplicitReceiverKind,
group: TowerGroup,
towerLevel: SessionBasedTowerLevel
towerLevel: TowerScopeLevel
): ProcessResult {
processResult = ProcessResult.SCOPE_EMPTY
val processor =
@@ -65,13 +65,6 @@ abstract class TowerScopeLevel {
}
}
abstract class SessionBasedTowerLevel(val session: FirSession) : TowerScopeLevel() {
protected fun FirCallableSymbol<*>.hasConsistentExtensionReceiver(extensionReceiver: Receiver?): Boolean {
return (extensionReceiver != null) == hasExtensionReceiver()
}
open fun replaceReceiverValue(receiverValue: ReceiverValue) = this
}
// This is more like "dispatch receiver-based tower level"
// Here we always have an explicit or implicit dispatch receiver, and can access members of its scope
@@ -80,13 +73,14 @@ abstract class SessionBasedTowerLevel(val session: FirSession) : TowerScopeLevel
// So: extension receiver = either none, if dispatch receiver = explicit receiver,
// or given implicit or explicit receiver, otherwise
class MemberScopeTowerLevel(
session: FirSession,
private val bodyResolveComponents: BodyResolveComponents,
val dispatchReceiverValue: ReceiverValue,
private val extensionReceiver: ReceiverValue? = null,
private val implicitExtensionInvokeMode: Boolean = false,
private val scopeSession: ScopeSession
) : SessionBasedTowerLevel(session) {
) : TowerScopeLevel() {
private val scopeSession: ScopeSession get() = bodyResolveComponents.scopeSession
private val session: FirSession get() = bodyResolveComponents.session
private fun <T : FirBasedSymbol<*>> processMembers(
output: TowerScopeLevelProcessor<T>,
processScopeMembers: FirScope.(processor: (T) -> Unit) -> Unit
@@ -205,12 +199,6 @@ class MemberScopeTowerLevel(
return ProcessResult.FOUND
}
override fun replaceReceiverValue(receiverValue: ReceiverValue): SessionBasedTowerLevel {
return MemberScopeTowerLevel(
session, bodyResolveComponents, receiverValue, extensionReceiver, implicitExtensionInvokeMode, scopeSession
)
}
private inline fun withMemberCallLookup(
lookupTracker: FirLookupTrackerComponent?,
info: CallInfo,
@@ -232,6 +220,10 @@ class MemberScopeTowerLevel(
}
}
}
private fun FirCallableSymbol<*>.hasConsistentExtensionReceiver(extensionReceiver: Receiver?): Boolean {
return (extensionReceiver != null) == hasExtensionReceiver()
}
}
// This is more like "scope-based tower level"
@@ -242,13 +234,13 @@ class MemberScopeTowerLevel(
// So: extension receiver = either none or explicit
// (if explicit receiver exists, it always *should* be an extension receiver)
class ScopeTowerLevel(
session: FirSession,
private val bodyResolveComponents: BodyResolveComponents,
val scope: FirScope,
val extensionReceiver: ReceiverValue?,
private val withHideMembersOnly: Boolean,
private val includeInnerConstructors: Boolean
) : SessionBasedTowerLevel(session) {
) : TowerScopeLevel() {
private val session: FirSession get() = bodyResolveComponents.session
private fun dispatchReceiverValue(candidate: FirCallableSymbol<*>): ReceiverValue? {
candidate.fir.importedFromObjectData?.let { data ->