FIR2IR: store and convert annotations on enum entry

This commit is contained in:
Jinseong Jeon
2020-07-16 15:14:35 -07:00
committed by Mikhail Glukhikh
parent a1ffc0b25a
commit f3475fd098
6 changed files with 13 additions and 5 deletions
@@ -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)
@@ -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)
@@ -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
@@ -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]