diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index 9fce168719d..037647685fe 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -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 flags = flags.xor(Opcodes.ACC_ABSTRACT) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt index a76150efaf2..d1885e3e514 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt @@ -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().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 = ( diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt index 33e6b090c17..53c077269e2 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt @@ -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) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt index fc2eadc515d..53d7f498084 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt @@ -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 = SmartList()