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 classCache = mutableMapOf<FirRegularClass, IrClass>()
|
||||||
|
|
||||||
|
private val typeAliasCache = mutableMapOf<FirTypeAlias, IrTypeAlias>()
|
||||||
|
|
||||||
private val typeParameterCache = mutableMapOf<FirTypeParameter, IrTypeParameter>()
|
private val typeParameterCache = mutableMapOf<FirTypeParameter, IrTypeParameter>()
|
||||||
|
|
||||||
private val typeParameterCacheForSetter = mutableMapOf<FirTypeParameter, IrTypeParameter>()
|
private val typeParameterCacheForSetter = mutableMapOf<FirTypeParameter, IrTypeParameter>()
|
||||||
@@ -136,7 +138,7 @@ class Fir2IrClassifierStorage(
|
|||||||
return this
|
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) {
|
return if (klass is FirAnonymousObject || klass is FirRegularClass && klass.visibility == Visibilities.LOCAL) {
|
||||||
localStorage.getLocalClass(klass)
|
localStorage.getLocalClass(klass)
|
||||||
} else {
|
} 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
|
// NB: klass can be either FirRegularClass or FirAnonymousObject
|
||||||
if (klass is FirAnonymousObject) {
|
if (klass is FirAnonymousObject) {
|
||||||
return createIrAnonymousObject(klass, irParent = parent)
|
return createIrAnonymousObject(klass, irParent = parent)
|
||||||
@@ -193,7 +195,7 @@ class Fir2IrClassifierStorage(
|
|||||||
preCacheTypeParameters(typeAlias)
|
preCacheTypeParameters(typeAlias)
|
||||||
return typeAlias.convertWithOffsets { startOffset, endOffset ->
|
return typeAlias.convertWithOffsets { startOffset, endOffset ->
|
||||||
declareIrTypeAlias(signature) { symbol ->
|
declareIrTypeAlias(signature) { symbol ->
|
||||||
IrTypeAliasImpl(
|
val irTypeAlias = IrTypeAliasImpl(
|
||||||
startOffset, endOffset, symbol,
|
startOffset, endOffset, symbol,
|
||||||
typeAlias.name, typeAlias.visibility,
|
typeAlias.name, typeAlias.visibility,
|
||||||
typeAlias.expandedTypeRef.toIrType(),
|
typeAlias.expandedTypeRef.toIrType(),
|
||||||
@@ -203,10 +205,14 @@ class Fir2IrClassifierStorage(
|
|||||||
setTypeParameters(typeAlias)
|
setTypeParameters(typeAlias)
|
||||||
parent.declarations += this
|
parent.declarations += this
|
||||||
}
|
}
|
||||||
|
typeAliasCache[typeAlias] = irTypeAlias
|
||||||
|
irTypeAlias
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun getCachedTypeAlias(firTypeAlias: FirTypeAlias): IrTypeAlias? = typeAliasCache[firTypeAlias]
|
||||||
|
|
||||||
private fun declareIrClass(signature: IdSignature?, factory: (IrClassSymbol) -> IrClass): IrClass {
|
private fun declareIrClass(signature: IdSignature?, factory: (IrClassSymbol) -> IrClass): IrClass {
|
||||||
if (signature == null) {
|
if (signature == null) {
|
||||||
val descriptor = WrappedClassDescriptor()
|
val descriptor = WrappedClassDescriptor()
|
||||||
@@ -369,7 +375,7 @@ class Fir2IrClassifierStorage(
|
|||||||
localStorage.putLocalClass(enumEntry.initializer as FirAnonymousObject, correspondingClass)
|
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 {
|
private fun declareIrEnumEntry(signature: IdSignature?, factory: (IrEnumEntrySymbol) -> IrEnumEntry): IrEnumEntry {
|
||||||
if (signature == null) {
|
if (signature == null) {
|
||||||
|
|||||||
@@ -100,13 +100,17 @@ class Fir2IrVisitor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirDeclaration.toIrDeclaration(): IrDeclaration? {
|
private fun FirDeclaration.toIrDeclaration(): IrDeclaration? =
|
||||||
if (this is FirTypeAlias) return null
|
accept(this@Fir2IrVisitor, null) as IrDeclaration
|
||||||
return 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 {
|
override fun visitEnumEntry(enumEntry: FirEnumEntry, data: Any?): IrElement {
|
||||||
val irEnumEntry = classifierStorage.getCachedIrEnumEntry(enumEntry)!!
|
val irEnumEntry = classifierStorage.getCachedIrEnumEntry(enumEntry)!!
|
||||||
annotationGenerator.generate(irEnumEntry, enumEntry)
|
annotationGenerator.generate(irEnumEntry, enumEntry)
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// FULL_JDK
|
// FULL_JDK
|
||||||
|
|
||||||
|
|||||||
+2
@@ -1,5 +1,7 @@
|
|||||||
FILE fqName:<root> fileName:/typeAliasesWithAnnotations.kt
|
FILE fqName:<root> fileName:/typeAliasesWithAnnotations.kt
|
||||||
TYPEALIAS name:TestTypeAlias visibility:public expandedType:kotlin.String
|
TYPEALIAS name:TestTypeAlias visibility:public expandedType:kotlin.String
|
||||||
|
annotations:
|
||||||
|
TestAnn(x = 'TestTypeAlias')
|
||||||
CLASS ANNOTATION_CLASS name:TestAnn modality:FINAL visibility:public superTypes:[kotlin.Annotation]
|
CLASS ANNOTATION_CLASS name:TestAnn modality:FINAL visibility:public superTypes:[kotlin.Annotation]
|
||||||
annotations:
|
annotations:
|
||||||
Target(allowedTargets = [GET_ENUM 'ENUM_ENTRY IR_EXTERNAL_DECLARATION_STUB name:TYPEALIAS' type=kotlin.annotation.AnnotationTarget])
|
Target(allowedTargets = [GET_ENUM 'ENUM_ENTRY IR_EXTERNAL_DECLARATION_STUB name:TYPEALIAS' type=kotlin.annotation.AnnotationTarget])
|
||||||
|
|||||||
Reference in New Issue
Block a user