FIR IDE/UAST: resolve call from KtUnaryExpression

This commit is contained in:
Jinseong Jeon
2021-06-17 21:54:41 +02:00
committed by Ilya Kirillov
parent ed2cf9afd7
commit ee02303816
2 changed files with 20 additions and 1 deletions
@@ -8,10 +8,12 @@ package org.jetbrains.kotlin.idea.frontend.api.components
import org.jetbrains.kotlin.idea.frontend.api.calls.KtCall
import org.jetbrains.kotlin.psi.KtBinaryExpression
import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.KtUnaryExpression
abstract class KtCallResolver : KtAnalysisSessionComponent() {
abstract fun resolveCall(call: KtCallExpression): KtCall?
abstract fun resolveCall(call: KtBinaryExpression): KtCall?
abstract fun resolveCall(call: KtUnaryExpression): KtCall?
}
interface KtCallResolverMixIn : KtAnalysisSessionMixIn {
@@ -21,4 +23,6 @@ interface KtCallResolverMixIn : KtAnalysisSessionMixIn {
fun KtBinaryExpression.resolveCall(): KtCall? =
analysisSession.callResolver.resolveCall(this)
}
fun KtUnaryExpression.resolveCall(): KtCall? =
analysisSession.callResolver.resolveCall(this)
}
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.idea.references.FirReferenceResolveHelper
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.psi.KtBinaryExpression
import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.KtUnaryExpression
import org.jetbrains.kotlin.util.OperatorNameConventions
internal class KtFirCallResolver(
@@ -46,6 +47,20 @@ internal class KtFirCallResolver(
}
}
override fun resolveCall(call: KtUnaryExpression): KtCall? = withValidityAssertion {
when (val fir = call.getOrBuildFir(firResolveState)) {
is FirFunctionCall -> resolveCall(fir)
is FirBlock -> {
// Desugared increment or decrement block. See [BaseFirBuilder#generateIncrementOrDecrementBlock]
// There would be corresponding inc()/dec() call that is assigned back to a temp variable.
val prefix = fir.statements.filterIsInstance<FirVariableAssignment>().find { it.rValue is FirFunctionCall }
(prefix?.rValue as? FirFunctionCall)?.let { resolveCall(it) }
}
is FirCheckNotNullCall -> null // TODO
else -> null
}
}
override fun resolveCall(call: KtCallExpression): KtCall? = withValidityAssertion {
val firCall = when (val fir = call.getOrBuildFir(firResolveState)) {
is FirFunctionCall -> fir