FIR IDE: Add KtFunctionLikeSymbol.hasStableParameterNames.

This commit is contained in:
Mark Punzalan
2021-07-12 21:33:26 +00:00
committed by teamcityserver
parent 5c111f8979
commit d30d8037cf
5 changed files with 21 additions and 0 deletions
@@ -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 <reified S : KtFunctionLikeSymbol> KtCall.isSuccessCallOf(predicate: (S) -> Boolean): Boolean {
if (this !is KtFunctionCall) return false
val symbol = targetFunction.getSuccessCallSymbolOrNull() ?: return false
@@ -14,6 +14,13 @@ import org.jetbrains.kotlin.name.FqName
public abstract class KtFunctionLikeSymbol : KtCallableSymbol(), KtSymbolWithKind {
public abstract val valueParameters: List<KtValueParameterSymbol>
/**
* 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<KtFunctionLikeSymbol>
}
@@ -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)
@@ -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<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
@@ -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<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
override val annotationClassIds: Collection<ClassId> by cached { firRef.getAnnotationClassIds() }