Do not generate interface delegation for default parameter stubs

This commit is contained in:
Georgy Bronnikov
2018-12-12 20:26:30 +03:00
parent c924a6efe8
commit 3b16fa6af9
6 changed files with 10 additions and 15 deletions
@@ -69,7 +69,7 @@ open class DefaultArgumentStubGenerator constructor(val context: CommonBackendCo
} }
val newIrFunction = val newIrFunction =
irFunction.generateDefaultsFunction(context, DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER, skipInlineMethods) irFunction.generateDefaultsFunction(context, IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER, skipInlineMethods)
log { "$irFunction -> $newIrFunction" } log { "$irFunction -> $newIrFunction" }
val builder = context.createIrBuilder(newIrFunction.symbol) val builder = context.createIrBuilder(newIrFunction.symbol)
@@ -273,7 +273,7 @@ open class DefaultParameterInjector constructor(
val keyFunction = declaration.findSuperMethodWithDefaultArguments()!! val keyFunction = declaration.findSuperMethodWithDefaultArguments()!!
val realFunction = val realFunction =
keyFunction.generateDefaultsFunction(context, DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER, skipInline) keyFunction.generateDefaultsFunction(context, IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER, skipInline)
log { "$declaration -> $realFunction" } log { "$declaration -> $realFunction" }
val maskValues = Array((declaration.valueParameters.size + 31) / 32) { 0 } val maskValues = Array((declaration.valueParameters.size + 31) / 32) { 0 }
@@ -403,7 +403,7 @@ private fun IrFunction.generateDefaultsFunctionImpl(
val baseFun = baseFunSymbol.owner val baseFun = baseFunSymbol.owner
if (baseFun.needsDefaultArgumentsLowering(skipInlineMethods)) { if (baseFun.needsDefaultArgumentsLowering(skipInlineMethods)) {
val baseOrigin = if (baseFun.valueParameters.any { it.defaultValue != null }) { val baseOrigin = if (baseFun.valueParameters.any { it.defaultValue != null }) {
DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER
} else { } else {
IrDeclarationOrigin.FAKE_OVERRIDE IrDeclarationOrigin.FAKE_OVERRIDE
} }
@@ -447,7 +447,7 @@ private fun buildFunctionDeclaration(irFunction: IrFunction, origin: IrDeclarati
IrSimpleFunctionSymbolImpl(descriptor), IrSimpleFunctionSymbolImpl(descriptor),
name, name,
irFunction.visibility, irFunction.visibility,
if (irFunction.modality === Modality.ABSTRACT) Modality.OPEN else irFunction.modality, Modality.FINAL,
irFunction.returnType, irFunction.returnType,
irFunction.isInline, irFunction.isInline,
false, false,
@@ -471,9 +471,6 @@ private fun IrFunction.generateDefaultsFunction(
generateDefaultsFunctionImpl(context, origin, skipInlineMethods) generateDefaultsFunctionImpl(context, origin, skipInlineMethods)
} }
object DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER :
IrDeclarationOriginImpl("DEFAULT_PARAMETER_EXTENT")
private fun IrFunction.valueParameter(index: Int, name: Name, type: IrType): IrValueParameter { private fun IrFunction.valueParameter(index: Int, name: Name, type: IrType): IrValueParameter {
val parameterDescriptor = WrappedValueParameterDescriptor() val parameterDescriptor = WrappedValueParameterDescriptor()
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.backend.jvm.codegen package org.jetbrains.kotlin.backend.jvm.codegen
import org.jetbrains.kotlin.backend.common.lower.DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
import org.jetbrains.kotlin.backend.jvm.descriptors.JvmDescriptorWithExtraFlags import org.jetbrains.kotlin.backend.jvm.descriptors.JvmDescriptorWithExtraFlags
import org.jetbrains.kotlin.builtins.KotlinBuiltIns.FQ_NAMES import org.jetbrains.kotlin.builtins.KotlinBuiltIns.FQ_NAMES
@@ -62,7 +61,7 @@ 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) { if (irFunction.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER) {
return Opcodes.ACC_PUBLIC or Opcodes.ACC_SYNTHETIC.let { return Opcodes.ACC_PUBLIC or Opcodes.ACC_SYNTHETIC.let {
if (irFunction is IrConstructor) it else it or Opcodes.ACC_BRIDGE or Opcodes.ACC_STATIC if (irFunction is IrConstructor) it else it or Opcodes.ACC_BRIDGE or Opcodes.ACC_STATIC
} }
@@ -135,5 +135,6 @@ class InterfaceDelegationLowering(val context: JvmBackendContext) : IrElementTra
private fun IrSimpleFunction.isDefinitelyNotDefaultImplsMethod() = private fun IrSimpleFunction.isDefinitelyNotDefaultImplsMethod() =
resolveFakeOverride()?.let { origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB } == true || resolveFakeOverride()?.let { origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB } == true ||
origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER ||
hasAnnotation(PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME) hasAnnotation(PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME)
} }
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.backend.common.ClassLoweringPass
import org.jetbrains.kotlin.backend.common.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.backend.common.descriptors.WrappedSimpleFunctionDescriptor
import org.jetbrains.kotlin.backend.common.ir.copyTo import org.jetbrains.kotlin.backend.common.ir.copyTo
import org.jetbrains.kotlin.backend.common.ir.copyTypeParametersFrom import org.jetbrains.kotlin.backend.common.ir.copyTypeParametersFrom
import org.jetbrains.kotlin.backend.common.lower.DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER
import org.jetbrains.kotlin.backend.common.lower.InitializersLowering.Companion.clinitName import org.jetbrains.kotlin.backend.common.lower.InitializersLowering.Companion.clinitName
import org.jetbrains.kotlin.backend.common.lower.VariableRemapper import org.jetbrains.kotlin.backend.common.lower.VariableRemapper
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
@@ -53,7 +52,7 @@ class InterfaceLowering(val context: JvmBackendContext) : IrElementTransformerVo
} }
val defaultBodies = irClass.declarations.filterIsInstance<IrFunction>().filter { val defaultBodies = irClass.declarations.filterIsInstance<IrFunction>().filter {
it.origin == DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER it.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER
} }
irClass.declarations.removeAll(privateToRemove) irClass.declarations.removeAll(privateToRemove)
irClass.declarations.removeAll(defaultBodies) irClass.declarations.removeAll(defaultBodies)
@@ -18,23 +18,21 @@ package org.jetbrains.kotlin.backend.jvm.lower
import org.jetbrains.kotlin.backend.common.BackendContext import org.jetbrains.kotlin.backend.common.BackendContext
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.makePhase
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.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
class StaticDefaultFunctionLowering() : IrElementTransformerVoid(), ClassLoweringPass { class StaticDefaultFunctionLowering() : IrElementTransformerVoid(), ClassLoweringPass {
constructor(@Suppress("UNUSED_PARAMETER") context: BackendContext) : this() constructor(@Suppress("UNUSED_PARAMETER") context: BackendContext) : this()
override fun lower(irClass: IrClass) { override fun lower(irClass: IrClass) {
irClass.accept(this, null) irClass.accept(this, null)
} }
override fun visitFunction(declaration: IrFunction): IrStatement { override fun visitFunction(declaration: IrFunction): IrStatement {
return if (declaration.origin == DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER && declaration.dispatchReceiverParameter != null) { return if (declaration.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER && declaration.dispatchReceiverParameter != null) {
createStaticFunctionWithReceivers(declaration.parent, declaration.name, declaration) createStaticFunctionWithReceivers(declaration.parent, declaration.name, declaration)
} else { } else {
super.visitFunction(declaration) super.visitFunction(declaration)
@@ -28,6 +28,7 @@ interface IrDeclarationOrigin {
object DELEGATED_PROPERTY_ACCESSOR : IrDeclarationOriginImpl("DELEGATED_PROPERTY_ACCESSOR") object DELEGATED_PROPERTY_ACCESSOR : IrDeclarationOriginImpl("DELEGATED_PROPERTY_ACCESSOR")
object DELEGATED_MEMBER : IrDeclarationOriginImpl("DELEGATED_MEMBER") object DELEGATED_MEMBER : IrDeclarationOriginImpl("DELEGATED_MEMBER")
object ENUM_CLASS_SPECIAL_MEMBER : IrDeclarationOriginImpl("ENUM_CLASS_SPECIAL_MEMBER") object ENUM_CLASS_SPECIAL_MEMBER : IrDeclarationOriginImpl("ENUM_CLASS_SPECIAL_MEMBER")
object FUNCTION_FOR_DEFAULT_PARAMETER : IrDeclarationOriginImpl("FUNCTION_FOR_DEFAULT_PARAMETER")
object GENERATED_DATA_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_DATA_CLASS_MEMBER") object GENERATED_DATA_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_DATA_CLASS_MEMBER")
object GENERATED_INLINE_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_INLINE_CLASS_MEMBER") object GENERATED_INLINE_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_INLINE_CLASS_MEMBER")
object LOCAL_FUNCTION_FOR_LAMBDA : IrDeclarationOriginImpl("LOCAL_FUNCTION_FOR_LAMBDA") object LOCAL_FUNCTION_FOR_LAMBDA : IrDeclarationOriginImpl("LOCAL_FUNCTION_FOR_LAMBDA")