FIR IDE: replace custom KtSymbolModality with compiler Modality

This commit is contained in:
Ilya Kirillov
2021-03-22 19:09:46 +01:00
parent 253c389f4a
commit 75bf5fdbfe
16 changed files with 53 additions and 48 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.idea.completion package org.jetbrains.kotlin.idea.completion
import com.intellij.util.PlatformIcons import com.intellij.util.PlatformIcons
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.idea.KotlinIcons import org.jetbrains.kotlin.idea.KotlinIcons
import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.*
@@ -14,7 +15,7 @@ import javax.swing.Icon
internal object KotlinFirIconProvider { internal object KotlinFirIconProvider {
fun getIconFor(symbol: KtNamedSymbol): Icon? { fun getIconFor(symbol: KtNamedSymbol): Icon? {
if (symbol is KtFunctionSymbol) { if (symbol is KtFunctionSymbol) {
val isAbstract = symbol.modality == KtCommonSymbolModality.ABSTRACT val isAbstract = symbol.modality == Modality.ABSTRACT
return when { return when {
symbol.isExtension -> { symbol.isExtension -> {
@@ -28,7 +29,7 @@ internal object KotlinFirIconProvider {
} }
if (symbol is KtClassOrObjectSymbol) { if (symbol is KtClassOrObjectSymbol) {
val isAbstract = (symbol as? KtNamedClassOrObjectSymbol)?.modality == KtCommonSymbolModality.ABSTRACT val isAbstract = (symbol as? KtNamedClassOrObjectSymbol)?.modality == Modality.ABSTRACT
return when (symbol.classKind) { return when (symbol.classKind) {
KtClassKind.CLASS -> if (isAbstract) KotlinIcons.ABSTRACT_CLASS else KotlinIcons.CLASS KtClassKind.CLASS -> if (isAbstract) KotlinIcons.ABSTRACT_CLASS else KotlinIcons.CLASS
@@ -61,7 +61,7 @@ abstract class KtAnonymousObjectSymbol : KtClassOrObjectSymbol() {
abstract class KtNamedClassOrObjectSymbol : KtClassOrObjectSymbol(), abstract class KtNamedClassOrObjectSymbol : KtClassOrObjectSymbol(),
KtSymbolWithTypeParameters, KtSymbolWithTypeParameters,
KtSymbolWithModality<KtSymbolModality>, KtSymbolWithModality,
KtSymbolWithVisibility, KtSymbolWithVisibility,
KtNamedSymbol { KtNamedSymbol {
@@ -29,7 +29,7 @@ abstract class KtFunctionSymbol : KtFunctionLikeSymbol(),
KtPossibleExtensionSymbol, KtPossibleExtensionSymbol,
KtPossibleMemberSymbol, KtPossibleMemberSymbol,
KtSymbolWithTypeParameters, KtSymbolWithTypeParameters,
KtSymbolWithModality<KtCommonSymbolModality>, KtSymbolWithModality,
KtSymbolWithVisibility, KtSymbolWithVisibility,
KtAnnotatedSymbol { KtAnnotatedSymbol {
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.name.CallableId
sealed class KtPropertyAccessorSymbol : KtCallableSymbol(), sealed class KtPropertyAccessorSymbol : KtCallableSymbol(),
KtPossibleMemberSymbol, KtPossibleMemberSymbol,
KtSymbolWithModality<KtCommonSymbolModality>, KtSymbolWithModality,
KtSymbolWithVisibility, KtSymbolWithVisibility,
KtAnnotatedSymbol { KtAnnotatedSymbol {
@@ -60,7 +60,7 @@ sealed class KtVariableSymbol : KtVariableLikeSymbol() {
abstract class KtJavaFieldSymbol : abstract class KtJavaFieldSymbol :
KtVariableSymbol(), KtVariableSymbol(),
KtSymbolWithModality<KtCommonSymbolModality>, KtSymbolWithModality,
KtSymbolWithVisibility, KtSymbolWithVisibility,
KtSymbolWithKind { KtSymbolWithKind {
final override val symbolKind: KtSymbolKind get() = KtSymbolKind.MEMBER final override val symbolKind: KtSymbolKind get() = KtSymbolKind.MEMBER
@@ -71,7 +71,7 @@ abstract class KtJavaFieldSymbol :
sealed class KtPropertySymbol : KtVariableSymbol(), sealed class KtPropertySymbol : KtVariableSymbol(),
KtPossibleExtensionSymbol, KtPossibleExtensionSymbol,
KtPossibleMemberSymbol, KtPossibleMemberSymbol,
KtSymbolWithModality<KtCommonSymbolModality>, KtSymbolWithModality,
KtSymbolWithVisibility, KtSymbolWithVisibility,
KtAnnotatedSymbol, KtAnnotatedSymbol,
KtSymbolWithKind { KtSymbolWithKind {
@@ -5,16 +5,8 @@
package org.jetbrains.kotlin.idea.frontend.api.symbols.markers package org.jetbrains.kotlin.idea.frontend.api.symbols.markers
interface KtSymbolWithModality<M : KtSymbolModality> { import org.jetbrains.kotlin.descriptors.Modality
val modality: M
}
sealed class KtSymbolModality { interface KtSymbolWithModality {
object SEALED : KtSymbolModality() val modality: Modality
} }
sealed class KtCommonSymbolModality : KtSymbolModality() {
object FINAL : KtCommonSymbolModality()
object ABSTRACT : KtCommonSymbolModality()
object OPEN : KtCommonSymbolModality()
}
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
import org.jetbrains.kotlin.asJava.classes.* import org.jetbrains.kotlin.asJava.classes.*
import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.idea.asJava.* import org.jetbrains.kotlin.idea.asJava.*
@@ -251,7 +252,7 @@ internal fun FirLightClassBase.createField(
fun hasBackingField(property: KtPropertySymbol): Boolean = when (property) { fun hasBackingField(property: KtPropertySymbol): Boolean = when (property) {
is KtSyntheticJavaPropertySymbol -> true is KtSyntheticJavaPropertySymbol -> true
is KtKotlinPropertySymbol -> when { is KtKotlinPropertySymbol -> when {
property.modality == KtCommonSymbolModality.ABSTRACT -> false property.modality == Modality.ABSTRACT -> false
property.isHiddenOrSynthetic() -> false property.isHiddenOrSynthetic() -> false
property.isLateInit -> true property.isLateInit -> true
//TODO Fix it when KtFirConstructorValueParameterSymbol be ready //TODO Fix it when KtFirConstructorValueParameterSymbol be ready
@@ -202,15 +202,14 @@ internal fun FirMemberDeclaration.computeSimpleModality(): Set<String> {
return modifier?.let { setOf(it) } ?: emptySet() return modifier?.let { setOf(it) } ?: emptySet()
} }
internal fun KtSymbolWithModality<*>.computeSimpleModality(): String? = when (modality) { internal fun KtSymbolWithModality.computeSimpleModality(): String? = when (modality) {
KtSymbolModality.SEALED -> PsiModifier.ABSTRACT Modality.SEALED -> PsiModifier.ABSTRACT
KtCommonSymbolModality.FINAL -> PsiModifier.FINAL Modality.FINAL -> PsiModifier.FINAL
KtCommonSymbolModality.ABSTRACT -> PsiModifier.ABSTRACT Modality.ABSTRACT -> PsiModifier.ABSTRACT
KtCommonSymbolModality.OPEN -> null Modality.OPEN -> null
else -> throw NotImplementedError()
} }
internal fun KtSymbolWithModality<KtCommonSymbolModality>.computeModalityForMethod( internal fun KtSymbolWithModality.computeModalityForMethod(
isTopLevel: Boolean, isTopLevel: Boolean,
suppressFinal: Boolean, suppressFinal: Boolean,
result: MutableSet<String> result: MutableSet<String>
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.containingClass
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
@@ -89,7 +90,7 @@ internal class KtFirFunctionSymbol(
else -> KtSymbolKind.MEMBER else -> KtSymbolKind.MEMBER
} }
} }
override val modality: KtCommonSymbolModality get() = getModality() override val modality: Modality get() = getModality()
override val visibility: Visibility get() = getVisibility() override val visibility: Visibility get() = getVisibility()
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.declarations.FirField import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase 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.firRef
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef 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.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.markers.KtTypeAndAnnotations
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.CallableId
@@ -43,7 +43,7 @@ internal class KtFirJavaFieldSymbol(
override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal() override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal()
override val modality: KtCommonSymbolModality get() = getModality() override val modality: Modality get() = getModality()
override val visibility: Visibility get() = getVisibility() override val visibility: Visibility get() = getVisibility()
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.containingClass
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
@@ -76,7 +77,7 @@ internal class KtFirKotlinPropertySymbol(
else -> KtSymbolKind.MEMBER else -> KtSymbolKind.MEMBER
} }
} }
override val modality: KtCommonSymbolModality get() = getModality() override val modality: Modality get() = getModality()
override val visibility: Visibility get() = getVisibility() override val visibility: Visibility get() = getVisibility()
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
@@ -44,7 +45,7 @@ internal class KtFirNamedClassOrObjectSymbol(
fir.symbol.classId.takeUnless { it.isLocal } fir.symbol.classId.takeUnless { it.isLocal }
} }
override val modality: KtSymbolModality get() = getModality() override val modality: Modality get() = getModality()
override val visibility: Visibility get() = getVisibility() override val visibility: Visibility get() = getVisibility()
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
@@ -56,7 +57,7 @@ internal class KtFirPropertyGetterSymbol(
override val annotatedType: KtTypeAndAnnotations by cached { override val annotatedType: KtTypeAndAnnotations by cached {
firRef.returnTypeAndAnnotations(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) 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 visibility: Visibility get() = getVisibility()
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() } override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId) override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor 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 isOverride: Boolean get() = firRef.withFir { it.isOverride }
override val hasBody: Boolean get() = firRef.withFir { it.body != null } 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 visibility: Visibility get() = getVisibility()
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() } override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.containingClass
import org.jetbrains.kotlin.fir.declarations.* 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 isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null }
override val initializer: KtConstantValue? by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir -> fir.initializer?.convertConstantExpression() } 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 visibility: Visibility get() = getVisibility()
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() } override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
@@ -5,31 +5,37 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols 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.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* 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.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.FirRefWithValidityCheck import org.jetbrains.kotlin.idea.util.getElementTextInContext
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.name.CallableId import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.psi.KtDeclaration
internal inline fun <reified M : KtSymbolModality> Modality?.getSymbolModality(): M = when (this) { internal fun KtFirSymbol<FirMemberDeclaration>.getModality() =
Modality.FINAL -> KtCommonSymbolModality.FINAL firRef.withFir(FirResolvePhase.STATUS) { fir ->
Modality.OPEN -> KtCommonSymbolModality.OPEN fir.modality
Modality.ABSTRACT -> KtCommonSymbolModality.ABSTRACT ?: fir.invalidModalityError()
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 inline fun <F : FirMemberDeclaration, reified M : KtSymbolModality> KtFirSymbol<F>.getModality() =
firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality<M>() } 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 <F : FirMemberDeclaration> KtFirSymbol<F>.getVisibility(): Visibility = internal fun <F : FirMemberDeclaration> KtFirSymbol<F>.getVisibility(): Visibility =