FIR body resolve: handle constant types more precisely

This commit is contained in:
Mikhail Glukhikh
2019-03-29 16:29:53 +03:00
parent cc2a5cfc06
commit c56b471b71
@@ -310,12 +310,13 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
}
override fun <T> transformConstExpression(constExpression: FirConstExpression<T>, data: Any?): CompositeTransformResult<FirStatement> {
if (data == null) return super.transformConstExpression(constExpression, data)
val expectedType = data as FirTypeRef
val expectedType = data as? FirTypeRef
if (expectedType is FirImplicitTypeRef) {
val symbol = when (constExpression.kind) {
val kind = constExpression.kind
if (expectedType is FirImplicitTypeRef || expectedType == null ||
kind == IrConstKind.Null || kind == IrConstKind.Boolean || kind == IrConstKind.Char
) {
val symbol = when (kind) {
IrConstKind.Null -> StandardClassIds.Nothing(symbolProvider)
IrConstKind.Boolean -> StandardClassIds.Boolean(symbolProvider)
IrConstKind.Char -> StandardClassIds.Char(symbolProvider)
@@ -328,7 +329,7 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
IrConstKind.Double -> StandardClassIds.Double(symbolProvider)
}
val type = ConeClassTypeImpl(symbol.toLookupTag(), emptyArray(), isNullable = constExpression.kind == IrConstKind.Null)
val type = ConeClassTypeImpl(symbol.toLookupTag(), emptyArray(), isNullable = kind == IrConstKind.Null)
constExpression.resultType = FirResolvedTypeRefImpl(session, null, type, false, emptyList())
} else {