FIR IDE: replace custom KtSymbolModality with compiler Modality
This commit is contained in:
@@ -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
|
||||
|
||||
+1
-1
@@ -61,7 +61,7 @@ abstract class KtAnonymousObjectSymbol : KtClassOrObjectSymbol() {
|
||||
|
||||
abstract class KtNamedClassOrObjectSymbol : KtClassOrObjectSymbol(),
|
||||
KtSymbolWithTypeParameters,
|
||||
KtSymbolWithModality<KtSymbolModality>,
|
||||
KtSymbolWithModality,
|
||||
KtSymbolWithVisibility,
|
||||
KtNamedSymbol {
|
||||
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@ abstract class KtFunctionSymbol : KtFunctionLikeSymbol(),
|
||||
KtPossibleExtensionSymbol,
|
||||
KtPossibleMemberSymbol,
|
||||
KtSymbolWithTypeParameters,
|
||||
KtSymbolWithModality<KtCommonSymbolModality>,
|
||||
KtSymbolWithModality,
|
||||
KtSymbolWithVisibility,
|
||||
KtAnnotatedSymbol {
|
||||
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.name.CallableId
|
||||
|
||||
sealed class KtPropertyAccessorSymbol : KtCallableSymbol(),
|
||||
KtPossibleMemberSymbol,
|
||||
KtSymbolWithModality<KtCommonSymbolModality>,
|
||||
KtSymbolWithModality,
|
||||
KtSymbolWithVisibility,
|
||||
KtAnnotatedSymbol {
|
||||
|
||||
|
||||
+2
-2
@@ -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 {
|
||||
|
||||
+3
-11
@@ -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()
|
||||
}
|
||||
+2
-1
@@ -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>
|
||||
|
||||
+2
-1
@@ -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()
|
||||
|
||||
|
||||
+2
-2
@@ -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()
|
||||
|
||||
|
||||
+2
-1
@@ -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()
|
||||
|
||||
|
||||
+2
-1
@@ -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()
|
||||
|
||||
|
||||
+2
-1
@@ -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)
|
||||
|
||||
+2
-1
@@ -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() }
|
||||
|
||||
+2
-1
@@ -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() }
|
||||
|
||||
+20
-14
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user