JVM_IR: minor code cleanup in JvmStaticAnnotationLowering
This commit is contained in:
@@ -20,7 +20,6 @@ interface JvmLoweredDeclarationOrigin : IrDeclarationOrigin {
|
|||||||
object SYNTHETIC_ACCESSOR : IrDeclarationOriginImpl("SYNTHETIC_ACCESSOR", isSynthetic = true)
|
object SYNTHETIC_ACCESSOR : IrDeclarationOriginImpl("SYNTHETIC_ACCESSOR", isSynthetic = true)
|
||||||
object TO_ARRAY : IrDeclarationOriginImpl("TO_ARRAY")
|
object TO_ARRAY : IrDeclarationOriginImpl("TO_ARRAY")
|
||||||
object JVM_STATIC_WRAPPER : IrDeclarationOriginImpl("JVM_STATIC_WRAPPER")
|
object JVM_STATIC_WRAPPER : IrDeclarationOriginImpl("JVM_STATIC_WRAPPER")
|
||||||
object JVM_STATIC_WRAPPER_SYNTHETIC : IrDeclarationOriginImpl("JVM_STATIC_WRAPPER_SYNTHETIC", isSynthetic = true)
|
|
||||||
object JVM_OVERLOADS_WRAPPER : IrDeclarationOriginImpl("JVM_OVERLOADS_WRAPPER")
|
object JVM_OVERLOADS_WRAPPER : IrDeclarationOriginImpl("JVM_OVERLOADS_WRAPPER")
|
||||||
object SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS :
|
object SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS :
|
||||||
IrDeclarationOriginImpl("SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS", isSynthetic = true)
|
IrDeclarationOriginImpl("SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS", isSynthetic = true)
|
||||||
|
|||||||
+22
-57
@@ -17,26 +17,21 @@ import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
|||||||
import org.jetbrains.kotlin.backend.jvm.ir.isInCurrentModule
|
import org.jetbrains.kotlin.backend.jvm.ir.isInCurrentModule
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.replaceThisByStaticReference
|
import org.jetbrains.kotlin.backend.jvm.ir.replaceThisByStaticReference
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.buildFunWithDescriptorForInlining
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
|
||||||
import org.jetbrains.kotlin.ir.descriptors.WrappedFunctionDescriptorWithContainerSource
|
|
||||||
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrBody
|
import org.jetbrains.kotlin.ir.expressions.IrBody
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
|
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
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.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
|
||||||
import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME
|
import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
||||||
|
|
||||||
internal val jvmStaticAnnotationPhase = makeIrFilePhase(
|
internal val jvmStaticAnnotationPhase = makeIrFilePhase(
|
||||||
::JvmStaticAnnotationLowering,
|
::JvmStaticAnnotationLowering,
|
||||||
@@ -65,45 +60,24 @@ private class CompanionObjectJvmStaticLowering(val context: JvmBackendContext) :
|
|||||||
|
|
||||||
companion?.declarations?.filter(::isJvmStaticFunction)?.forEach { declaration ->
|
companion?.declarations?.filter(::isJvmStaticFunction)?.forEach { declaration ->
|
||||||
val jvmStaticFunction = declaration as IrSimpleFunction
|
val jvmStaticFunction = declaration as IrSimpleFunction
|
||||||
val newName = Name.identifier(context.methodSignatureMapper.mapFunctionName(jvmStaticFunction))
|
val proxy = createProxy(jvmStaticFunction, irClass, companion)
|
||||||
val proxy = createProxy(
|
|
||||||
jvmStaticFunction, irClass, companion, newName, jvmStaticFunction.visibility,
|
|
||||||
isSynthetic = false
|
|
||||||
)
|
|
||||||
irClass.addMember(proxy)
|
irClass.addMember(proxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createProxy(
|
private fun createProxy(target: IrSimpleFunction, irClass: IrClass, companion: IrClass): IrSimpleFunction {
|
||||||
target: IrSimpleFunction,
|
return buildFun {
|
||||||
irClass: IrClass,
|
updateFrom(target)
|
||||||
companion: IrClass,
|
returnType = target.returnType
|
||||||
name: Name,
|
origin = JvmLoweredDeclarationOrigin.JVM_STATIC_WRAPPER
|
||||||
visibility: Visibility,
|
name = target.name
|
||||||
isSynthetic: Boolean
|
modality = if (irClass.isInterface) Modality.OPEN else target.modality
|
||||||
): IrSimpleFunction {
|
isInline = false
|
||||||
val origin =
|
isExternal = false
|
||||||
if (isSynthetic) JvmLoweredDeclarationOrigin.JVM_STATIC_WRAPPER_SYNTHETIC else JvmLoweredDeclarationOrigin.JVM_STATIC_WRAPPER
|
isTailrec = false
|
||||||
val descriptor = WrappedSimpleFunctionDescriptor(target.descriptor.annotations)
|
isExpect = false
|
||||||
return IrFunctionImpl(
|
}.apply {
|
||||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
|
|
||||||
origin,
|
|
||||||
IrSimpleFunctionSymbolImpl(descriptor),
|
|
||||||
name,
|
|
||||||
visibility,
|
|
||||||
// FINAL on static interface members makes JVM unhappy, so remove it.
|
|
||||||
if (irClass.isInterface) Modality.OPEN else target.modality,
|
|
||||||
returnType = target.returnType,
|
|
||||||
isInline = false,
|
|
||||||
isExternal = false,
|
|
||||||
isTailrec = false,
|
|
||||||
isSuspend = target.isSuspend,
|
|
||||||
isExpect = false,
|
|
||||||
isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
|
|
||||||
isOperator = false
|
|
||||||
).apply {
|
|
||||||
descriptor.bind(this)
|
|
||||||
parent = irClass
|
parent = irClass
|
||||||
copyTypeParametersFrom(target)
|
copyTypeParametersFrom(target)
|
||||||
target.extensionReceiverParameter?.let { extensionReceiverParameter = it.copyTo(this) }
|
target.extensionReceiverParameter?.let { extensionReceiverParameter = it.copyTo(this) }
|
||||||
@@ -212,27 +186,18 @@ private class MakeCallsStatic(
|
|||||||
return super.visitCall(expression)
|
return super.visitCall(expression)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrSimpleFunction.copyRemovingDispatchReceiver(): IrSimpleFunction {
|
private fun IrSimpleFunction.copyRemovingDispatchReceiver(): IrSimpleFunction =
|
||||||
val newDescriptor = (descriptor as? DescriptorWithContainerSource)?.let {
|
buildFunWithDescriptorForInlining(descriptor) {
|
||||||
WrappedFunctionDescriptorWithContainerSource(it.containerSource)
|
updateFrom(this@copyRemovingDispatchReceiver)
|
||||||
} ?: WrappedSimpleFunctionDescriptor(descriptor)
|
name = this@copyRemovingDispatchReceiver.name
|
||||||
return IrFunctionImpl(
|
returnType = this@copyRemovingDispatchReceiver.returnType
|
||||||
startOffset, endOffset, origin,
|
}.also {
|
||||||
IrSimpleFunctionSymbolImpl(newDescriptor),
|
|
||||||
name,
|
|
||||||
visibility, modality, returnType,
|
|
||||||
isInline = isInline, isExternal = isExternal, isTailrec = isTailrec, isSuspend = isSuspend, isExpect = isExpect,
|
|
||||||
isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
|
|
||||||
isOperator = isOperator
|
|
||||||
).also {
|
|
||||||
newDescriptor.bind(it)
|
|
||||||
it.parent = parent
|
it.parent = parent
|
||||||
it.correspondingPropertySymbol = correspondingPropertySymbol
|
it.correspondingPropertySymbol = correspondingPropertySymbol
|
||||||
it.annotations += annotations
|
it.annotations += annotations
|
||||||
it.copyParameterDeclarationsFrom(this)
|
it.copyParameterDeclarationsFrom(this)
|
||||||
it.dispatchReceiverParameter = null
|
it.dispatchReceiverParameter = null
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isJvmStaticFunction(declaration: IrDeclaration): Boolean =
|
private fun isJvmStaticFunction(declaration: IrDeclaration): Boolean =
|
||||||
|
|||||||
Reference in New Issue
Block a user