FIR2IR: properly set constant expression type
This commit is contained in:
committed by
Space Team
parent
09175c7d56
commit
71456c5514
@@ -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
|
||||
|
||||
+21
-9
@@ -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,
|
||||
-> {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+10
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user