From 75bf5fdbfe8ead930717bc6b34662313fa50b4e0 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 22 Mar 2021 19:09:46 +0100 Subject: [PATCH] FIR IDE: replace custom KtSymbolModality with compiler Modality --- .../idea/completion/KotlinFirIconProvider.kt | 5 +-- .../frontend/api/symbols/KtClassLikeSymbol.kt | 2 +- .../api/symbols/KtFunctionLikeSymbol.kt | 2 +- .../api/symbols/KtPropertyAccessorSymbol.kt | 2 +- .../api/symbols/KtVariableLikeSymbol.kt | 4 +-- .../symbols/markers/KtSymbolWithModality.kt | 14 ++------ .../idea/asJava/classes/firLightClassUtils.kt | 3 +- .../kotlin/idea/asJava/firLightUtils.kt | 13 ++++--- .../api/fir/symbols/KtFirFunctionSymbol.kt | 3 +- .../api/fir/symbols/KtFirJavaFieldSymbol.kt | 4 +-- .../fir/symbols/KtFirKotlinPropertySymbol.kt | 3 +- .../symbols/KtFirNamedClassOrObjectSymbol.kt | 3 +- .../fir/symbols/KtFirPropertyGetterSymbol.kt | 3 +- .../fir/symbols/KtFirPropertySetterSymbol.kt | 3 +- .../KtFirSyntheticJavaPropertySymbol.kt | 3 +- .../api/fir/symbols/firSymbolUtils.kt | 34 +++++++++++-------- 16 files changed, 53 insertions(+), 48 deletions(-) diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirIconProvider.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirIconProvider.kt index d961b20549b..0856bcf07c8 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirIconProvider.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirIconProvider.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.completion import com.intellij.util.PlatformIcons +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.idea.KotlinIcons import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* @@ -14,7 +15,7 @@ import javax.swing.Icon internal object KotlinFirIconProvider { fun getIconFor(symbol: KtNamedSymbol): Icon? { if (symbol is KtFunctionSymbol) { - val isAbstract = symbol.modality == KtCommonSymbolModality.ABSTRACT + val isAbstract = symbol.modality == Modality.ABSTRACT return when { symbol.isExtension -> { @@ -28,7 +29,7 @@ internal object KotlinFirIconProvider { } if (symbol is KtClassOrObjectSymbol) { - val isAbstract = (symbol as? KtNamedClassOrObjectSymbol)?.modality == KtCommonSymbolModality.ABSTRACT + val isAbstract = (symbol as? KtNamedClassOrObjectSymbol)?.modality == Modality.ABSTRACT return when (symbol.classKind) { KtClassKind.CLASS -> if (isAbstract) KotlinIcons.ABSTRACT_CLASS else KotlinIcons.CLASS diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtClassLikeSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtClassLikeSymbol.kt index 59068ea77c8..c6fa3fa3a24 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtClassLikeSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtClassLikeSymbol.kt @@ -61,7 +61,7 @@ abstract class KtAnonymousObjectSymbol : KtClassOrObjectSymbol() { abstract class KtNamedClassOrObjectSymbol : KtClassOrObjectSymbol(), KtSymbolWithTypeParameters, - KtSymbolWithModality, + KtSymbolWithModality, KtSymbolWithVisibility, KtNamedSymbol { 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 904266fc887..1ffb32fb861 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 @@ -29,7 +29,7 @@ abstract class KtFunctionSymbol : KtFunctionLikeSymbol(), KtPossibleExtensionSymbol, KtPossibleMemberSymbol, KtSymbolWithTypeParameters, - KtSymbolWithModality, + KtSymbolWithModality, KtSymbolWithVisibility, KtAnnotatedSymbol { diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtPropertyAccessorSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtPropertyAccessorSymbol.kt index bcf409372bb..578e55d95ed 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtPropertyAccessorSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtPropertyAccessorSymbol.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.name.CallableId sealed class KtPropertyAccessorSymbol : KtCallableSymbol(), KtPossibleMemberSymbol, - KtSymbolWithModality, + KtSymbolWithModality, KtSymbolWithVisibility, KtAnnotatedSymbol { diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtVariableLikeSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtVariableLikeSymbol.kt index 7c344a30daf..b21c8f02e55 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtVariableLikeSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtVariableLikeSymbol.kt @@ -60,7 +60,7 @@ sealed class KtVariableSymbol : KtVariableLikeSymbol() { abstract class KtJavaFieldSymbol : KtVariableSymbol(), - KtSymbolWithModality, + KtSymbolWithModality, KtSymbolWithVisibility, KtSymbolWithKind { final override val symbolKind: KtSymbolKind get() = KtSymbolKind.MEMBER @@ -71,7 +71,7 @@ abstract class KtJavaFieldSymbol : sealed class KtPropertySymbol : KtVariableSymbol(), KtPossibleExtensionSymbol, KtPossibleMemberSymbol, - KtSymbolWithModality, + KtSymbolWithModality, KtSymbolWithVisibility, KtAnnotatedSymbol, KtSymbolWithKind { diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtSymbolWithModality.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtSymbolWithModality.kt index abba9a00adc..45f59c4cc2f 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtSymbolWithModality.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtSymbolWithModality.kt @@ -5,16 +5,8 @@ package org.jetbrains.kotlin.idea.frontend.api.symbols.markers -interface KtSymbolWithModality { - val modality: M -} +import org.jetbrains.kotlin.descriptors.Modality -sealed class KtSymbolModality { - object SEALED : KtSymbolModality() +interface KtSymbolWithModality { + val modality: Modality } - -sealed class KtCommonSymbolModality : KtSymbolModality() { - object FINAL : KtCommonSymbolModality() - object ABSTRACT : KtCommonSymbolModality() - object OPEN : KtCommonSymbolModality() -} \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt index 0aa4ae30ed7..4f9e0a534a7 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService import org.jetbrains.kotlin.asJava.classes.* import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightMethod +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.idea.asJava.* @@ -251,7 +252,7 @@ internal fun FirLightClassBase.createField( fun hasBackingField(property: KtPropertySymbol): Boolean = when (property) { is KtSyntheticJavaPropertySymbol -> true is KtKotlinPropertySymbol -> when { - property.modality == KtCommonSymbolModality.ABSTRACT -> false + property.modality == Modality.ABSTRACT -> false property.isHiddenOrSynthetic() -> false property.isLateInit -> true //TODO Fix it when KtFirConstructorValueParameterSymbol be ready diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt index 3878ea38ffd..2c6b4e68507 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt @@ -202,15 +202,14 @@ internal fun FirMemberDeclaration.computeSimpleModality(): Set { return modifier?.let { setOf(it) } ?: emptySet() } -internal fun KtSymbolWithModality<*>.computeSimpleModality(): String? = when (modality) { - KtSymbolModality.SEALED -> PsiModifier.ABSTRACT - KtCommonSymbolModality.FINAL -> PsiModifier.FINAL - KtCommonSymbolModality.ABSTRACT -> PsiModifier.ABSTRACT - KtCommonSymbolModality.OPEN -> null - else -> throw NotImplementedError() +internal fun KtSymbolWithModality.computeSimpleModality(): String? = when (modality) { + Modality.SEALED -> PsiModifier.ABSTRACT + Modality.FINAL -> PsiModifier.FINAL + Modality.ABSTRACT -> PsiModifier.ABSTRACT + Modality.OPEN -> null } -internal fun KtSymbolWithModality.computeModalityForMethod( +internal fun KtSymbolWithModality.computeModalityForMethod( isTopLevel: Boolean, suppressFinal: Boolean, result: MutableSet 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 b1e3d4ac074..b17cf5d34a4 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 @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* @@ -89,7 +90,7 @@ internal class KtFirFunctionSymbol( else -> KtSymbolKind.MEMBER } } - override val modality: KtCommonSymbolModality get() = getModality() + override val modality: Modality get() = getModality() override val visibility: Visibility get() = getVisibility() diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirJavaFieldSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirJavaFieldSymbol.kt index 75384d6f37a..f51540a0d29 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirJavaFieldSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirJavaFieldSymbol.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.declarations.FirField import org.jetbrains.kotlin.fir.declarations.FirResolvePhase @@ -18,7 +19,6 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtJavaFieldSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.name.CallableId @@ -43,7 +43,7 @@ internal class KtFirJavaFieldSymbol( override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal() - override val modality: KtCommonSymbolModality get() = getModality() + override val modality: Modality get() = getModality() override val visibility: Visibility get() = getVisibility() diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt index db1dd979c08..d292e7640ee 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* @@ -76,7 +77,7 @@ internal class KtFirKotlinPropertySymbol( else -> KtSymbolKind.MEMBER } } - override val modality: KtCommonSymbolModality get() = getModality() + override val modality: Modality get() = getModality() override val visibility: Visibility get() = getVisibility() diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt index aed464f5f33..d1abbde6686 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.idea.fir.findPsi @@ -44,7 +45,7 @@ internal class KtFirNamedClassOrObjectSymbol( fir.symbol.classId.takeUnless { it.isLocal } } - override val modality: KtSymbolModality get() = getModality() + override val modality: Modality get() = getModality() override val visibility: Visibility get() = getVisibility() diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt index 9fcc12d5167..85b6a96eb71 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor @@ -56,7 +57,7 @@ internal class KtFirPropertyGetterSymbol( override val annotatedType: KtTypeAndAnnotations by cached { firRef.returnTypeAndAnnotations(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) } - override val modality: KtCommonSymbolModality get() = firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() } + override val modality: Modality get() = getModality() override val visibility: Visibility get() = getVisibility() override val annotations: List by cached { firRef.toAnnotationsList() } override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt index 3cad2e12c30..5a2d6ca21c7 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor @@ -46,7 +47,7 @@ internal class KtFirPropertySetterSymbol( override val isOverride: Boolean get() = firRef.withFir { it.isOverride } override val hasBody: Boolean get() = firRef.withFir { it.body != null } - override val modality: KtCommonSymbolModality get() = firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() } + override val modality: Modality get() = getModality() 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/KtFirSyntheticJavaPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt index d5178b086c7..0ab6aa6857b 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* @@ -60,7 +61,7 @@ internal class KtFirSyntheticJavaPropertySymbol( override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } override val initializer: KtConstantValue? by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir -> fir.initializer?.convertConstantExpression() } - override val modality: KtCommonSymbolModality get() = getModality() + override val modality: Modality get() = getModality() 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/firSymbolUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt index 2dc83352598..e03d13cd82e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt @@ -5,31 +5,37 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols -import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.fir.FirRenderer import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.psi +import org.jetbrains.kotlin.fir.renderWithType import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.coneType -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.FirRefWithValidityCheck -import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality -import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolModality -import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.idea.util.getElementTextInContext import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.psi.KtDeclaration -internal inline fun Modality?.getSymbolModality(): M = when (this) { - Modality.FINAL -> KtCommonSymbolModality.FINAL - Modality.OPEN -> KtCommonSymbolModality.OPEN - Modality.ABSTRACT -> KtCommonSymbolModality.ABSTRACT - Modality.SEALED -> KtSymbolModality.SEALED - null -> error("Symbol modality should not be null, looks like the fir symbol was not properly resolved") -} as? M ?: error("Sealed modality can only be applied to class") +internal fun KtFirSymbol.getModality() = + firRef.withFir(FirResolvePhase.STATUS) { fir -> + fir.modality + ?: fir.invalidModalityError() + } -internal inline fun KtFirSymbol.getModality() = - firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() } + +private fun FirDeclaration.invalidModalityError(): Nothing { + error( + """|Symbol modality should not be null, looks like the FIR symbol was not properly resolved + | + |${renderWithType(FirRenderer.RenderMode.WithResolvePhases)} + | + |${(psi as? KtDeclaration)?.getElementTextInContext()}""".trimMargin() + ) +} internal fun KtFirSymbol.getVisibility(): Visibility =