IR: use buildConstructor where possible

This commit is contained in:
Alexander Udalov
2020-07-08 16:22:15 +02:00
parent 6aa09f61d4
commit 5b1193407a
9 changed files with 104 additions and 197 deletions
@@ -14,13 +14,12 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.Scope
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.builders.declarations.buildReceiverParameter
import org.jetbrains.kotlin.ir.builders.declarations.buildTypeParameter
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
import org.jetbrains.kotlin.ir.descriptors.*
@@ -28,7 +27,6 @@ import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
import org.jetbrains.kotlin.ir.types.*
@@ -40,7 +38,6 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
import java.io.StringWriter
fun ir2string(ir: IrElement?): String = ir?.render() ?: ""
// NB: this function is used in native
@@ -55,20 +52,16 @@ fun IrClass.addSimpleDelegatingConstructor(
irBuiltIns: IrBuiltIns,
isPrimary: Boolean = false,
origin: IrDeclarationOrigin? = null
) = WrappedClassConstructorDescriptor().let { descriptor ->
IrConstructorImpl(
startOffset, endOffset,
origin ?: this.origin,
IrConstructorSymbolImpl(descriptor),
superConstructor.name,
superConstructor.visibility,
defaultType,
isInline = false,
isExternal = false,
isPrimary = isPrimary,
isExpect = false
).also { constructor ->
descriptor.bind(constructor)
): IrConstructor =
buildConstructor {
val klass = this@addSimpleDelegatingConstructor
this.startOffset = klass.startOffset
this.endOffset = klass.endOffset
this.origin = origin ?: klass.origin
this.visibility = superConstructor.visibility
this.returnType = klass.defaultType
this.isPrimary = isPrimary
}.also { constructor ->
constructor.parent = this
declarations += constructor
@@ -92,7 +85,6 @@ fun IrClass.addSimpleDelegatingConstructor(
)
)
}
}
val IrCall.isSuspend get() = (symbol.owner as? IrSimpleFunction)?.isSuspend == true
val IrFunctionReference.isSuspend get() = (symbol.owner as? IrSimpleFunction)?.isSuspend == true
@@ -13,12 +13,11 @@ import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedClassConstructorDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedFieldDescriptor
import org.jetbrains.kotlin.ir.expressions.*
@@ -26,7 +25,6 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classifierOrFail
@@ -378,20 +376,15 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
)
}
fun buildConstructor(): IrConstructor = WrappedClassConstructorDescriptor().let { d ->
IrConstructorImpl(
startOffset, endOffset,
DECLARATION_ORIGIN_COROUTINE_IMPL,
IrConstructorSymbolImpl(d),
coroutineBaseClassConstructor.name,
irFunction.visibility,
coroutineClass.defaultType,
isInline = false,
isExternal = false,
isPrimary = true,
isExpect = false
).apply {
d.bind(this)
fun buildConstructor(): IrConstructor =
buildConstructor {
startOffset = irFunction.startOffset
endOffset = irFunction.endOffset
origin = DECLARATION_ORIGIN_COROUTINE_IMPL
visibility = irFunction.visibility
returnType = coroutineClass.defaultType
isPrimary = true
}.apply {
parent = coroutineClass
coroutineClass.declarations += this
coroutineConstructors += this
@@ -422,22 +415,15 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
}
}
}
}
private fun buildFactoryConstructor(boundParams: List<IrValueParameter>) = WrappedClassConstructorDescriptor().let { d ->
IrConstructorImpl(
startOffset, endOffset,
DECLARATION_ORIGIN_COROUTINE_IMPL,
IrConstructorSymbolImpl(d),
coroutineBaseClassConstructor.name,
irFunction.visibility,
coroutineClass.defaultType,
isInline = false,
isExternal = false,
isPrimary = false,
isExpect = false
).apply {
d.bind(this)
private fun buildFactoryConstructor(boundParams: List<IrValueParameter>): IrConstructor =
buildConstructor {
startOffset = irFunction.startOffset
endOffset = irFunction.endOffset
origin = DECLARATION_ORIGIN_COROUTINE_IMPL
visibility = irFunction.visibility
returnType = coroutineClass.defaultType
}.apply {
parent = coroutineClass
coroutineClass.declarations += this
coroutineConstructors += this
@@ -464,7 +450,6 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
}
}
}
}
private fun buildCreateMethod(
unboundArgs: List<IrValueParameter>,
@@ -17,19 +17,17 @@ import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.Scope
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedClassConstructorDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedFieldDescriptor
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
@@ -43,7 +41,6 @@ import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.name.Name
import java.util.*
interface LocalNameProvider {
fun localName(declaration: IrDeclarationWithName): String =
@@ -693,22 +690,11 @@ class LocalDeclarationsLowering(
val localClassContext = localClasses[oldDeclaration.parent]!!
val capturedValues = localClassContext.closure.capturedValues
val newDescriptor = WrappedClassConstructorDescriptor(oldDeclaration.descriptor.annotations, oldDeclaration.descriptor.source)
val newSymbol = IrConstructorSymbolImpl(newDescriptor)
val loweredConstructorVisibility =
visibilityPolicy.forConstructor(oldDeclaration, constructorContext.inInlineFunctionScope)
val newDeclaration = IrConstructorImpl(
oldDeclaration.startOffset, oldDeclaration.endOffset, oldDeclaration.origin,
newSymbol, oldDeclaration.name, loweredConstructorVisibility, oldDeclaration.returnType,
isInline = oldDeclaration.isInline,
isExternal = oldDeclaration.isExternal,
isPrimary = oldDeclaration.isPrimary,
isExpect = oldDeclaration.isExpect
)
newDescriptor.bind(newDeclaration)
val newDeclaration = buildConstructor(oldDeclaration.descriptor) {
updateFrom(oldDeclaration)
visibility = visibilityPolicy.forConstructor(oldDeclaration, constructorContext.inInlineFunctionScope)
returnType = oldDeclaration.returnType
}
constructorContext.transformedDeclaration = newDeclaration
@@ -143,8 +143,11 @@ internal fun IrFunctionBuilder.buildFunction(originalDescriptor: FunctionDescrip
}
}
fun IrFunctionBuilder.buildConstructor(): IrConstructor {
val wrappedDescriptor = WrappedClassConstructorDescriptor()
@PublishedApi
internal fun IrFunctionBuilder.buildConstructor(originalDescriptor: ConstructorDescriptor?): IrConstructor {
val wrappedDescriptor =
if (originalDescriptor != null) WrappedClassConstructorDescriptor(originalDescriptor.annotations, originalDescriptor.source)
else WrappedClassConstructorDescriptor()
return IrConstructorImpl(
startOffset, endOffset, origin,
IrConstructorSymbolImpl(wrappedDescriptor),
@@ -192,10 +195,10 @@ fun IrDeclarationContainer.addFunction(
}
}
inline fun buildConstructor(builder: IrFunctionBuilder.() -> Unit): IrConstructor =
inline fun buildConstructor(originalDescriptor: ConstructorDescriptor? = null, builder: IrFunctionBuilder.() -> Unit): IrConstructor =
IrFunctionBuilder().run {
builder()
buildConstructor()
buildConstructor(originalDescriptor)
}
inline fun IrClass.addConstructor(builder: IrFunctionBuilder.() -> Unit = {}): IrConstructor =