FIR2IR: convert annotations on type aliases

This commit is contained in:
Jinseong Jeon
2020-07-17 22:57:13 -07:00
committed by Mikhail Glukhikh
parent 4e14f9500f
commit 628b8b56b7
4 changed files with 20 additions and 10 deletions
@@ -49,6 +49,8 @@ class Fir2IrClassifierStorage(
private val classCache = mutableMapOf<FirRegularClass, IrClass>()
private val typeAliasCache = mutableMapOf<FirTypeAlias, IrTypeAlias>()
private val typeParameterCache = mutableMapOf<FirTypeParameter, IrTypeParameter>()
private val typeParameterCacheForSetter = mutableMapOf<FirTypeParameter, IrTypeParameter>()
@@ -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) {
@@ -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)
@@ -1,6 +1,4 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FULL_JDK
@@ -1,5 +1,7 @@
FILE fqName:<root> 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])