KT UAST: build implicit this receiver from containing method's extension receiver

^KTIJ-32595

GitOrigin-RevId: fd3cb0d1f71fee7e2200567e1481f6389162c1de
This commit is contained in:
Jinseong Jeon
2025-01-03 10:50:09 +00:00
committed by intellij-monorepo-bot
parent f81bd3f24e
commit 996c6ee877
@@ -291,6 +291,14 @@ class KotlinUFunctionCallExpression(
// Bail out for non-instance functions
if (isStatic || callableDeclaration !is PsiMethod) return null
val containingUMethod = getContainingUMethod()
val extensionReceiver = containingUMethod?.uastParameters?.firstOrNull() as? KotlinReceiverUParameter
// Extension receiver of the containing method
if (extensionReceiver != null && extensionReceiver.javaPsi.type == receiverType) {
// Implicit $this$extension
return KotlinUImplicitExtensionReceiver(extensionReceiver, receiverType, this)
}
val implicitReceiver =
if (baseResolveProviderService.isResolvedToExtension(sourcePsi)) {
// Extension receiver of PsiParameter
@@ -347,6 +355,28 @@ class KotlinUFunctionCallExpression(
get() = implicitReceiver
}
private class KotlinUImplicitExtensionReceiver(
val extensionReceiver: KotlinReceiverUParameter,
val receiverType: PsiType?,
uasParent: UElement,
) : KotlinAbstractUExpression(uasParent), UThisExpression {
override val label: String?
get() = null
override val labelIdentifier: UIdentifier?
get() = null
override fun getExpressionType() = receiverType
override fun resolve(): PsiElement? = extensionReceiver.javaPsi
override val sourcePsi: PsiElement?
get() = null
override val javaPsi: PsiElement?
get() = extensionReceiver.javaPsi
}
private class KotlinUImplicitLambdaReceiver(
val lambdaReceiver: UParameter?,
val receiverType: PsiType?,