FIR2IR: fix library annotation call generation
This commit is contained in:
@@ -26,14 +26,8 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBooleanTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitNothingTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitStringTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.render
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.*
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
@@ -199,7 +193,7 @@ internal class Fir2IrVisitor(
|
||||
}
|
||||
|
||||
private fun FirClass.getPrimaryConstructorIfAny(): FirConstructor? =
|
||||
(declarations.firstOrNull() as? FirConstructor)?.takeIf { it.isPrimary }
|
||||
declarations.filterIsInstance<FirConstructor>().firstOrNull()?.takeIf { it.isPrimary }
|
||||
|
||||
private fun IrClass.addFakeOverrides(klass: FirClass, processedFunctionNames: MutableList<Name>) {
|
||||
if (fakeOverrideMode == FakeOverrideMode.NONE) return
|
||||
@@ -693,13 +687,19 @@ internal class Fir2IrVisitor(
|
||||
}
|
||||
|
||||
private fun FirAnnotationCall.toIrExpression(): IrExpression {
|
||||
val type = (annotationTypeRef as? FirResolvedTypeRef)?.type?.toIrType(this@Fir2IrVisitor.session, declarationStorage)
|
||||
val coneType = (annotationTypeRef as? FirResolvedTypeRef)?.type as? ConeLookupTagBasedType
|
||||
val firSymbol = coneType?.lookupTag?.toSymbol(session) as? FirClassSymbol
|
||||
val type = coneType?.toIrType(this@Fir2IrVisitor.session, declarationStorage)
|
||||
val symbol = type?.classifierOrNull
|
||||
return convertWithOffsets { startOffset, endOffset ->
|
||||
when (symbol) {
|
||||
is IrClassSymbol -> {
|
||||
val irClass = symbol.owner
|
||||
val irConstructor = irClass.constructors.firstOrNull()
|
||||
val irConstructor = firSymbol?.fir?.getPrimaryConstructorIfAny()?.let { firConstructor ->
|
||||
declarationStorage.getIrConstructor(firConstructor, irParent = irClass, shouldLeaveScope = true)
|
||||
}?.apply {
|
||||
this.parent = irClass
|
||||
}
|
||||
if (irConstructor == null) {
|
||||
IrErrorCallExpressionImpl(startOffset, endOffset, type, "No annotation constructor found: ${irClass.name}")
|
||||
} else {
|
||||
|
||||
@@ -2,6 +2,8 @@ FILE fqName:test fileName:/fileAnnotations.kt
|
||||
annotations:
|
||||
A(x = 'File annotation')
|
||||
CLASS ANNOTATION_CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Annotation]
|
||||
annotations:
|
||||
Target(allowedTargets = GET_OBJECT 'CLASS ENUM_ENTRY name:FILE modality:FINAL visibility:unknown superTypes:[]' type=kotlin.annotation.AnnotationTarget)
|
||||
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:test.A
|
||||
CONSTRUCTOR visibility:public <> (x:kotlin.String) returnType:test.A [primary]
|
||||
VALUE_PARAMETER name:x index:0 type:kotlin.String
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
FILE fqName:<root> fileName:/typeAliasesWithAnnotations.kt
|
||||
CLASS ANNOTATION_CLASS name:TestAnn modality:FINAL visibility:public superTypes:[kotlin.Annotation]
|
||||
annotations:
|
||||
Target(allowedTargets = GET_OBJECT 'CLASS ENUM_ENTRY name:TYPEALIAS modality:FINAL visibility:unknown superTypes:[]' type=kotlin.annotation.AnnotationTarget)
|
||||
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.TestAnn
|
||||
CONSTRUCTOR visibility:public <> (x:kotlin.String) returnType:<root>.TestAnn [primary]
|
||||
VALUE_PARAMETER name:x index:0 type:kotlin.String
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
FILE fqName:<root> fileName:/typeParametersWithAnnotations.kt
|
||||
CLASS ANNOTATION_CLASS name:Anno modality:FINAL visibility:public superTypes:[kotlin.Annotation]
|
||||
annotations:
|
||||
Target(allowedTargets = GET_OBJECT 'CLASS ENUM_ENTRY name:TYPE_PARAMETER modality:FINAL visibility:unknown superTypes:[]' type=kotlin.annotation.AnnotationTarget)
|
||||
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Anno
|
||||
CONSTRUCTOR visibility:public <> () returnType:<root>.Anno [primary]
|
||||
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
FILE fqName:<root> fileName:/fileWithAnnotations.kt
|
||||
FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
||||
BLOCK_BODY
|
||||
PROPERTY name:bar visibility:public modality:FINAL [val]
|
||||
FIELD PROPERTY_BACKING_FIELD name:bar type:kotlin.Int visibility:public [final,static]
|
||||
EXPRESSION_BODY
|
||||
CONST Int type=kotlin.Int value=42
|
||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-bar> visibility:public modality:FINAL <> () returnType:kotlin.Int
|
||||
correspondingProperty: PROPERTY name:bar visibility:public modality:FINAL [val]
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun <get-bar> (): kotlin.Int declared in <root>'
|
||||
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:bar type:kotlin.Int visibility:public [final,static]' type=kotlin.Int origin=null
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// WITH_RUNTIME
|
||||
@file:JvmName("FileWithAnnotations")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user