From f3475fd098faa8c96b262f6a0d6ed28bb2aeedd4 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Thu, 16 Jul 2020 15:14:35 -0700 Subject: [PATCH] FIR2IR: store and convert annotations on enum entry --- .../src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt | 6 +++++- .../kotlin/fir/lightTree/converter/DeclarationsConverter.kt | 1 + .../src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt | 2 +- .../psi2fir/testData/rawBuilder/declarations/annotation.txt | 4 ++-- .../testData/codegen/box/annotations/annotatedEnumEntry.kt | 1 - .../annotations/enumEntriesWithAnnotations.fir.txt | 4 ++++ 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 96e2d9c2165..1a5f3d2fae0 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -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(), 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) diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 873ef5c650e..1f465243939 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -603,6 +603,7 @@ class DeclarationsConverter( ) { return@buildEnumEntry } + annotations += modifiers.annotations initializer = withChildClassName(enumEntryName) { buildAnonymousObject { source = this@buildEnumEntry.source diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index c011370c528..77743d21a29 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -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) diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.txt index 14d2ce2116b..9968ef381f1 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.txt @@ -29,14 +29,14 @@ FILE: annotation.kt super|>() } - 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|| { super() } } - 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|| { super() } diff --git a/compiler/testData/codegen/box/annotations/annotatedEnumEntry.kt b/compiler/testData/codegen/box/annotations/annotatedEnumEntry.kt index c7b86761c9f..14067a76e51 100644 --- a/compiler/testData/codegen/box/annotations/annotatedEnumEntry.kt +++ b/compiler/testData/codegen/box/annotations/annotatedEnumEntry.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/ir/irText/declarations/annotations/enumEntriesWithAnnotations.fir.txt b/compiler/testData/ir/irText/declarations/annotations/enumEntriesWithAnnotations.fir.txt index 864cd0a6bc3..abaa3936771 100644 --- a/compiler/testData/ir/irText/declarations/annotations/enumEntriesWithAnnotations.fir.txt +++ b/compiler/testData/ir/irText/declarations/annotations/enumEntriesWithAnnotations.fir.txt @@ -35,9 +35,13 @@ FILE fqName: fileName:/enumEntriesWithAnnotations.kt : .TestEnum INSTANCE_INITIALIZER_CALL classDescriptor='CLASS ENUM_CLASS name:TestEnum modality:OPEN visibility:public superTypes:[kotlin.Enum<.TestEnum>]' ENUM_ENTRY name:ENTRY1 + annotations: + TestAnn(x = 'ENTRY1') init: EXPRESSION_BODY ENUM_CONSTRUCTOR_CALL 'private constructor () [primary] declared in .TestEnum' ENUM_ENTRY name:ENTRY2 + annotations: + TestAnn(x = 'ENTRY2') init: EXPRESSION_BODY ENUM_CONSTRUCTOR_CALL 'private constructor () [primary] declared in .TestEnum.ENTRY2' class: CLASS ENUM_ENTRY name:ENTRY2 modality:FINAL visibility:private superTypes:[.TestEnum]