[FIR] Extract ConstructorScopeTowerLevel

This commit is contained in:
Mikhail Glukhikh
2020-05-08 18:42:59 +03:00
parent 22e7264460
commit db694dd7ab
2 changed files with 32 additions and 5 deletions
@@ -133,6 +133,9 @@ class FirTowerResolverSession internal constructor(
extensionReceiver, extensionsOnly, noInnerConstructors extensionReceiver, extensionsOnly, noInnerConstructors
) )
private fun FirScope.toConstructorScopeTowerLevel(): ConstructorScopeTowerLevel =
ConstructorScopeTowerLevel(session, this)
private fun ReceiverValue.toMemberScopeTowerLevel( private fun ReceiverValue.toMemberScopeTowerLevel(
extensionReceiver: ReceiverValue? = null, extensionReceiver: ReceiverValue? = null,
implicitExtensionInvokeMode: Boolean = false implicitExtensionInvokeMode: Boolean = false
@@ -217,7 +220,7 @@ class FirTowerResolverSession internal constructor(
} else { } else {
// Search for non-inner constructors only // Search for non-inner constructors only
processLevel( processLevel(
scope.toScopeTowerLevel(), scope.toConstructorScopeTowerLevel(),
info, TowerGroup.Member info, TowerGroup.Member
) )
} }
@@ -196,9 +196,9 @@ class ScopeTowerLevel(
session: FirSession, session: FirSession,
private val bodyResolveComponents: BodyResolveComponents, private val bodyResolveComponents: BodyResolveComponents,
val scope: FirScope, val scope: FirScope,
val extensionReceiver: ReceiverValue? = null, val extensionReceiver: ReceiverValue?,
private val extensionsOnly: Boolean = false, private val extensionsOnly: Boolean,
private val noInnerConstructors: Boolean = false private val noInnerConstructors: Boolean
) : SessionBasedTowerLevel(session) { ) : SessionBasedTowerLevel(session) {
private fun FirCallableSymbol<*>.hasConsistentReceivers(extensionReceiver: Receiver?): Boolean = private fun FirCallableSymbol<*>.hasConsistentReceivers(extensionReceiver: Receiver?): Boolean =
when { when {
@@ -279,15 +279,39 @@ class ScopeTowerLevel(
implicitExtensionReceiverValue = null implicitExtensionReceiverValue = null
) )
} }
TowerScopeLevel.Token.Constructors -> {
throw AssertionError("Should not be here")
}
}
return if (empty) ProcessorAction.NONE else ProcessorAction.NEXT
}
}
class ConstructorScopeTowerLevel(
session: FirSession,
val scope: FirScope
) : SessionBasedTowerLevel(session) {
override fun <T : AbstractFirBasedSymbol<*>> processElementsByName(
token: TowerScopeLevel.Token<T>,
name: Name,
processor: TowerScopeLevel.TowerScopeLevelProcessor<T>
): ProcessorAction {
var empty = true
when (token) {
TowerScopeLevel.Token.Constructors -> scope.processDeclaredConstructors { candidate -> TowerScopeLevel.Token.Constructors -> scope.processDeclaredConstructors { candidate ->
// NB: here we cannot resolve inner constructors, because they should have dispatch receiver // NB: here we cannot resolve inner constructors, because they should have dispatch receiver
if (!candidate.fir.isInner) { if (!candidate.fir.isInner) {
empty = false
processor.consumeCandidate( processor.consumeCandidate(
candidate as T, dispatchReceiverValue(scope, candidate), candidate as T,
dispatchReceiverValue = null,
implicitExtensionReceiverValue = null implicitExtensionReceiverValue = null
) )
} }
} }
else -> {
throw AssertionError("Should not be here: token = $token")
}
} }
return if (empty) ProcessorAction.NONE else ProcessorAction.NEXT return if (empty) ProcessorAction.NONE else ProcessorAction.NEXT
} }