[AA K2] reimplement symbol pointers for enum entry

^KT-54311
This commit is contained in:
Dmitrii Gridin
2022-11-03 16:58:03 +01:00
committed by Space Team
parent 9b6e9e2dd1
commit bc3fcf22c4
2 changed files with 14 additions and 21 deletions
@@ -11,15 +11,15 @@ import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
import org.jetbrains.kotlin.analysis.api.fir.findPsi
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirEnumEntrySymbolPointer
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.requireOwnerPointer
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
import org.jetbrains.kotlin.fir.containingClassLookupTag
import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId
@@ -45,11 +45,7 @@ internal class KtFirEnumEntrySymbol(
override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() }
override fun createPointer(): KtSymbolPointer<KtEnumEntrySymbol> = withValidityAssertion {
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
return KtFirEnumEntrySymbolPointer(
firSymbol.containingClassLookupTag()?.classId ?: error("Containing class should present for enum entry"),
firSymbol.name
)
KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFirEnumEntrySymbolPointer(requireOwnerPointer(), firSymbol.name)
}
override fun equals(other: Any?): Boolean = symbolEquals(other)
@@ -7,33 +7,30 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.api.fir.utils.firSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
internal class KtFirEnumEntrySymbolPointer(
private val ownerClassId: ClassId,
private val name: Name
private val ownerPointer: KtSymbolPointer<KtClassOrObjectSymbol>,
private val name: Name,
) : KtSymbolPointer<KtEnumEntrySymbol>() {
@Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol")
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtEnumEntrySymbol? {
require(analysisSession is KtFirAnalysisSession)
val enumClass = getEnumClass(analysisSession, ownerClassId)
?: return null
val enumEntry = enumClass.enumEntryByName(name)
?: return null
return analysisSession.firSymbolBuilder.buildEnumEntrySymbol(enumEntry.symbol)
}
val owner = with(analysisSession) {
ownerPointer.restoreSymbol()
}
private fun getEnumClass(analysisSession: KtFirAnalysisSession, classId: ClassId): FirRegularClass? {
val enumClass = analysisSession.firSymbolProvider.getClassLikeSymbolByClassId(classId)?.fir as? FirRegularClass
?: return null
val enumClass = owner?.firSymbol?.fir as? FirRegularClass ?: return null
if (enumClass.classKind != ClassKind.ENUM_CLASS) return null
return enumClass
val enumEntry = enumClass.enumEntryByName(name) ?: return null
return analysisSession.firSymbolBuilder.buildEnumEntrySymbol(enumEntry.symbol)
}
private fun FirRegularClass.enumEntryByName(name: Name): FirEnumEntry? =