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