[FIR] Make extensionReceiver and dispatchReceiver nullable

Get rid of FirNoReceiverExpression

^KT-59650 Fixed
This commit is contained in:
Dmitriy Novozhilov
2023-08-30 18:50:18 +03:00
committed by Space Team
parent 585c3fe4b5
commit f203681ffa
75 changed files with 292 additions and 320 deletions
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.renderer.ConeTypeRendererForDebugging
import org.jetbrains.kotlin.fir.resolve.defaultType
@@ -558,18 +557,21 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
}
var withExtensionFunctionType = false
val extensionReceiver = call.extensionReceiver
val dispatchReceiver = call.dispatchReceiver
when {
call.extensionReceiver !is FirNoReceiverExpression -> {
extensionReceiver != null -> {
// render type from symbol because this way it will be consistent with psi render
fir.receiverParameter?.accept(this, data)
data.append(".").append(callableName)
}
call.dispatchReceiver.resolvedType.isExtensionFunctionType -> {
dispatchReceiver?.resolvedType?.isExtensionFunctionType == true-> {
withExtensionFunctionType = true
fir.valueParameters.first().returnTypeRef.accept(this, data)
data.append(".").append(callableName)
}
call.dispatchReceiver !is FirNoReceiverExpression -> {
dispatchReceiver != null -> {
data.append("(")
val dispatch = fir.dispatchReceiverType!!.tryToRenderConeAsFunctionTypeString()
.let { if (it.endsWith("!")) it.dropLast(1) else it } // this hack drop flexible annotation for receiver
@@ -25,8 +25,8 @@ class Psi2FirMapper(val map: MutableMap<PsiElement, MutableList<FirElement>>) :
}
override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess) {
visitElement(callableReferenceAccess.extensionReceiver)
visitElement(callableReferenceAccess.dispatchReceiver)
callableReferenceAccess.extensionReceiver?.let { visitElement(it) }
callableReferenceAccess.dispatchReceiver?.let { visitElement(it) }
callableReferenceAccess.explicitReceiver?.let { visitElement(it) }
val psi = (callableReferenceAccess.calleeReference.psi as? KtCallableReferenceExpression)?.children?.last()
@@ -35,4 +35,4 @@ class Psi2FirMapper(val map: MutableMap<PsiElement, MutableList<FirElement>>) :
map[psi]?.add(callableReferenceAccess.calleeReference)
}
}
}
}