FIR: Replace extension receiver with explicit parameter
It will help to make code more explicit in the following commits
This commit is contained in:
+4
-7
@@ -86,15 +86,12 @@ class FirTowerResolverSession internal constructor(
|
|||||||
val levelHandler =
|
val levelHandler =
|
||||||
LevelHandler(
|
LevelHandler(
|
||||||
callInfo, explicitReceiverKind, group,
|
callInfo, explicitReceiverKind, group,
|
||||||
callResolutionContext, manager, this, components
|
callResolutionContext, manager, this, components,
|
||||||
)
|
)
|
||||||
val result = with(levelHandler) {
|
|
||||||
towerLevel.handleLevel(invokeResolveMode)
|
return levelHandler.handleLevel(towerLevel, invokeResolveMode).also {
|
||||||
|
manager.stopIfSuccess()
|
||||||
}
|
}
|
||||||
|
|
||||||
manager.stopIfSuccess()
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun processLevelForPropertyWithInvoke(
|
private suspend fun processLevelForPropertyWithInvoke(
|
||||||
|
|||||||
+14
-14
@@ -75,7 +75,7 @@ internal class LevelHandler(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun SessionBasedTowerLevel.handleLevel(invokeResolveMode: InvokeResolveMode? = null): ProcessorAction {
|
fun handleLevel(towerLevel: SessionBasedTowerLevel, invokeResolveMode: InvokeResolveMode? = null): ProcessorAction {
|
||||||
var result = ProcessorAction.NONE
|
var result = ProcessorAction.NONE
|
||||||
val processor =
|
val processor =
|
||||||
TowerScopeLevelProcessor(
|
TowerScopeLevelProcessor(
|
||||||
@@ -90,19 +90,19 @@ internal class LevelHandler(
|
|||||||
)
|
)
|
||||||
when (info.callKind) {
|
when (info.callKind) {
|
||||||
CallKind.VariableAccess -> {
|
CallKind.VariableAccess -> {
|
||||||
result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor)
|
result += towerLevel.processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor)
|
||||||
// TODO: more accurate condition, or process properties/object in some other way
|
// TODO: more accurate condition, or process properties/object in some other way
|
||||||
if (!resultCollector.isSuccess() &&
|
if (!resultCollector.isSuccess() &&
|
||||||
(this !is ScopeTowerLevel || this.extensionReceiver == null)
|
(towerLevel !is ScopeTowerLevel || towerLevel.extensionReceiver == null)
|
||||||
) {
|
) {
|
||||||
result += processElementsByName(TowerScopeLevel.Token.Objects, info.name, processor)
|
result += towerLevel.processElementsByName(TowerScopeLevel.Token.Objects, info.name, processor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CallKind.Function -> {
|
CallKind.Function -> {
|
||||||
val invokeBuiltinExtensionMode =
|
val invokeBuiltinExtensionMode =
|
||||||
invokeResolveMode == InvokeResolveMode.RECEIVER_FOR_INVOKE_BUILTIN_EXTENSION
|
invokeResolveMode == InvokeResolveMode.RECEIVER_FOR_INVOKE_BUILTIN_EXTENSION
|
||||||
if (!invokeBuiltinExtensionMode) {
|
if (!invokeBuiltinExtensionMode) {
|
||||||
result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor)
|
result += towerLevel.processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor)
|
||||||
}
|
}
|
||||||
if (invokeResolveMode == InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER ||
|
if (invokeResolveMode == InvokeResolveMode.IMPLICIT_CALL_ON_GIVEN_RECEIVER ||
|
||||||
resultCollector.isSuccess()
|
resultCollector.isSuccess()
|
||||||
@@ -119,9 +119,9 @@ internal class LevelHandler(
|
|||||||
group
|
group
|
||||||
)
|
)
|
||||||
callResolutionContext.invokeReceiverCollector.newDataSet()
|
callResolutionContext.invokeReceiverCollector.newDataSet()
|
||||||
result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, invokeReceiverProcessor)
|
result += towerLevel.processElementsByName(TowerScopeLevel.Token.Properties, info.name, invokeReceiverProcessor)
|
||||||
if (this !is ScopeTowerLevel || this.extensionReceiver == null) {
|
if (towerLevel !is ScopeTowerLevel || towerLevel.extensionReceiver == null) {
|
||||||
result += processElementsByName(TowerScopeLevel.Token.Objects, info.name, invokeReceiverProcessor)
|
result += towerLevel.processElementsByName(TowerScopeLevel.Token.Objects, info.name, invokeReceiverProcessor)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (callResolutionContext.invokeReceiverCollector.isSuccess()) {
|
if (callResolutionContext.invokeReceiverCollector.isSuccess()) {
|
||||||
@@ -134,7 +134,7 @@ internal class LevelHandler(
|
|||||||
val stubReceiverValue = ExpressionReceiverValue(stubReceiver)
|
val stubReceiverValue = ExpressionReceiverValue(stubReceiver)
|
||||||
val stubProcessor = TowerScopeLevelProcessor(
|
val stubProcessor = TowerScopeLevelProcessor(
|
||||||
info.explicitReceiver,
|
info.explicitReceiver,
|
||||||
if (this is MemberScopeTowerLevel && dispatchReceiver is AbstractExplicitReceiver<*>) {
|
if (towerLevel is MemberScopeTowerLevel && towerLevel.dispatchReceiver is AbstractExplicitReceiver<*>) {
|
||||||
ExplicitReceiverKind.DISPATCH_RECEIVER
|
ExplicitReceiverKind.DISPATCH_RECEIVER
|
||||||
} else {
|
} else {
|
||||||
ExplicitReceiverKind.EXTENSION_RECEIVER
|
ExplicitReceiverKind.EXTENSION_RECEIVER
|
||||||
@@ -142,19 +142,19 @@ internal class LevelHandler(
|
|||||||
resultCollector,
|
resultCollector,
|
||||||
callResolutionContext.stubReceiverCandidateFactory!!, group
|
callResolutionContext.stubReceiverCandidateFactory!!, group
|
||||||
)
|
)
|
||||||
val towerLevelWithStubReceiver = replaceReceiverValue(stubReceiverValue)
|
val towerLevelWithStubReceiver = towerLevel.replaceReceiverValue(stubReceiverValue)
|
||||||
with(towerLevelWithStubReceiver) {
|
with(towerLevelWithStubReceiver) {
|
||||||
result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, stubProcessor)
|
result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, stubProcessor)
|
||||||
result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, stubProcessor)
|
result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, stubProcessor)
|
||||||
}
|
}
|
||||||
// NB: we don't perform this for implicit Unit
|
// NB: we don't perform this for implicit Unit
|
||||||
if (!resultCollector.isSuccess() && info.explicitReceiver?.typeRef !is FirImplicitBuiltinTypeRef) {
|
if (!resultCollector.isSuccess() && info.explicitReceiver?.typeRef !is FirImplicitBuiltinTypeRef) {
|
||||||
result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor)
|
result += towerLevel.processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor)
|
||||||
result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor)
|
result += towerLevel.processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
result += processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor)
|
result += towerLevel.processElementsByName(TowerScopeLevel.Token.Functions, info.name, processor)
|
||||||
result += processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor)
|
result += towerLevel.processElementsByName(TowerScopeLevel.Token.Properties, info.name, processor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
|
|||||||
Reference in New Issue
Block a user