Generate parameter name in assertion for lateinit properties
This commit is contained in:
+26
-6
@@ -18,22 +18,26 @@ package org.jetbrains.kotlin.backend.common.lower
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.CommonBackendContext
|
import org.jetbrains.kotlin.backend.common.CommonBackendContext
|
||||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrProperty
|
import org.jetbrains.kotlin.ir.declarations.IrProperty
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrBlock
|
import org.jetbrains.kotlin.ir.expressions.IrBlock
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockImpl
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
class LateinitLowering(val context: CommonBackendContext): FileLoweringPass {
|
class LateinitLowering(
|
||||||
|
val context: CommonBackendContext,
|
||||||
|
private val generateParameterNameInAssertion: Boolean = false
|
||||||
|
) : FileLoweringPass {
|
||||||
override fun lower(irFile: IrFile) {
|
override fun lower(irFile: IrFile) {
|
||||||
irFile.transformChildrenVoid(object : IrElementTransformerVoid() {
|
irFile.transformChildrenVoid(object : IrElementTransformerVoid() {
|
||||||
override fun visitProperty(declaration: IrProperty): IrStatement {
|
override fun visitProperty(declaration: IrProperty): IrStatement {
|
||||||
@@ -54,10 +58,12 @@ class LateinitLowering(val context: CommonBackendContext): FileLoweringPass {
|
|||||||
irGetField(getter.dispatchReceiverParameter?.let { irGet(it.symbol) }, backingFieldSymbol)
|
irGetField(getter.dispatchReceiverParameter?.let { irGet(it.symbol) }, backingFieldSymbol)
|
||||||
)
|
)
|
||||||
block.statements.add(resultVar)
|
block.statements.add(resultVar)
|
||||||
val throwIfNull = irIfThenElse(context.builtIns.nothingType,
|
val throwIfNull = irIfThenElse(
|
||||||
|
context.builtIns.nothingType,
|
||||||
irNotEquals(irGet(resultVar.symbol), irNull()),
|
irNotEquals(irGet(resultVar.symbol), irNull()),
|
||||||
irReturn(irGet(resultVar.symbol)),
|
irReturn(irGet(resultVar.symbol)),
|
||||||
irCall(throwErrorFunction))
|
throwUninitializedPropertyAccessException(backingFieldSymbol)
|
||||||
|
)
|
||||||
block.statements.add(throwIfNull)
|
block.statements.add(throwIfNull)
|
||||||
getter.body = IrExpressionBodyImpl(startOffset, endOffset, block)
|
getter.body = IrExpressionBodyImpl(startOffset, endOffset, block)
|
||||||
}
|
}
|
||||||
@@ -65,9 +71,23 @@ class LateinitLowering(val context: CommonBackendContext): FileLoweringPass {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun IrBuilderWithScope.throwUninitializedPropertyAccessException(backingFieldSymbol: IrFieldSymbol) =
|
||||||
|
irCall(throwErrorFunction).apply {
|
||||||
|
if (generateParameterNameInAssertion) {
|
||||||
|
putValueArgument(
|
||||||
|
0,
|
||||||
|
IrConstImpl.string(
|
||||||
|
UNDEFINED_OFFSET,
|
||||||
|
UNDEFINED_OFFSET,
|
||||||
|
context.builtIns.stringType,
|
||||||
|
backingFieldSymbol.descriptor.name.asString()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private val throwErrorFunction = context.ir.symbols.ThrowUninitializedPropertyAccessException
|
private val throwErrorFunction = context.ir.symbols.ThrowUninitializedPropertyAccessException
|
||||||
|
|
||||||
private fun IrBuilderWithScope.irBlock(type: KotlinType): IrBlock
|
private fun IrBuilderWithScope.irBlock(type: KotlinType): IrBlock = IrBlockImpl(startOffset, endOffset, type)
|
||||||
= IrBlockImpl(startOffset, endOffset, type)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -28,7 +28,9 @@ class JvmLower(val context: JvmBackendContext) {
|
|||||||
// TODO run lowering passes as callbacks in bottom-up visitor
|
// TODO run lowering passes as callbacks in bottom-up visitor
|
||||||
FileClassLowering(context).lower(irFile)
|
FileClassLowering(context).lower(irFile)
|
||||||
KCallableNamePropertyLowering(context).lower(irFile)
|
KCallableNamePropertyLowering(context).lower(irFile)
|
||||||
LateinitLowering(context).lower(irFile)
|
|
||||||
|
LateinitLowering(context, true).lower(irFile)
|
||||||
|
|
||||||
ConstAndJvmFieldPropertiesLowering().lower(irFile)
|
ConstAndJvmFieldPropertiesLowering().lower(irFile)
|
||||||
PropertiesLowering().lower(irFile)
|
PropertiesLowering().lower(irFile)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user