Analysis API: adapt to KtCall data model change

Also add API to check if a `KtFunctionSymbol` is the invoke function on
a Kotlin builtin functional type.
This commit is contained in:
Tianyu Geng
2021-11-24 14:18:50 -08:00
committed by Ilya Kirillov
parent 53b3893738
commit c9f9ce99c1
13 changed files with 52 additions and 35 deletions
@@ -9,10 +9,14 @@ import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.fir.annotations.fullyExpandedClassId
import org.jetbrains.kotlin.analysis.api.fir.annotations.mapAnnotationParameters
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirAnnotationValueConverter
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference
@@ -20,11 +24,6 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.diagnostics.*
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.psi.KtAnnotationEntry
import org.jetbrains.kotlin.psi.KtCallElement
import org.jetbrains.kotlin.util.OperatorNameConventions
@@ -6,7 +6,8 @@
package org.jetbrains.kotlin.idea.references
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.calls.KtVariableWithInvokeFunctionCall
import org.jetbrains.kotlin.analysis.api.calls.KtSimpleFunctionCall
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.KtExpression
@@ -17,10 +18,12 @@ class KtFirInvokeFunctionReference(expression: KtCallExpression) : KtInvokeFunct
}
override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> {
val call = expression.resolveCall() ?: return emptyList()
if (call is KtVariableWithInvokeFunctionCall) {
return call.targetFunction.candidates
return expression.resolveCall().calls.mapNotNull { call ->
(call as? KtSimpleFunctionCall)
?.takeIf { it.isImplicitInvoke }
?.boundSymbol
?.symbol
?.takeUnless { it is KtFunctionSymbol && it.isBuiltinFunctionInvoke }
}
return emptyList()
}
}
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirTopLevelFunct
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
import org.jetbrains.kotlin.analysis.api.impl.base.util.kotlinFunctionInvokeCallableIds
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
@@ -70,6 +71,9 @@ internal class KtFirFunctionSymbol(
override val isInfix: Boolean get() = firRef.withFir { it.isInfix }
override val isStatic: Boolean get() = firRef.withFir { it.isStatic }
override val isBuiltinFunctionInvoke: Boolean
get() = callableIdIfNonLocal in kotlinFunctionInvokeCallableIds
override val receiverType: KtType? by cached {
firRef.receiverType(builder)
}