FIR: Get rid of SessionBasedTowerLevel
This commit is contained in:
+1
-1
@@ -436,7 +436,7 @@ private class InvokeFunctionResolveTask(
|
||||
}
|
||||
|
||||
private suspend fun processLevelForRegularInvoke(
|
||||
towerLevel: SessionBasedTowerLevel,
|
||||
towerLevel: TowerScopeLevel,
|
||||
callInfo: CallInfo,
|
||||
group: TowerGroup,
|
||||
explicitReceiverKind: ExplicitReceiverKind
|
||||
|
||||
+5
-6
@@ -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
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@ internal class TowerLevelHandler {
|
||||
info: CallInfo,
|
||||
explicitReceiverKind: ExplicitReceiverKind,
|
||||
group: TowerGroup,
|
||||
towerLevel: SessionBasedTowerLevel
|
||||
towerLevel: TowerScopeLevel
|
||||
): ProcessResult {
|
||||
processResult = ProcessResult.SCOPE_EMPTY
|
||||
val processor =
|
||||
|
||||
+10
-18
@@ -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 ->
|
||||
|
||||
Reference in New Issue
Block a user