FIR2IR: convert annotations on type aliases
This commit is contained in:
committed by
Mikhail Glukhikh
parent
4e14f9500f
commit
628b8b56b7
+10
-4
@@ -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
|
||||
|
||||
|
||||
+2
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user