IR: add getPrimitiveType, optimize some usages of isInt/isByte/...

This commit is contained in:
Alexander Udalov
2021-02-21 12:12:57 +01:00
parent 17ee10a0d8
commit 0ebdf7c3c4
6 changed files with 114 additions and 119 deletions
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.deepCopyWithVariables
import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder
import org.jetbrains.kotlin.backend.common.lower.irIfThen
import org.jetbrains.kotlin.backend.common.lower.irThrow
import org.jetbrains.kotlin.builtins.PrimitiveType
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.*
@@ -358,17 +359,19 @@ open class SerializerIrGenerator(
private fun IrBuilderWithScope.defaultValueAndType(descriptor: PropertyDescriptor): Pair<IrExpression, IrType> {
val kType = descriptor.returnType!!
val T = kType.toIrType()
val defaultPrimitive: IrExpression? = when {
T.isInt() -> IrConstImpl.int(startOffset, endOffset, T, 0)
T.isBoolean() -> IrConstImpl.boolean(startOffset, endOffset, T, false)
T.isLong() -> IrConstImpl.long(startOffset, endOffset, T, 0)
T.isDouble() -> IrConstImpl.double(startOffset, endOffset, T, 0.0)
T.isFloat() -> IrConstImpl.float(startOffset, endOffset, T, 0.0f)
T.isChar() -> IrConstImpl.char(startOffset, endOffset, T, 0.toChar())
T.isByte() -> IrConstImpl.byte(startOffset, endOffset, T, 0)
T.isShort() -> IrConstImpl.short(startOffset, endOffset, T, 0)
else -> null
}
val defaultPrimitive: IrExpression? =
if (T.isMarkedNullable()) null
else when (T.getPrimitiveType()) {
PrimitiveType.BOOLEAN -> IrConstImpl.boolean(startOffset, endOffset, T, false)
PrimitiveType.CHAR -> IrConstImpl.char(startOffset, endOffset, T, 0.toChar())
PrimitiveType.BYTE -> IrConstImpl.byte(startOffset, endOffset, T, 0)
PrimitiveType.SHORT -> IrConstImpl.short(startOffset, endOffset, T, 0)
PrimitiveType.INT -> IrConstImpl.int(startOffset, endOffset, T, 0)
PrimitiveType.FLOAT -> IrConstImpl.float(startOffset, endOffset, T, 0.0f)
PrimitiveType.LONG -> IrConstImpl.long(startOffset, endOffset, T, 0)
PrimitiveType.DOUBLE -> IrConstImpl.double(startOffset, endOffset, T, 0.0)
else -> null
}
return if (defaultPrimitive == null)
irNull(compilerContext.irBuiltIns.anyNType) to (compilerContext.irBuiltIns.anyNType)
else