FIR IDE: add cache in KtFirCallResolver
This commit is contained in:
committed by
Ilya Kirillov
parent
d2ed203528
commit
c19ed07fd1
+12
-2
@@ -48,12 +48,14 @@ import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.findAssignment
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
internal class KtFirCallResolver(
|
||||
override val analysisSession: KtFirAnalysisSession,
|
||||
override val token: ValidityToken,
|
||||
) : KtCallResolver(), KtFirAnalysisSessionComponent {
|
||||
private val diagnosticCache = mutableListOf<FirDiagnostic>()
|
||||
private val cache: ConcurrentHashMap<KtElement, KtCall?> = ConcurrentHashMap()
|
||||
|
||||
override fun resolveAccessorCall(call: KtSimpleNameExpression): KtCall? = withValidityAssertion {
|
||||
when (val fir = call.getOrBuildFir(firResolveState)) {
|
||||
@@ -88,6 +90,7 @@ internal class KtFirCallResolver(
|
||||
}
|
||||
|
||||
override fun resolveCall(call: KtBinaryExpression): KtCall? = withValidityAssertion {
|
||||
cache.computeIfAbsent(call) {
|
||||
when (val fir = call.getOrBuildFir(firResolveState)) {
|
||||
is FirFunctionCall -> resolveCall(fir)
|
||||
is FirComparisonExpression -> resolveCall(fir.compareToCall)
|
||||
@@ -95,8 +98,10 @@ internal class KtFirCallResolver(
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun resolveCall(call: KtUnaryExpression): KtCall? = withValidityAssertion {
|
||||
cache.computeIfAbsent(call) {
|
||||
when (val fir = call.getOrBuildFir(firResolveState)) {
|
||||
is FirFunctionCall -> resolveCall(fir)
|
||||
is FirBlock -> {
|
||||
@@ -109,9 +114,11 @@ internal class KtFirCallResolver(
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun resolveCall(call: KtCallElement): KtCall? = withValidityAssertion {
|
||||
return when (val fir = call.getOrBuildFir(firResolveState)) {
|
||||
cache.computeIfAbsent(call) {
|
||||
when (val fir = call.getOrBuildFir(firResolveState)) {
|
||||
is FirArrayOfCall -> resolveArrayOfCall(fir)
|
||||
is FirFunctionCall -> resolveCall(fir)
|
||||
is FirAnnotationCall -> fir.asAnnotationCall()
|
||||
@@ -121,13 +128,16 @@ internal class KtFirCallResolver(
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun resolveCall(call: KtArrayAccessExpression): KtCall? = withValidityAssertion {
|
||||
return when (val fir = call.getOrBuildFir(firResolveState)) {
|
||||
cache.computeIfAbsent(call) {
|
||||
when (val fir = call.getOrBuildFir(firResolveState)) {
|
||||
is FirFunctionCall -> resolveCall(fir)
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun resolveArrayOfCall(arrayOfCall: FirArrayOfCall): KtCall? {
|
||||
val arrayOfSymbol = with(analysisSession) {
|
||||
|
||||
Reference in New Issue
Block a user