Update logic to $default function lowering (don't skip interface members)
This commit is contained in:
+6
-4
@@ -71,14 +71,16 @@ open class FunctionCodegen(private val irFunction: IrFunction, private val class
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun calculateMethodFlags(isStatic: Boolean): Int {
|
private fun calculateMethodFlags(isStatic: Boolean): Int {
|
||||||
|
if (irFunction.origin == DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER) {
|
||||||
|
return Opcodes.ACC_PUBLIC or Opcodes.ACC_SYNTHETIC.let {
|
||||||
|
if (irFunction is IrConstructor) it else it or Opcodes.ACC_BRIDGE or Opcodes.ACC_STATIC
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var flags = AsmUtil.getMethodAsmFlags(descriptor, OwnerKind.IMPLEMENTATION, state).or(if (isStatic) Opcodes.ACC_STATIC else 0).xor(
|
var flags = AsmUtil.getMethodAsmFlags(descriptor, OwnerKind.IMPLEMENTATION, state).or(if (isStatic) Opcodes.ACC_STATIC else 0).xor(
|
||||||
if (classCodegen.irClass.isAnnotationClass) Opcodes.ACC_FINAL else 0/*TODO*/
|
if (classCodegen.irClass.isAnnotationClass) Opcodes.ACC_FINAL else 0/*TODO*/
|
||||||
).or(if (descriptor is JvmDescriptorWithExtraFlags) descriptor.extraFlags else 0)
|
).or(if (descriptor is JvmDescriptorWithExtraFlags) descriptor.extraFlags else 0)
|
||||||
|
|
||||||
if (irFunction.origin == DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER) {
|
|
||||||
flags = flags.xor(AsmUtil.getVisibilityAccessFlag(descriptor)).or(Opcodes.ACC_PUBLIC)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (classCodegen.irClass.isJvmInterface && InitializersLowering.clinitName == irFunction.name) {
|
if (classCodegen.irClass.isJvmInterface && InitializersLowering.clinitName == irFunction.name) {
|
||||||
//reset abstract flag for <clinit>
|
//reset abstract flag for <clinit>
|
||||||
flags = flags.xor(Opcodes.ACC_ABSTRACT)
|
flags = flags.xor(Opcodes.ACC_ABSTRACT)
|
||||||
|
|||||||
+15
-4
@@ -31,9 +31,11 @@ import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
|
|||||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
|
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.util.createParameterDeclarations
|
import org.jetbrains.kotlin.ir.util.createParameterDeclarations
|
||||||
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
|
||||||
@@ -60,10 +62,12 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid()
|
|||||||
|
|
||||||
irClass.declarations.filterIsInstance<IrFunction>().forEach {
|
irClass.declarations.filterIsInstance<IrFunction>().forEach {
|
||||||
val descriptor = it.descriptor
|
val descriptor = it.descriptor
|
||||||
if (descriptor.modality != Modality.ABSTRACT) {
|
if (it.origin == DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER) {
|
||||||
|
members.add(it) //just copy $default to DefaultImpls
|
||||||
|
} else if (descriptor.modality != Modality.ABSTRACT) {
|
||||||
val functionDescriptorImpl =
|
val functionDescriptorImpl =
|
||||||
createDefaultImplFunDescriptor(defaultImplsDescriptor, descriptor, interfaceDescriptor, state.typeMapper)
|
createDefaultImplFunDescriptor(defaultImplsDescriptor, descriptor, interfaceDescriptor, state.typeMapper)
|
||||||
members.add(functionDescriptorImpl.createFunctionAndMapVariables(it))
|
members.add(functionDescriptorImpl.createFunctionAndMapVariables(it, it.visibility))
|
||||||
it.body = null
|
it.body = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -142,8 +146,15 @@ internal fun createStaticFunctionWithReceivers(
|
|||||||
return newFunction
|
return newFunction
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun FunctionDescriptor.createFunctionAndMapVariables(oldFunction: IrFunction) =
|
internal fun FunctionDescriptor.createFunctionAndMapVariables(
|
||||||
IrFunctionImpl(oldFunction.startOffset, oldFunction.endOffset, oldFunction.origin, this, oldFunction.body).apply {
|
oldFunction: IrFunction,
|
||||||
|
visibility: Visibility
|
||||||
|
) =
|
||||||
|
IrFunctionImpl(
|
||||||
|
oldFunction.startOffset, oldFunction.endOffset, oldFunction.origin, IrSimpleFunctionSymbolImpl(this),
|
||||||
|
visibility = visibility
|
||||||
|
).apply {
|
||||||
|
body = oldFunction.body
|
||||||
createParameterDeclarations()
|
createParameterDeclarations()
|
||||||
val mapping: Map<ValueDescriptor, IrValueParameter> =
|
val mapping: Map<ValueDescriptor, IrValueParameter> =
|
||||||
(
|
(
|
||||||
|
|||||||
+2
-5
@@ -18,9 +18,9 @@ package org.jetbrains.kotlin.backend.jvm.lower
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.ClassLoweringPass
|
import org.jetbrains.kotlin.backend.common.ClassLoweringPass
|
||||||
import org.jetbrains.kotlin.backend.common.lower.DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER
|
import org.jetbrains.kotlin.backend.common.lower.DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER
|
||||||
import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface
|
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
@@ -29,9 +29,6 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
|||||||
class StaticDefaultFunctionLowering(val state: GenerationState) : IrElementTransformerVoid(), ClassLoweringPass {
|
class StaticDefaultFunctionLowering(val state: GenerationState) : IrElementTransformerVoid(), ClassLoweringPass {
|
||||||
|
|
||||||
override fun lower(irClass: IrClass) {
|
override fun lower(irClass: IrClass) {
|
||||||
if (irClass.isJvmInterface) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
irClass.accept(this, null)
|
irClass.accept(this, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,7 +40,7 @@ class StaticDefaultFunctionLowering(val state: GenerationState) : IrElementTrans
|
|||||||
declaration.descriptor,
|
declaration.descriptor,
|
||||||
declaration.descriptor.dispatchReceiverParameter!!.type
|
declaration.descriptor.dispatchReceiverParameter!!.type
|
||||||
)
|
)
|
||||||
newFunction.createFunctionAndMapVariables(declaration)
|
newFunction.createFunctionAndMapVariables(declaration, Visibilities.PUBLIC)
|
||||||
} else {
|
} else {
|
||||||
super.visitFunction(declaration)
|
super.visitFunction(declaration)
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-25
@@ -34,35 +34,18 @@ class IrFunctionImpl(
|
|||||||
endOffset: Int,
|
endOffset: Int,
|
||||||
origin: IrDeclarationOrigin,
|
origin: IrDeclarationOrigin,
|
||||||
override val symbol: IrSimpleFunctionSymbol,
|
override val symbol: IrSimpleFunctionSymbol,
|
||||||
name: Name,
|
name: Name = symbol.descriptor.name,
|
||||||
visibility: Visibility,
|
visibility: Visibility = symbol.descriptor.visibility,
|
||||||
override val modality: Modality,
|
override val modality: Modality = symbol.descriptor.modality,
|
||||||
returnType: KotlinType,
|
returnType: KotlinType = symbol.descriptor.returnType!!,
|
||||||
isInline: Boolean,
|
isInline: Boolean = symbol.descriptor.isInline,
|
||||||
isExternal: Boolean,
|
isExternal: Boolean = symbol.descriptor.isExternal,
|
||||||
override val isTailrec: Boolean,
|
override val isTailrec: Boolean = symbol.descriptor.isTailrec,
|
||||||
override val isSuspend: Boolean
|
override val isSuspend: Boolean = symbol.descriptor.isSuspend
|
||||||
) :
|
) :
|
||||||
IrFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, returnType),
|
IrFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, returnType),
|
||||||
IrSimpleFunction {
|
IrSimpleFunction {
|
||||||
|
|
||||||
constructor(
|
|
||||||
startOffset: Int,
|
|
||||||
endOffset: Int,
|
|
||||||
origin: IrDeclarationOrigin,
|
|
||||||
symbol: IrSimpleFunctionSymbol
|
|
||||||
) : this(
|
|
||||||
startOffset, endOffset, origin, symbol,
|
|
||||||
symbol.descriptor.name,
|
|
||||||
symbol.descriptor.visibility,
|
|
||||||
symbol.descriptor.modality,
|
|
||||||
symbol.descriptor.returnType!!,
|
|
||||||
symbol.descriptor.isInline,
|
|
||||||
symbol.descriptor.isExternal,
|
|
||||||
symbol.descriptor.isTailrec,
|
|
||||||
symbol.descriptor.isSuspend
|
|
||||||
)
|
|
||||||
|
|
||||||
override val descriptor: FunctionDescriptor = symbol.descriptor
|
override val descriptor: FunctionDescriptor = symbol.descriptor
|
||||||
|
|
||||||
override val overriddenSymbols: MutableList<IrSimpleFunctionSymbol> = SmartList()
|
override val overriddenSymbols: MutableList<IrSimpleFunctionSymbol> = SmartList()
|
||||||
|
|||||||
Reference in New Issue
Block a user