Analysis API: fix reference resolving for implicit invoke calls
This commit is contained in:
committed by
TeamCityServer
parent
7045e3ee45
commit
2de4a6f924
+3
-15
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
|||||||
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols
|
import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.isImplicitFunctionCall
|
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||||
@@ -187,7 +186,7 @@ internal object FirReferenceResolveHelper {
|
|||||||
is FirErrorNamedReference -> getSymbolsByErrorNamedReference(fir, symbolBuilder)
|
is FirErrorNamedReference -> getSymbolsByErrorNamedReference(fir, symbolBuilder)
|
||||||
is FirVariableAssignment -> getSymbolsByVariableAssignment(fir, session, symbolBuilder)
|
is FirVariableAssignment -> getSymbolsByVariableAssignment(fir, session, symbolBuilder)
|
||||||
is FirResolvedNamedReference -> getSymbolByResolvedNameReference(fir, expression, analysisSession, session, symbolBuilder)
|
is FirResolvedNamedReference -> getSymbolByResolvedNameReference(fir, expression, analysisSession, session, symbolBuilder)
|
||||||
is FirResolvable -> getSymbolsByResolvable(fir, expression, session, symbolBuilder)
|
is FirResolvable -> getSymbolsByResolvable(fir, session, symbolBuilder)
|
||||||
is FirNamedArgumentExpression -> getSymbolsByNameArgumentExpression(expression, analysisSession, symbolBuilder)
|
is FirNamedArgumentExpression -> getSymbolsByNameArgumentExpression(expression, analysisSession, symbolBuilder)
|
||||||
else -> handleUnknownFirElement(expression, analysisSession, session, symbolBuilder)
|
else -> handleUnknownFirElement(expression, analysisSession, session, symbolBuilder)
|
||||||
}
|
}
|
||||||
@@ -212,7 +211,7 @@ internal object FirReferenceResolveHelper {
|
|||||||
if (parentAsCall != null) {
|
if (parentAsCall != null) {
|
||||||
val firResolvable = parentAsCall.getOrBuildFirSafe<FirResolvable>(analysisSession.firResolveState)
|
val firResolvable = parentAsCall.getOrBuildFirSafe<FirResolvable>(analysisSession.firResolveState)
|
||||||
if (firResolvable != null) {
|
if (firResolvable != null) {
|
||||||
return getSymbolsByResolvable(firResolvable, expression, session, symbolBuilder)
|
return getSymbolsByResolvable(firResolvable, session, symbolBuilder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fir.toTargetSymbol(session, symbolBuilder)
|
return fir.toTargetSymbol(session, symbolBuilder)
|
||||||
@@ -285,21 +284,10 @@ internal object FirReferenceResolveHelper {
|
|||||||
|
|
||||||
private fun getSymbolsByResolvable(
|
private fun getSymbolsByResolvable(
|
||||||
fir: FirResolvable,
|
fir: FirResolvable,
|
||||||
expression: KtSimpleNameExpression,
|
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
symbolBuilder: KtSymbolByFirBuilder
|
symbolBuilder: KtSymbolByFirBuilder
|
||||||
): Collection<KtSymbol> {
|
): Collection<KtSymbol> {
|
||||||
val calleeReference =
|
val calleeReference = fir.calleeReference
|
||||||
if (fir is FirFunctionCall
|
|
||||||
&& fir.isImplicitFunctionCall()
|
|
||||||
&& expression is KtNameReferenceExpression
|
|
||||||
) {
|
|
||||||
// we are resolving implicit invoke call, like
|
|
||||||
// fun foo(a: () -> Unit) {
|
|
||||||
// <expression>a</expression>()
|
|
||||||
// }
|
|
||||||
(fir.dispatchReceiver as FirQualifiedAccessExpression).calleeReference
|
|
||||||
} else fir.calleeReference
|
|
||||||
return calleeReference.toTargetSymbol(session, symbolBuilder)
|
return calleeReference.toTargetSymbol(session, symbolBuilder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user