diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt index 8f1d3c0aea1..aa30dfc7864 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.codegen import org.jetbrains.kotlin.codegen.JvmCodegenUtil.getDispatchReceiverParameterForConstructorCall +import org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface import org.jetbrains.kotlin.codegen.binding.CodegenBinding import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.config.LanguageFeature @@ -137,7 +138,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) { val generateAsFinal = (functionDescriptor.modality == Modality.FINAL || state.languageVersionSettings.supportsFeature(LanguageFeature.GenerateJvmOverloadsAsFinal)) && - !isInterface(functionDescriptor.containingDeclaration) + !isJvmInterface(functionDescriptor.containingDeclaration) val flags = baseMethodFlags or (if (isStatic) Opcodes.ACC_STATIC else 0) or diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java index 350cbe3026a..c1e84140240 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DescriptorAsmUtil.java @@ -188,8 +188,7 @@ public class DescriptorAsmUtil { if (functionDescriptor.getModality() == Modality.FINAL && !(functionDescriptor instanceof ConstructorDescriptor)) { DeclarationDescriptor containingDeclaration = functionDescriptor.getContainingDeclaration(); - if (!(containingDeclaration instanceof ClassDescriptor) || - ((ClassDescriptor) containingDeclaration).getKind() != ClassKind.INTERFACE) { + if (!isJvmInterface(containingDeclaration)) { flags |= ACC_FINAL; } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt index b7521d00ee2..94b7a4d8e76 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.codegen import com.intellij.psi.PsiElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.UnsignedTypes +import org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface import org.jetbrains.kotlin.codegen.binding.CodegenBinding import org.jetbrains.kotlin.codegen.context.CodegenContext import org.jetbrains.kotlin.codegen.context.FieldOwnerContext @@ -244,7 +245,7 @@ fun CallableDescriptor.isJvmStaticInObjectOrClassOrInterface(): Boolean = DescriptorUtils.isNonCompanionObject(it) || // This is necessary because for generation of @JvmStatic methods from companion of class A // we create a synthesized descriptor containing in class A - DescriptorUtils.isClassOrEnumClass(it) || DescriptorUtils.isInterface(it) + DescriptorUtils.isClassOrEnumClass(it) || isJvmInterface(it) } fun CallableDescriptor.isJvmStaticInCompanionObject(): Boolean = 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 b1ffc94f952..4a204a4a674 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 @@ -156,7 +156,7 @@ class FunctionCodegen( origin == JvmLoweredDeclarationOrigin.CLASS_STATIC_INITIALIZER -> 0 origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER -> 0 parentAsClass.isInterface && body != null -> 0 - parentAsClass.isAnnotationClass && !isStatic -> Opcodes.ACC_ABSTRACT + parentAsClass.isAnnotationClass -> if (isStatic) 0 else Opcodes.ACC_ABSTRACT else -> Opcodes.ACC_FINAL } Modality.ABSTRACT -> Opcodes.ACC_ABSTRACT diff --git a/compiler/testData/codegen/box/jvmStatic/kt35716.kt b/compiler/testData/codegen/box/jvmStatic/kt35716.kt index 19fd9bb1a43..65d1cec9aeb 100644 --- a/compiler/testData/codegen/box/jvmStatic/kt35716.kt +++ b/compiler/testData/codegen/box/jvmStatic/kt35716.kt @@ -9,6 +9,10 @@ class Test { public static String test1() { return A.sayHello(); } + + public static String test2() { + return B.sayHello(); + } } // FILE: simpleCompanionObject.kt @@ -22,8 +26,21 @@ interface A { } } } + +annotation class B { + companion object { + @JvmStatic + @JvmOverloads + fun sayHello(greeting: String = "OK"): String { + return greeting + } + } +} + fun box(): String { if (Test.test1() != "OK") return "fail 1" + if (Test.test2() != "OK") return "fail 2" + return "OK" } \ No newline at end of file