Update logic to $default function lowering (don't skip interface members)

This commit is contained in:
Mikhael Bogdanov
2018-05-15 10:15:19 +02:00
parent 9d36367fbd
commit e9216625f0
4 changed files with 31 additions and 38 deletions
@@ -71,14 +71,16 @@ open class FunctionCodegen(private val irFunction: IrFunction, private val class
}
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(
if (classCodegen.irClass.isAnnotationClass) Opcodes.ACC_FINAL else 0/*TODO*/
).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) {
//reset abstract flag for <clinit>
flags = flags.xor(Opcodes.ACC_ABSTRACT)
@@ -31,9 +31,11 @@ import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
import org.jetbrains.kotlin.ir.declarations.IrClass
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.impl.IrClassImpl
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.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
@@ -60,10 +62,12 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid()
irClass.declarations.filterIsInstance<IrFunction>().forEach {
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 =
createDefaultImplFunDescriptor(defaultImplsDescriptor, descriptor, interfaceDescriptor, state.typeMapper)
members.add(functionDescriptorImpl.createFunctionAndMapVariables(it))
members.add(functionDescriptorImpl.createFunctionAndMapVariables(it, it.visibility))
it.body = null
}
}
@@ -142,8 +146,15 @@ internal fun createStaticFunctionWithReceivers(
return newFunction
}
internal fun FunctionDescriptor.createFunctionAndMapVariables(oldFunction: IrFunction) =
IrFunctionImpl(oldFunction.startOffset, oldFunction.endOffset, oldFunction.origin, this, oldFunction.body).apply {
internal fun FunctionDescriptor.createFunctionAndMapVariables(
oldFunction: IrFunction,
visibility: Visibility
) =
IrFunctionImpl(
oldFunction.startOffset, oldFunction.endOffset, oldFunction.origin, IrSimpleFunctionSymbolImpl(this),
visibility = visibility
).apply {
body = oldFunction.body
createParameterDeclarations()
val mapping: Map<ValueDescriptor, IrValueParameter> =
(
@@ -18,9 +18,9 @@ package org.jetbrains.kotlin.backend.jvm.lower
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.jvm.codegen.isJvmInterface
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.IrClass
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 {
override fun lower(irClass: IrClass) {
if (irClass.isJvmInterface) {
return
}
irClass.accept(this, null)
}
@@ -43,7 +40,7 @@ class StaticDefaultFunctionLowering(val state: GenerationState) : IrElementTrans
declaration.descriptor,
declaration.descriptor.dispatchReceiverParameter!!.type
)
newFunction.createFunctionAndMapVariables(declaration)
newFunction.createFunctionAndMapVariables(declaration, Visibilities.PUBLIC)
} else {
super.visitFunction(declaration)
}
@@ -34,35 +34,18 @@ class IrFunctionImpl(
endOffset: Int,
origin: IrDeclarationOrigin,
override val symbol: IrSimpleFunctionSymbol,
name: Name,
visibility: Visibility,
override val modality: Modality,
returnType: KotlinType,
isInline: Boolean,
isExternal: Boolean,
override val isTailrec: Boolean,
override val isSuspend: Boolean
name: Name = symbol.descriptor.name,
visibility: Visibility = symbol.descriptor.visibility,
override val modality: Modality = symbol.descriptor.modality,
returnType: KotlinType = symbol.descriptor.returnType!!,
isInline: Boolean = symbol.descriptor.isInline,
isExternal: Boolean = symbol.descriptor.isExternal,
override val isTailrec: Boolean = symbol.descriptor.isTailrec,
override val isSuspend: Boolean = symbol.descriptor.isSuspend
) :
IrFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, returnType),
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 overriddenSymbols: MutableList<IrSimpleFunctionSymbol> = SmartList()