[FIR] Deserialize enum entries access in annotations into FirEnumEntryDeserializedAccessExpression

^KT-64975 Fixed
^KT-62900
This commit is contained in:
Dmitriy Novozhilov
2024-01-17 17:17:00 +02:00
committed by Space Team
parent 150ff1172e
commit a4e8be8687
38 changed files with 120 additions and 103 deletions
@@ -7,10 +7,20 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.collectEnumEntries
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
import org.jetbrains.kotlin.fir.references.resolved
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedSymbolError
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.types.resolvedType
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
@RequiresOptIn(level = RequiresOptIn.Level.ERROR)
annotation class UnsafeExpressionUtility
@@ -49,6 +59,10 @@ fun FirExpression.toReferenceUnsafe(): FirReference? {
private fun FirExpression.toReferenceImpl(session: FirSession?): FirReference? {
return when (this) {
is FirEnumEntryDeserializedAccessExpression -> {
requireNotNull(session)
toReference(session)
}
is FirWrappedArgumentExpression -> expression.toResolvedCallableReferenceImpl(session)
is FirSmartCastExpression -> originalExpression.toReferenceImpl(session)
is FirDesugaredAssignmentValueReferenceExpression -> expressionRef.value.toReferenceImpl(session)
@@ -57,6 +71,24 @@ private fun FirExpression.toReferenceImpl(session: FirSession?): FirReference? {
}
}
fun FirEnumEntryDeserializedAccessExpression.toReference(session: FirSession): FirReference {
fun createErrorReference(diagnostic: ConeDiagnostic): FirErrorNamedReference {
return buildErrorNamedReference {
this.diagnostic = diagnostic
}
}
val enumSymbol = this.resolvedType.toRegularClassSymbol(session)
?: return createErrorReference(ConeUnresolvedSymbolError(resolvedType.classId!!))
val enumEntrySymbol = enumSymbol.collectEnumEntries().firstOrNull { it.name == enumEntryName }
?: return createErrorReference(ConeUnresolvedNameError(enumEntryName))
return buildResolvedNamedReference {
name = enumEntryName
resolvedSymbol = enumEntrySymbol
}
}
val FirVariableAssignment.calleeReference: FirReference?
get() {
// non-nullable session for `toReferenceImpl` is needed only for `FirEnumEntryDeserializedAccessExpression` value,