FIR2IR: convert annotations on FirTypeRef

This commit is contained in:
Jinseong Jeon
2020-07-28 17:02:36 -07:00
committed by Mikhail Glukhikh
parent 4ca98041cd
commit bff36e0199
35 changed files with 141 additions and 167 deletions
@@ -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 -> {
@@ -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()
)!!
}
}