[FIR] Extract ConstructorScopeTowerLevel
This commit is contained in:
+4
-1
@@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-4
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user