[AA K2] reimplement symbol pointers for enum entry
^KT-54311
This commit is contained in:
committed by
Space Team
parent
9b6e9e2dd1
commit
bc3fcf22c4
+4
-8
@@ -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)
|
||||
|
||||
+10
-13
@@ -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? =
|
||||
|
||||
Reference in New Issue
Block a user