FIR2IR: properly set constant expression type

This commit is contained in:
Mikhail Glukhikh
2023-06-26 16:00:53 +03:00
committed by Space Team
parent 09175c7d56
commit 71456c5514
12 changed files with 172 additions and 58 deletions
@@ -38,7 +38,7 @@ inline val FirAnnotation.unexpandedClassId: ClassId?
fun <T> buildConstOrErrorExpression(source: KtSourceElement?, kind: ConstantValueKind<T>, value: T?, diagnostic: ConeDiagnostic): FirExpression =
value?.let {
buildConstExpression(source, kind, it)
buildConstExpression(source, kind, it, setType = false)
} ?: buildErrorExpression {
this.source = source
this.diagnostic = diagnostic
@@ -18,18 +18,30 @@ fun <T> buildConstExpression(
kind: ConstantValueKind<T>,
value: T,
annotations: MutableList<FirAnnotation> = mutableListOf(),
setType: Boolean = false
setType: Boolean
): FirConstExpression<T> {
return FirConstExpressionImpl(source, annotations.toMutableOrEmpty(), kind, value).also {
if (setType) {
when (value) {
null -> it.typeRef = FirImplicitNullableAnyTypeRef(null)
is String -> it.typeRef = FirImplicitStringTypeRef(null)
is Long -> it.typeRef = FirImplicitLongTypeRef(null)
is Int -> it.typeRef = FirImplicitIntTypeRef(null)
is Boolean -> it.typeRef = FirImplicitBooleanTypeRef(null)
is Double -> it.typeRef = FirImplicitDoubleTypeRef(null)
is Float -> it.typeRef = FirImplicitFloatTypeRef(null)
when (kind) {
ConstantValueKind.Boolean -> it.typeRef = FirImplicitBooleanTypeRef(null)
ConstantValueKind.Byte -> it.typeRef = FirImplicitByteTypeRef(null)
ConstantValueKind.Char -> it.typeRef = FirImplicitCharTypeRef(null)
ConstantValueKind.Double -> it.typeRef = FirImplicitDoubleTypeRef(null)
ConstantValueKind.Float -> it.typeRef = FirImplicitFloatTypeRef(null)
ConstantValueKind.Int -> it.typeRef = FirImplicitIntTypeRef(null)
ConstantValueKind.Long -> it.typeRef = FirImplicitLongTypeRef(null)
ConstantValueKind.Null -> it.typeRef = FirImplicitNullableAnyTypeRef(null)
ConstantValueKind.Short -> it.typeRef = FirImplicitShortTypeRef(null)
ConstantValueKind.String -> it.typeRef = FirImplicitStringTypeRef(null)
ConstantValueKind.UnsignedByte -> it.typeRef = FirImplicitUByteTypeRef(null)
ConstantValueKind.UnsignedInt -> it.typeRef = FirImplicitUIntTypeRef(null)
ConstantValueKind.UnsignedLong -> it.typeRef = FirImplicitULongTypeRef(null)
ConstantValueKind.UnsignedShort -> it.typeRef = FirImplicitUShortTypeRef(null)
ConstantValueKind.IntegerLiteral,
ConstantValueKind.UnsignedIntegerLiteral,
ConstantValueKind.Error,
-> {
}
}
}
}
@@ -106,6 +106,14 @@ class FirImplicitULongTypeRef(
source: KtSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.ULong)
class FirImplicitUShortTypeRef(
source: KtSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.UShort)
class FirImplicitUByteTypeRef(
source: KtSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.UByte)
class FirImplicitNothingTypeRef(
source: KtSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Nothing)
@@ -241,5 +249,7 @@ fun FirImplicitBuiltinTypeRef.withNewSource(newSource: KtSourceElement?): FirImp
extensionReceiverTypeArgument = type.typeArguments[1],
propertyTypeArgument = type.typeArguments[2]
)
is FirImplicitUByteTypeRef -> FirImplicitUByteTypeRef(newSource)
is FirImplicitUShortTypeRef -> FirImplicitUShortTypeRef(newSource)
}
}