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
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
@@ -61,7 +61,7 @@ abstract class KtAnonymousObjectSymbol : KtClassOrObjectSymbol() {
abstract class KtNamedClassOrObjectSymbol : KtClassOrObjectSymbol(),
KtSymbolWithTypeParameters,
KtSymbolWithModality<KtSymbolModality>,
KtSymbolWithModality,
KtSymbolWithVisibility,
KtNamedSymbol {
@@ -29,7 +29,7 @@ abstract class KtFunctionSymbol : KtFunctionLikeSymbol(),
KtPossibleExtensionSymbol,
KtPossibleMemberSymbol,
KtSymbolWithTypeParameters,
KtSymbolWithModality<KtCommonSymbolModality>,
KtSymbolWithModality,
KtSymbolWithVisibility,
KtAnnotatedSymbol {
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.name.CallableId
sealed class KtPropertyAccessorSymbol : KtCallableSymbol(),
KtPossibleMemberSymbol,
KtSymbolWithModality<KtCommonSymbolModality>,
KtSymbolWithModality,
KtSymbolWithVisibility,
KtAnnotatedSymbol {
@@ -60,7 +60,7 @@ sealed class KtVariableSymbol : KtVariableLikeSymbol() {
abstract class KtJavaFieldSymbol :
KtVariableSymbol(),
KtSymbolWithModality<KtCommonSymbolModality>,
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<KtCommonSymbolModality>,
KtSymbolWithModality,
KtSymbolWithVisibility,
KtAnnotatedSymbol,
KtSymbolWithKind {
@@ -5,16 +5,8 @@
package org.jetbrains.kotlin.idea.frontend.api.symbols.markers
interface KtSymbolWithModality<M : KtSymbolModality> {
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()
}
@@ -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
@@ -202,15 +202,14 @@ internal fun FirMemberDeclaration.computeSimpleModality(): Set<String> {
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<KtCommonSymbolModality>.computeModalityForMethod(
internal fun KtSymbolWithModality.computeModalityForMethod(
isTopLevel: Boolean,
suppressFinal: Boolean,
result: MutableSet<String>
@@ -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()
@@ -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()
@@ -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()
@@ -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()
@@ -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<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
override fun containsAnnotation(classId: ClassId): Boolean = firRef.containsAnnotation(classId)
@@ -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<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
@@ -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<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
@@ -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 <reified M : KtSymbolModality> 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<FirMemberDeclaration>.getModality() =
firRef.withFir(FirResolvePhase.STATUS) { fir ->
fir.modality
?: fir.invalidModalityError()
}
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 =