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> { 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 kind = constExpression.kind
if (expectedType is FirImplicitTypeRef || expectedType == null ||
val symbol = when (constExpression.kind) { kind == IrConstKind.Null || kind == IrConstKind.Boolean || kind == IrConstKind.Char
) {
val symbol = when (kind) {
IrConstKind.Null -> StandardClassIds.Nothing(symbolProvider) IrConstKind.Null -> StandardClassIds.Nothing(symbolProvider)
IrConstKind.Boolean -> StandardClassIds.Boolean(symbolProvider) IrConstKind.Boolean -> StandardClassIds.Boolean(symbolProvider)
IrConstKind.Char -> StandardClassIds.Char(symbolProvider) IrConstKind.Char -> StandardClassIds.Char(symbolProvider)
@@ -328,7 +329,7 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
IrConstKind.Double -> StandardClassIds.Double(symbolProvider) 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()) constExpression.resultType = FirResolvedTypeRefImpl(session, null, type, false, emptyList())
} else { } else {