IR: use buildClass where possible

This commit is contained in:
Alexander Udalov
2020-07-08 16:49:41 +02:00
parent 5b1193407a
commit 2d723f1c51
4 changed files with 29 additions and 58 deletions
@@ -7,24 +7,21 @@ package org.jetbrains.kotlin.backend.common.lower
import org.jetbrains.kotlin.backend.common.* import org.jetbrains.kotlin.backend.common.*
import org.jetbrains.kotlin.backend.common.ir.* import org.jetbrains.kotlin.backend.common.ir.*
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildClass
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedFieldDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedFieldDescriptor
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.types.classifierOrFail
@@ -271,31 +268,25 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
) )
private inner class CoroutineBuilder(val irFunction: IrFunction, val functionReference: IrFunctionReference?) { private inner class CoroutineBuilder(val irFunction: IrFunction, val functionReference: IrFunctionReference?) {
private val startOffset = irFunction.startOffset
private val endOffset = irFunction.endOffset
private val functionParameters = irFunction.explicitParameters private val functionParameters = irFunction.explicitParameters
private val boundFunctionParameters = functionReference?.getArgumentsWithIr()?.map { it.first } private val boundFunctionParameters = functionReference?.getArgumentsWithIr()?.map { it.first }
private val unboundFunctionParameters = boundFunctionParameters?.let { functionParameters - it } private val unboundFunctionParameters = boundFunctionParameters?.let { functionParameters - it }
private val coroutineClass: IrClass = WrappedClassDescriptor().let { d -> private val coroutineClass: IrClass =
IrClassImpl( buildClass {
startOffset, endOffset, startOffset = irFunction.startOffset
DECLARATION_ORIGIN_COROUTINE_IMPL, endOffset = irFunction.endOffset
IrClassSymbolImpl(d), origin = DECLARATION_ORIGIN_COROUTINE_IMPL
nameForCoroutineClass(irFunction), name = nameForCoroutineClass(irFunction)
ClassKind.CLASS, visibility = irFunction.visibility
irFunction.visibility, }.apply {
Modality.FINAL
).apply {
d.bind(this)
parent = irFunction.parent parent = irFunction.parent
createParameterDeclarations() createParameterDeclarations()
typeParameters = irFunction.typeParameters.map { typeParam -> typeParameters = irFunction.typeParameters.map { typeParam ->
typeParam.copyToWithoutSuperTypes(this).apply { superTypes += typeParam.superTypes } typeParam.copyToWithoutSuperTypes(this).apply { superTypes += typeParam.superTypes }
} }
} }
}
private val coroutineClassThis = coroutineClass.thisReceiver!! private val coroutineClassThis = coroutineClass.thisReceiver!!
private val continuationType = continuationClassSymbol.typeWith(irFunction.returnType) private val continuationType = continuationClassSymbol.typeWith(irFunction.returnType)
@@ -19,14 +19,14 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
fun IrClassBuilder.buildClass(): IrClass { @PublishedApi
internal fun IrClassBuilder.buildClass(): IrClass {
val wrappedDescriptor = WrappedClassDescriptor() val wrappedDescriptor = WrappedClassDescriptor()
return IrClassImpl( return IrClassImpl(
startOffset, endOffset, origin, startOffset, endOffset, origin,
IrClassSymbolImpl(wrappedDescriptor), IrClassSymbolImpl(wrappedDescriptor),
name, kind, visibility, modality, name, kind, visibility, modality,
isCompanion = isCompanion, isInner = isInner, isData = isData, isExternal = isExternal, isCompanion, isInner, isData, isExternal, isInline, isExpect, isFun
isInline = isInline, isExpect = isExpect, isFun = isFun
).also { ).also {
wrappedDescriptor.bind(it) wrappedDescriptor.bind(it)
} }
@@ -38,7 +38,6 @@ inline fun buildClass(builder: IrClassBuilder.() -> Unit) =
buildClass() buildClass()
} }
fun IrFieldBuilder.buildField(): IrField { fun IrFieldBuilder.buildField(): IrField {
val wrappedDescriptor = WrappedFieldDescriptor() val wrappedDescriptor = WrappedFieldDescriptor()
return IrFieldImpl( return IrFieldImpl(
@@ -8,24 +8,21 @@ package org.jetbrains.kotlin.ir.backend.js.lower.coroutines
import org.jetbrains.kotlin.backend.common.* import org.jetbrains.kotlin.backend.common.*
import org.jetbrains.kotlin.backend.common.ir.* import org.jetbrains.kotlin.backend.common.ir.*
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.backend.js.lower.CallableReferenceLowering import org.jetbrains.kotlin.ir.backend.js.lower.CallableReferenceLowering
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildClass
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedFieldDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedFieldDescriptor
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.types.classifierOrFail
@@ -224,17 +221,14 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
else buildNewCoroutineClass(function) else buildNewCoroutineClass(function)
} }
private fun buildNewCoroutineClass(function: IrSimpleFunction): IrClass = WrappedClassDescriptor().let { d -> private fun buildNewCoroutineClass(function: IrSimpleFunction): IrClass =
IrClassImpl( buildClass {
startOffset, endOffset, startOffset = function.startOffset
DECLARATION_ORIGIN_COROUTINE_IMPL, endOffset = function.endOffset
IrClassSymbolImpl(d), origin = DECLARATION_ORIGIN_COROUTINE_IMPL
nameForCoroutineClass(function), name = nameForCoroutineClass(function)
ClassKind.CLASS, visibility = function.visibility
function.visibility, }.apply {
Modality.FINAL
).apply {
d.bind(this)
parent = function.parent parent = function.parent
createParameterDeclarations() createParameterDeclarations()
typeParameters = function.typeParameters.map { typeParam -> typeParameters = function.typeParameters.map { typeParam ->
@@ -242,7 +236,6 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
typeParam.copyToWithoutSuperTypes(this).apply { superTypes += typeParam.superTypes } typeParam.copyToWithoutSuperTypes(this).apply { superTypes += typeParam.superTypes }
} }
} }
}
private fun buildConstructor(): IrConstructor { private fun buildConstructor(): IrConstructor {
if (isSuspendLambda) { if (isSuspendLambda) {
@@ -17,20 +17,13 @@ import org.jetbrains.kotlin.builtins.CompanionObjectMapping.isMappedIntrinsicCom
import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor import org.jetbrains.kotlin.ir.builders.declarations.*
import org.jetbrains.kotlin.ir.builders.declarations.buildField
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter
import org.jetbrains.kotlin.ir.builders.irCall import org.jetbrains.kotlin.ir.builders.irCall
import org.jetbrains.kotlin.ir.builders.setSourceRange import org.jetbrains.kotlin.ir.builders.setSourceRange
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.load.java.JavaVisibilities import org.jetbrains.kotlin.load.java.JavaVisibilities
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
@@ -245,17 +238,12 @@ class JvmDeclarationFactory(
fun getDefaultImplsClass(interfaceClass: IrClass): IrClass = fun getDefaultImplsClass(interfaceClass: IrClass): IrClass =
defaultImplsClasses.getOrPut(interfaceClass) { defaultImplsClasses.getOrPut(interfaceClass) {
val descriptor = WrappedClassDescriptor() buildClass {
IrClassImpl( startOffset = interfaceClass.startOffset
interfaceClass.startOffset, interfaceClass.endOffset, endOffset = interfaceClass.endOffset
JvmLoweredDeclarationOrigin.DEFAULT_IMPLS, origin = JvmLoweredDeclarationOrigin.DEFAULT_IMPLS
IrClassSymbolImpl(descriptor), name = Name.identifier(JvmAbi.DEFAULT_IMPLS_CLASS_NAME)
Name.identifier(JvmAbi.DEFAULT_IMPLS_CLASS_NAME), }.apply {
ClassKind.CLASS,
Visibilities.PUBLIC,
Modality.FINAL
).apply {
descriptor.bind(this)
parent = interfaceClass parent = interfaceClass
createImplicitParameterDeclarationWithWrappedDescriptor() createImplicitParameterDeclarationWithWrappedDescriptor()
} }