FIR2IR: store and convert annotations on enum entry
This commit is contained in:
committed by
Mikhail Glukhikh
parent
a1ffc0b25a
commit
f3475fd098
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.backend.generators.AnnotationGenerator
|
||||
import org.jetbrains.kotlin.fir.backend.generators.ClassMemberGenerator
|
||||
import org.jetbrains.kotlin.fir.backend.generators.OperatorExpressionGenerator
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
@@ -55,6 +56,8 @@ class Fir2IrVisitor(
|
||||
private val conversionScope: Fir2IrConversionScope
|
||||
) : Fir2IrComponents by components, FirDefaultVisitor<IrElement, Any?>(), IrGeneratorContextInterface {
|
||||
|
||||
private val annotationGenerator = AnnotationGenerator(this)
|
||||
|
||||
private val integerApproximator = IntegerLiteralTypeApproximationTransformer(
|
||||
session.firSymbolProvider,
|
||||
session.typeContext,
|
||||
@@ -106,9 +109,10 @@ class Fir2IrVisitor(
|
||||
|
||||
override fun visitEnumEntry(enumEntry: FirEnumEntry, data: Any?): IrElement {
|
||||
val irEnumEntry = classifierStorage.getCachedIrEnumEntry(enumEntry)!!
|
||||
annotationGenerator.generate(irEnumEntry, enumEntry)
|
||||
val correspondingClass = irEnumEntry.correspondingClass
|
||||
val initializer = enumEntry.initializer
|
||||
// If then enum entry has its own members, we need to introduce a synthetic class.
|
||||
// If the enum entry has its own members, we need to introduce a synthetic class.
|
||||
if (correspondingClass != null) {
|
||||
declarationStorage.enterScope(irEnumEntry)
|
||||
classifierStorage.putEnumEntryClassInScope(enumEntry, correspondingClass)
|
||||
|
||||
+1
@@ -603,6 +603,7 @@ class DeclarationsConverter(
|
||||
) {
|
||||
return@buildEnumEntry
|
||||
}
|
||||
annotations += modifiers.annotations
|
||||
initializer = withChildClassName(enumEntryName) {
|
||||
buildAnonymousObject {
|
||||
source = this@buildEnumEntry.source
|
||||
|
||||
@@ -653,12 +653,12 @@ class RawFirBuilder(
|
||||
isExpect = containingClassOrObject?.hasExpectModifier() == true
|
||||
}
|
||||
symbol = FirVariableSymbol(callableIdForName(nameAsSafeName))
|
||||
// NB: not sure should annotations be on enum entry itself, or on its corresponding object
|
||||
if (ownerClassHasDefaultConstructor && ktEnumEntry.initializerList == null &&
|
||||
ktEnumEntry.annotationEntries.isEmpty() && ktEnumEntry.body == null
|
||||
) {
|
||||
return@buildEnumEntry
|
||||
}
|
||||
extractAnnotationsTo(this)
|
||||
initializer = withChildClassName(nameAsSafeName) {
|
||||
buildAnonymousObject {
|
||||
source = toFirSourceElement(FirFakeSourceElementKind.EnumInitializer)
|
||||
|
||||
+2
-2
@@ -29,14 +29,14 @@ FILE: annotation.kt
|
||||
super<R|kotlin/Enum<My>|>()
|
||||
}
|
||||
|
||||
public final static enum entry FIRST: R|My| = @base() object : R|My| {
|
||||
@base() public final static enum entry FIRST: R|My| = @base() object : R|My| {
|
||||
private constructor(): R|<anonymous>| {
|
||||
super<R|My|>()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public final static enum entry SECOND: R|My| = @base() object : R|My| {
|
||||
@base() public final static enum entry SECOND: R|My| = @base() object : R|My| {
|
||||
private constructor(): R|<anonymous>| {
|
||||
super<R|My|>()
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// TARGET_BACKEND: JVM
|
||||
|
||||
// WITH_RUNTIME
|
||||
|
||||
+4
@@ -35,9 +35,13 @@ FILE fqName:<root> fileName:/enumEntriesWithAnnotations.kt
|
||||
<E>: <root>.TestEnum
|
||||
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS ENUM_CLASS name:TestEnum modality:OPEN visibility:public superTypes:[kotlin.Enum<<root>.TestEnum>]'
|
||||
ENUM_ENTRY name:ENTRY1
|
||||
annotations:
|
||||
TestAnn(x = 'ENTRY1')
|
||||
init: EXPRESSION_BODY
|
||||
ENUM_CONSTRUCTOR_CALL 'private constructor <init> () [primary] declared in <root>.TestEnum'
|
||||
ENUM_ENTRY name:ENTRY2
|
||||
annotations:
|
||||
TestAnn(x = 'ENTRY2')
|
||||
init: EXPRESSION_BODY
|
||||
ENUM_CONSTRUCTOR_CALL 'private constructor <init> () [primary] declared in <root>.TestEnum.ENTRY2'
|
||||
class: CLASS ENUM_ENTRY name:ENTRY2 modality:FINAL visibility:private superTypes:[<root>.TestEnum]
|
||||
|
||||
Reference in New Issue
Block a user