FIR IDE/UAST: resolve call from KtUnaryExpression
This commit is contained in:
committed by
Ilya Kirillov
parent
ed2cf9afd7
commit
ee02303816
+5
-1
@@ -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.idea.frontend.api.calls.KtCall
|
||||||
import org.jetbrains.kotlin.psi.KtBinaryExpression
|
import org.jetbrains.kotlin.psi.KtBinaryExpression
|
||||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||||
|
import org.jetbrains.kotlin.psi.KtUnaryExpression
|
||||||
|
|
||||||
abstract class KtCallResolver : KtAnalysisSessionComponent() {
|
abstract class KtCallResolver : KtAnalysisSessionComponent() {
|
||||||
abstract fun resolveCall(call: KtCallExpression): KtCall?
|
abstract fun resolveCall(call: KtCallExpression): KtCall?
|
||||||
abstract fun resolveCall(call: KtBinaryExpression): KtCall?
|
abstract fun resolveCall(call: KtBinaryExpression): KtCall?
|
||||||
|
abstract fun resolveCall(call: KtUnaryExpression): KtCall?
|
||||||
}
|
}
|
||||||
|
|
||||||
interface KtCallResolverMixIn : KtAnalysisSessionMixIn {
|
interface KtCallResolverMixIn : KtAnalysisSessionMixIn {
|
||||||
@@ -21,4 +23,6 @@ interface KtCallResolverMixIn : KtAnalysisSessionMixIn {
|
|||||||
fun KtBinaryExpression.resolveCall(): KtCall? =
|
fun KtBinaryExpression.resolveCall(): KtCall? =
|
||||||
analysisSession.callResolver.resolveCall(this)
|
analysisSession.callResolver.resolveCall(this)
|
||||||
|
|
||||||
}
|
fun KtUnaryExpression.resolveCall(): KtCall? =
|
||||||
|
analysisSession.callResolver.resolveCall(this)
|
||||||
|
}
|
||||||
|
|||||||
+15
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.idea.references.FirReferenceResolveHelper
|
|||||||
import org.jetbrains.kotlin.name.CallableId
|
import org.jetbrains.kotlin.name.CallableId
|
||||||
import org.jetbrains.kotlin.psi.KtBinaryExpression
|
import org.jetbrains.kotlin.psi.KtBinaryExpression
|
||||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||||
|
import org.jetbrains.kotlin.psi.KtUnaryExpression
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
|
|
||||||
internal class KtFirCallResolver(
|
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 {
|
override fun resolveCall(call: KtCallExpression): KtCall? = withValidityAssertion {
|
||||||
val firCall = when (val fir = call.getOrBuildFir(firResolveState)) {
|
val firCall = when (val fir = call.getOrBuildFir(firResolveState)) {
|
||||||
is FirFunctionCall -> fir
|
is FirFunctionCall -> fir
|
||||||
|
|||||||
Reference in New Issue
Block a user