[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
@@ -280,26 +280,9 @@ abstract class AbstractAnnotationDeserializer(
)
coneTypeOrNull = resolvedType
}
ENUM -> buildPropertyAccessExpression {
val classId = nameResolver.getClassId(value.classId)
val entryName = nameResolver.getName(value.enumValueId)
val enumLookupTag = classId.toLookupTag()
val enumSymbol = enumLookupTag.toSymbol(session)
val firClass = enumSymbol?.fir as? FirRegularClass
val enumEntries = firClass?.collectEnumEntries() ?: emptyList()
val enumEntrySymbol = enumEntries.find { it.name == entryName }
calleeReference = enumEntrySymbol?.let {
buildResolvedNamedReference {
name = entryName
resolvedSymbol = it.symbol
}
} ?: buildFromMissingDependenciesNamedReference {
name = entryName
}
if (enumEntrySymbol != null) {
coneTypeOrNull = enumEntrySymbol.returnTypeRef.coneTypeOrNull
}
ENUM -> buildEnumEntryDeserializedAccessExpression {
enumClassId = nameResolver.getClassId(value.classId)
enumEntryName = nameResolver.getName(value.enumValueId)
}
ARRAY -> {
val expectedArrayElementType = expectedType()?.arrayElementType() ?: session.builtinTypes.anyType.type
@@ -12,10 +12,12 @@ import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.FirEnumEntryDeserializedAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildPropertyAccessExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedQualifier
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredPropertySymbols
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.types.ConeTypeProjection
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.toLookupTag
@@ -43,7 +45,16 @@ fun FirEnumEntryDeserializedAccessExpression.toQualifiedPropertyAccessExpression
}
}
coneTypeOrNull = ConeClassLikeTypeImpl(
enumClassId.toLookupTag(), ConeTypeProjection.EMPTY_ARRAY, isNullable = false
)
val enumClassLookupTag = enumClassId.toLookupTag()
val enumClassType = ConeClassLikeTypeImpl(enumClassLookupTag, ConeTypeProjection.EMPTY_ARRAY, isNullable = false)
coneTypeOrNull = enumClassType
val receiver = buildResolvedQualifier {
coneTypeOrNull = enumClassType
packageFqName = enumClassId.packageFqName
relativeClassFqName = enumClassId.relativeClassName
symbol = enumClassLookupTag.toSymbol(session)
}
dispatchReceiver = receiver
explicitReceiver = receiver
}