FIR2IR: convert annotations on FirTypeRef
This commit is contained in:
committed by
Mikhail Glukhikh
parent
4ca98041cd
commit
bff36e0199
@@ -5,6 +5,8 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.backend
|
||||
|
||||
import org.jetbrains.kotlin.fir.backend.generators.AnnotationGenerator
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
@@ -21,6 +23,8 @@ import org.jetbrains.kotlin.types.Variance
|
||||
class Fir2IrTypeConverter(
|
||||
private val components: Fir2IrComponents
|
||||
) : Fir2IrComponents by components {
|
||||
private val annotationGenerator = AnnotationGenerator(this)
|
||||
|
||||
internal val classIdToSymbolMap = mapOf(
|
||||
StandardClassIds.Nothing to irBuiltIns.nothingClass,
|
||||
StandardClassIds.Unit to irBuiltIns.unitClass,
|
||||
@@ -55,7 +59,7 @@ class Fir2IrTypeConverter(
|
||||
fun FirTypeRef.toIrType(typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT): IrType {
|
||||
return when (this) {
|
||||
!is FirResolvedTypeRef -> createErrorType()
|
||||
!is FirImplicitBuiltinTypeRef -> type.toIrType(typeContext)
|
||||
!is FirImplicitBuiltinTypeRef -> type.toIrType(typeContext, annotations)
|
||||
is FirImplicitNothingTypeRef -> irBuiltIns.nothingType
|
||||
is FirImplicitUnitTypeRef -> irBuiltIns.unitType
|
||||
is FirImplicitBooleanTypeRef -> irBuiltIns.booleanType
|
||||
@@ -64,11 +68,14 @@ class Fir2IrTypeConverter(
|
||||
is FirImplicitIntTypeRef -> irBuiltIns.intType
|
||||
is FirImplicitNullableAnyTypeRef -> irBuiltIns.anyNType
|
||||
is FirImplicitNullableNothingTypeRef -> irBuiltIns.nothingNType
|
||||
else -> type.toIrType(typeContext)
|
||||
else -> type.toIrType(typeContext, annotations)
|
||||
}
|
||||
}
|
||||
|
||||
fun ConeKotlinType.toIrType(typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT): IrType {
|
||||
fun ConeKotlinType.toIrType(
|
||||
typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT,
|
||||
annotations: List<FirAnnotationCall> = emptyList()
|
||||
): IrType {
|
||||
return when (this) {
|
||||
is ConeKotlinErrorType -> createErrorType()
|
||||
is ConeLookupTagBasedType -> {
|
||||
@@ -77,11 +84,10 @@ class Fir2IrTypeConverter(
|
||||
val firSymbol = this.lookupTag.toSymbol(session) ?: return createErrorType()
|
||||
firSymbol.toSymbol(session, classifierStorage, typeContext)
|
||||
}
|
||||
// TODO: annotations
|
||||
IrSimpleTypeImpl(
|
||||
irSymbol, !typeContext.definitelyNotNull && this.isMarkedNullable,
|
||||
typeArguments.map { it.toIrTypeArgument() },
|
||||
emptyList()
|
||||
with(annotationGenerator) { annotations.toIrAnnotations() }
|
||||
)
|
||||
}
|
||||
is ConeFlexibleType -> {
|
||||
|
||||
+13
-24
@@ -8,9 +8,9 @@ package org.jetbrains.kotlin.fir.backend.generators
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.fir.FirAnnotationContainer
|
||||
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
|
||||
import org.jetbrains.kotlin.fir.backend.Fir2IrVisitor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||
import org.jetbrains.kotlin.ir.util.isPropertyField
|
||||
@@ -26,10 +26,13 @@ import org.jetbrains.kotlin.ir.util.isSetter
|
||||
*/
|
||||
internal class AnnotationGenerator(private val components: Fir2IrComponents) : Fir2IrComponents by components {
|
||||
|
||||
fun generate(irContainer: IrMutableAnnotationContainer, firContainer: FirAnnotationContainer) {
|
||||
irContainer.annotations = firContainer.annotations.mapNotNull {
|
||||
fun List<FirAnnotationCall>.toIrAnnotations(): List<IrConstructorCall> =
|
||||
mapNotNull {
|
||||
callGenerator.convertToIrConstructorCall(it) as? IrConstructorCall
|
||||
}
|
||||
|
||||
fun generate(irContainer: IrMutableAnnotationContainer, firContainer: FirAnnotationContainer) {
|
||||
irContainer.annotations = firContainer.annotations.toIrAnnotations()
|
||||
}
|
||||
|
||||
fun generate(irValueParameter: IrValueParameter, firValueParameter: FirValueParameter, isInConstructor: Boolean) {
|
||||
@@ -38,9 +41,7 @@ internal class AnnotationGenerator(private val components: Fir2IrComponents) : F
|
||||
.filter {
|
||||
it.useSiteTarget == null || !isInConstructor || it.useSiteTarget == AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER
|
||||
}
|
||||
.mapNotNull {
|
||||
callGenerator.convertToIrConstructorCall(it) as? IrConstructorCall
|
||||
}
|
||||
.toIrAnnotations()
|
||||
}
|
||||
|
||||
fun generate(irProperty: IrProperty, property: FirProperty) {
|
||||
@@ -49,9 +50,7 @@ internal class AnnotationGenerator(private val components: Fir2IrComponents) : F
|
||||
.filter {
|
||||
it.useSiteTarget == null || it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY
|
||||
}
|
||||
.mapNotNull {
|
||||
callGenerator.convertToIrConstructorCall(it) as? IrConstructorCall
|
||||
}
|
||||
.toIrAnnotations()
|
||||
}
|
||||
|
||||
fun generate(irField: IrField, property: FirProperty) {
|
||||
@@ -64,9 +63,7 @@ internal class AnnotationGenerator(private val components: Fir2IrComponents) : F
|
||||
it.useSiteTarget == AnnotationUseSiteTarget.FIELD ||
|
||||
it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD
|
||||
}
|
||||
.mapNotNull {
|
||||
callGenerator.convertToIrConstructorCall(it) as? IrConstructorCall
|
||||
}
|
||||
.toIrAnnotations()
|
||||
}
|
||||
|
||||
fun generate(propertyAccessor: IrFunction, property: FirProperty) {
|
||||
@@ -79,18 +76,14 @@ internal class AnnotationGenerator(private val components: Fir2IrComponents) : F
|
||||
.filter {
|
||||
it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY_SETTER
|
||||
}
|
||||
.mapNotNull {
|
||||
callGenerator.convertToIrConstructorCall(it) as? IrConstructorCall
|
||||
}
|
||||
.toIrAnnotations()
|
||||
propertyAccessor.valueParameters.singleOrNull()?.annotations =
|
||||
propertyAccessor.valueParameters.singleOrNull()?.annotations?.plus(
|
||||
property.annotations
|
||||
.filter {
|
||||
it.useSiteTarget == AnnotationUseSiteTarget.SETTER_PARAMETER
|
||||
}
|
||||
.mapNotNull {
|
||||
callGenerator.convertToIrConstructorCall(it) as? IrConstructorCall
|
||||
}
|
||||
.toIrAnnotations()
|
||||
)!!
|
||||
} else {
|
||||
propertyAccessor.annotations +=
|
||||
@@ -98,9 +91,7 @@ internal class AnnotationGenerator(private val components: Fir2IrComponents) : F
|
||||
.filter {
|
||||
it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY_GETTER
|
||||
}
|
||||
.mapNotNull {
|
||||
callGenerator.convertToIrConstructorCall(it) as? IrConstructorCall
|
||||
}
|
||||
.toIrAnnotations()
|
||||
}
|
||||
propertyAccessor.extensionReceiverParameter?.annotations =
|
||||
propertyAccessor.extensionReceiverParameter?.annotations?.plus(
|
||||
@@ -108,9 +99,7 @@ internal class AnnotationGenerator(private val components: Fir2IrComponents) : F
|
||||
.filter {
|
||||
it.useSiteTarget == AnnotationUseSiteTarget.RECEIVER
|
||||
}
|
||||
.mapNotNull {
|
||||
callGenerator.convertToIrConstructorCall(it) as? IrConstructorCall
|
||||
}
|
||||
.toIrAnnotations()
|
||||
)!!
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user