Set proper fir type for deserialized annotation's arguments

This commit is contained in:
Ivan Kylchik
2021-04-19 17:00:41 +03:00
committed by TeamCityServer
parent b3fa7b25cf
commit ca1932b3a5
@@ -225,29 +225,29 @@ abstract class AbstractAnnotationDeserializer(
return when (value.type) { return when (value.type) {
BYTE -> { BYTE -> {
val kind = if (isUnsigned) ConstantValueKind.UnsignedByte else ConstantValueKind.Byte val kind = if (isUnsigned) ConstantValueKind.UnsignedByte else ConstantValueKind.Byte
const(kind, value.intValue.toByte()) const(kind, value.intValue.toByte(), session.builtinTypes.byteType)
} }
SHORT -> { SHORT -> {
val kind = if (isUnsigned) ConstantValueKind.UnsignedShort else ConstantValueKind.Short val kind = if (isUnsigned) ConstantValueKind.UnsignedShort else ConstantValueKind.Short
const(kind, value.intValue.toShort()) const(kind, value.intValue.toShort(), session.builtinTypes.shortType)
} }
INT -> { INT -> {
val kind = if (isUnsigned) ConstantValueKind.UnsignedInt else ConstantValueKind.Int val kind = if (isUnsigned) ConstantValueKind.UnsignedInt else ConstantValueKind.Int
const(kind, value.intValue.toInt()) const(kind, value.intValue.toInt(), session.builtinTypes.intType)
} }
LONG -> { LONG -> {
val kind = if (isUnsigned) ConstantValueKind.UnsignedLong else ConstantValueKind.Long val kind = if (isUnsigned) ConstantValueKind.UnsignedLong else ConstantValueKind.Long
const(kind, value.intValue) const(kind, value.intValue, session.builtinTypes.longType)
} }
CHAR -> const(ConstantValueKind.Char, value.intValue.toInt().toChar()) CHAR -> const(ConstantValueKind.Char, value.intValue.toInt().toChar(), session.builtinTypes.charType)
FLOAT -> const(ConstantValueKind.Float, value.floatValue) FLOAT -> const(ConstantValueKind.Float, value.floatValue, session.builtinTypes.floatType)
DOUBLE -> const(ConstantValueKind.Double, value.doubleValue) DOUBLE -> const(ConstantValueKind.Double, value.doubleValue, session.builtinTypes.doubleType)
BOOLEAN -> const(ConstantValueKind.Boolean, (value.intValue != 0L)) BOOLEAN -> const(ConstantValueKind.Boolean, (value.intValue != 0L), session.builtinTypes.booleanType)
STRING -> const(ConstantValueKind.String, nameResolver.getString(value.stringValue)) STRING -> const(ConstantValueKind.String, nameResolver.getString(value.stringValue), session.builtinTypes.stringType)
ANNOTATION -> deserializeAnnotation(value.annotation, nameResolver) ANNOTATION -> deserializeAnnotation(value.annotation, nameResolver)
CLASS -> buildGetClassCall { CLASS -> buildGetClassCall {
val classId = nameResolver.getClassId(value.classId) val classId = nameResolver.getClassId(value.classId)
@@ -296,5 +296,7 @@ abstract class AbstractAnnotationDeserializer(
} }
} }
private fun <T> const(kind: ConstantValueKind<T>, value: T) = buildConstExpression(null, kind, value) private fun <T> const(kind: ConstantValueKind<T>, value: T, typeRef: FirResolvedTypeRef): FirConstExpression<T> {
return buildConstExpression(null, kind, value).apply { this.replaceTypeRef(typeRef) }
}
} }