FIR IDE: resolve symbol to status to get it modality

This commit is contained in:
Ilya Kirillov
2020-09-02 22:42:07 +03:00
parent 0c47d42659
commit 9130392eb9
7 changed files with 14 additions and 7 deletions
@@ -38,7 +38,7 @@ internal class KtFirClassOrObjectSymbol(
fir.symbol.classId.takeUnless { it.isLocal }
}
override val modality: KtSymbolModality get() = firRef.withFir { it.modality.getSymbolModality() }
override val modality: KtSymbolModality get() = getModality()
override val typeParameters by firRef.withFirAndCache {
fir.typeParameters.map { typeParameter ->
@@ -64,7 +64,7 @@ internal class KtFirFunctionSymbol(
else -> KtSymbolKind.MEMBER
}
}
override val modality: KtCommonSymbolModality get() = firRef.withFir { it.modality.getSymbolModality() }
override val modality: KtCommonSymbolModality get() = getModality()
override fun createPointer(): KtSymbolPointer<KtFunctionSymbol> {
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
@@ -44,7 +44,7 @@ internal class KtFirJavaFieldSymbol(
fir.symbol.callableId.asFqNameForDebugInfo() // todo check if local
}
override val modality: KtCommonSymbolModality get() = firRef.withFir { it.modality.getSymbolModality() }
override val modality: KtCommonSymbolModality get() = getModality()
override fun createPointer(): KtSymbolPointer<KtJavaFieldSymbol> {
TODO("Creating pointers for java fields is not supported yet")
@@ -36,7 +36,7 @@ internal class KtFirPropertyGetterSymbol(
override val isDefault: Boolean get() = firRef.withFir { it is FirDefaultPropertyAccessor }
override val type: KtType = firRef.withFir(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { builder.buildKtType(it.returnTypeRef) }
override val modality: KtCommonSymbolModality get() = firRef.withFir { it.modality.getSymbolModality() }
override val modality: KtCommonSymbolModality get() = firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() }
override fun createPointer(): KtSymbolPointer<KtPropertyGetterSymbol> {
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.modality
import org.jetbrains.kotlin.idea.fir.findPsi
@@ -35,7 +36,7 @@ internal class KtFirPropertySetterSymbol(
override val psi: PsiElement? by firRef.withFirAndCache { it.findPsi(fir.session) }
override val isDefault: Boolean get() = firRef.withFir { it is FirDefaultPropertyAccessor }
override val modality: KtCommonSymbolModality get() = firRef.withFir { it.modality.getSymbolModality() }
override val modality: KtCommonSymbolModality get() = firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() }
override val parameter: KtSetterParameterSymbol by firRef.withFirAndCache { fir ->
builder.buildFirSetterParameter(fir.valueParameters.single())
}
@@ -53,7 +53,7 @@ internal class KtFirPropertySymbol(
else -> KtSymbolKind.MEMBER
}
}
override val modality: KtCommonSymbolModality get() = firRef.withFir { it.modality.getSymbolModality() }
override val modality: KtCommonSymbolModality get() = getModality()
override val callableIdIfNonLocal: FqName?
get() = firRef.withFir { fir ->
@@ -6,6 +6,9 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.modality
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolModality
@@ -17,4 +20,7 @@ internal inline fun <reified M : KtSymbolModality> Modality?.getSymbolModality()
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")
} 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>() }