From 628b8b56b7d8d84237e595f4490714ce0cae165d Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Fri, 17 Jul 2020 22:57:13 -0700 Subject: [PATCH] FIR2IR: convert annotations on type aliases --- .../kotlin/fir/backend/Fir2IrClassifierStorage.kt | 14 ++++++++++---- .../jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt | 12 ++++++++---- .../box/annotations/annotationsOnTypeAliases.kt | 2 -- .../annotations/typeAliasesWithAnnotations.fir.txt | 2 ++ 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 85ac7b7329f..ed0ad426223 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -49,6 +49,8 @@ class Fir2IrClassifierStorage( private val classCache = mutableMapOf() + private val typeAliasCache = mutableMapOf() + private val typeParameterCache = mutableMapOf() private val typeParameterCacheForSetter = mutableMapOf() @@ -136,7 +138,7 @@ class Fir2IrClassifierStorage( return this } - fun getCachedIrClass(klass: FirClass<*>): IrClass? { + internal fun getCachedIrClass(klass: FirClass<*>): IrClass? { return if (klass is FirAnonymousObject || klass is FirRegularClass && klass.visibility == Visibilities.LOCAL) { localStorage.getLocalClass(klass) } else { @@ -158,7 +160,7 @@ class Fir2IrClassifierStorage( } } - internal fun createIrClass(klass: FirClass<*>, parent: IrDeclarationParent? = null): IrClass { + private fun createIrClass(klass: FirClass<*>, parent: IrDeclarationParent? = null): IrClass { // NB: klass can be either FirRegularClass or FirAnonymousObject if (klass is FirAnonymousObject) { return createIrAnonymousObject(klass, irParent = parent) @@ -193,7 +195,7 @@ class Fir2IrClassifierStorage( preCacheTypeParameters(typeAlias) return typeAlias.convertWithOffsets { startOffset, endOffset -> declareIrTypeAlias(signature) { symbol -> - IrTypeAliasImpl( + val irTypeAlias = IrTypeAliasImpl( startOffset, endOffset, symbol, typeAlias.name, typeAlias.visibility, typeAlias.expandedTypeRef.toIrType(), @@ -203,10 +205,14 @@ class Fir2IrClassifierStorage( setTypeParameters(typeAlias) parent.declarations += this } + typeAliasCache[typeAlias] = irTypeAlias + irTypeAlias } } } + internal fun getCachedTypeAlias(firTypeAlias: FirTypeAlias): IrTypeAlias? = typeAliasCache[firTypeAlias] + private fun declareIrClass(signature: IdSignature?, factory: (IrClassSymbol) -> IrClass): IrClass { if (signature == null) { val descriptor = WrappedClassDescriptor() @@ -369,7 +375,7 @@ class Fir2IrClassifierStorage( localStorage.putLocalClass(enumEntry.initializer as FirAnonymousObject, correspondingClass) } - fun getCachedIrEnumEntry(enumEntry: FirEnumEntry): IrEnumEntry? = enumEntryCache[enumEntry] + internal fun getCachedIrEnumEntry(enumEntry: FirEnumEntry): IrEnumEntry? = enumEntryCache[enumEntry] private fun declareIrEnumEntry(signature: IdSignature?, factory: (IrEnumEntrySymbol) -> IrEnumEntry): IrEnumEntry { if (signature == null) { 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 1b3192a64fb..ad74fe4ea69 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 @@ -100,13 +100,17 @@ class Fir2IrVisitor( } } - private fun FirDeclaration.toIrDeclaration(): IrDeclaration? { - if (this is FirTypeAlias) return null - return accept(this@Fir2IrVisitor, null) as IrDeclaration - } + private fun FirDeclaration.toIrDeclaration(): IrDeclaration? = + accept(this@Fir2IrVisitor, null) as IrDeclaration // ================================================================================== + override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Any?): IrElement { + val irTypeAlias = classifierStorage.getCachedTypeAlias(typeAlias)!! + annotationGenerator.generate(irTypeAlias, typeAlias) + return irTypeAlias + } + override fun visitEnumEntry(enumEntry: FirEnumEntry, data: Any?): IrElement { val irEnumEntry = classifierStorage.getCachedIrEnumEntry(enumEntry)!! annotationGenerator.generate(irEnumEntry, enumEntry) diff --git a/compiler/testData/codegen/box/annotations/annotationsOnTypeAliases.kt b/compiler/testData/codegen/box/annotations/annotationsOnTypeAliases.kt index 276f41f0a91..147598e7a5e 100644 --- a/compiler/testData/codegen/box/annotations/annotationsOnTypeAliases.kt +++ b/compiler/testData/codegen/box/annotations/annotationsOnTypeAliases.kt @@ -1,6 +1,4 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM - // WITH_RUNTIME // FULL_JDK diff --git a/compiler/testData/ir/irText/declarations/annotations/typeAliasesWithAnnotations.fir.txt b/compiler/testData/ir/irText/declarations/annotations/typeAliasesWithAnnotations.fir.txt index f0e6e604deb..ddf6d821efa 100644 --- a/compiler/testData/ir/irText/declarations/annotations/typeAliasesWithAnnotations.fir.txt +++ b/compiler/testData/ir/irText/declarations/annotations/typeAliasesWithAnnotations.fir.txt @@ -1,5 +1,7 @@ FILE fqName: fileName:/typeAliasesWithAnnotations.kt TYPEALIAS name:TestTypeAlias visibility:public expandedType:kotlin.String + annotations: + TestAnn(x = 'TestTypeAlias') CLASS ANNOTATION_CLASS name:TestAnn modality:FINAL visibility:public superTypes:[kotlin.Annotation] annotations: Target(allowedTargets = [GET_ENUM 'ENUM_ENTRY IR_EXTERNAL_DECLARATION_STUB name:TYPEALIAS' type=kotlin.annotation.AnnotationTarget])