From d30d8037cf259e45ef7b2abf283b440fd287ccc8 Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Mon, 12 Jul 2021 21:33:26 +0000 Subject: [PATCH] FIR IDE: Add KtFunctionLikeSymbol.hasStableParameterNames. --- .../kotlin/idea/frontend/api/calls/ktCallUtils.kt | 5 +++++ .../idea/frontend/api/symbols/KtFunctionLikeSymbol.kt | 7 +++++++ .../api/fir/symbols/KtFirAnonymousFunctionSymbol.kt | 3 +++ .../frontend/api/fir/symbols/KtFirConstructorSymbol.kt | 3 +++ .../idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt | 3 +++ 5 files changed, 21 insertions(+) diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/calls/ktCallUtils.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/calls/ktCallUtils.kt index aed6c30a3ab..1e19a3e3551 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/calls/ktCallUtils.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/calls/ktCallUtils.kt @@ -12,6 +12,11 @@ public fun KtCallTarget.getSuccessCallSymbolOrNull(): KtFunctionLikeSymbol? = wh is KtErrorCallTarget -> null } +public fun KtCallTarget.getSingleCandidateSymbolOrNull(): KtFunctionLikeSymbol? = when (this) { + is KtSuccessCallTarget -> symbol + is KtErrorCallTarget -> candidates.singleOrNull() +} + public inline fun KtCall.isSuccessCallOf(predicate: (S) -> Boolean): Boolean { if (this !is KtFunctionCall) return false val symbol = targetFunction.getSuccessCallSymbolOrNull() ?: return false diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtFunctionLikeSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtFunctionLikeSymbol.kt index 2adda3ace1f..7a90542a2cd 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtFunctionLikeSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtFunctionLikeSymbol.kt @@ -14,6 +14,13 @@ import org.jetbrains.kotlin.name.FqName public abstract class KtFunctionLikeSymbol : KtCallableSymbol(), KtSymbolWithKind { public abstract val valueParameters: List + /** + * Kotlin functions always have stable parameter names that can be reliably used when calling them with named arguments. + * Functions loaded from platform definitions (e.g. Java binaries or JS) may have unstable parameter names that vary from + * one platform installation to another. These names can not be used reliably for calls with named arguments. + */ + public abstract val hasStableParameterNames: Boolean + abstract override fun createPointer(): KtSymbolPointer } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt index 3215f6b5edc..31d76cca1f0 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder @@ -41,6 +42,8 @@ internal class KtFirAnonymousFunctionSymbol( } } + override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) } + override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } override val receiverType: KtTypeAndAnnotations? by cached { firRef.receiverTypeAndAnnotations(builder) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt index b59debe9105..65a25f599c8 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder @@ -54,6 +55,8 @@ internal class KtFirConstructorSymbol( } } + override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) } + override val visibility: Visibility get() = getVisibility() override val annotations: List by cached { firRef.toAnnotationsList() } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt index cb26ac1a26d..9bfe9eb2988 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.* +import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder @@ -63,6 +64,8 @@ internal class KtFirFunctionSymbol( } } + override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) } + override val annotations: List by cached { firRef.toAnnotationsList() } override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId) override val annotationClassIds: Collection by cached { firRef.getAnnotationClassIds() }