diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index ae64857b106..399f7f26c92 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -330,7 +330,8 @@ public class FunctionCodegen { @NotNull DeclarationDescriptor containingDeclaration ) { return !canDelegateMethodBodyToInlineClass(origin, functionDescriptor, contextKind, containingDeclaration) || - !functionDescriptor.getOverriddenDescriptors().isEmpty(); + !functionDescriptor.getOverriddenDescriptors().isEmpty() || + CodegenUtilKt.isJvmStaticInInlineClass(functionDescriptor); } private static boolean canDelegateMethodBodyToInlineClass( @@ -343,6 +344,9 @@ public class FunctionCodegen { if (contextKind == OwnerKind.ERASED_INLINE_CLASS) return false; if (origin.getOriginKind() == JvmDeclarationOriginKind.UNBOX_METHOD_OF_INLINE_CLASS) return false; + // Synthesized class member descriptors corresponding to JvmStatic members of companion object + if (CodegenUtilKt.isJvmStaticInInlineClass(functionDescriptor)) return false; + // descriptor corresponds to the underlying value if (functionDescriptor instanceof PropertyAccessorDescriptor) { PropertyDescriptor property = ((PropertyAccessorDescriptor) functionDescriptor).getCorrespondingProperty(); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt index c7cc6e04381..83bb92f5b25 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt @@ -33,17 +33,13 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.renderer.DescriptorRenderer -import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.DescriptorUtils.isSubclass import org.jetbrains.kotlin.resolve.annotations.hasJvmStaticAnnotation import org.jetbrains.kotlin.resolve.calls.callUtil.getFirstArgumentExpression import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns -import org.jetbrains.kotlin.resolve.isInlineClassType import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin @@ -257,6 +253,9 @@ fun CallableDescriptor.isJvmStaticInObjectOrClassOrInterface(): Boolean = fun CallableDescriptor.isJvmStaticInCompanionObject(): Boolean = isJvmStaticIn { DescriptorUtils.isCompanionObject(it) } +fun CallableDescriptor.isJvmStaticInInlineClass(): Boolean = + isJvmStaticIn { it.isInlineClass() } + private fun CallableDescriptor.isJvmStaticIn(predicate: (DeclarationDescriptor) -> Boolean): Boolean = when (this) { is PropertyAccessorDescriptor -> { diff --git a/compiler/testData/codegen/box/inlineClasses/jvmStaticFunInInlineClassCompanion.kt b/compiler/testData/codegen/box/inlineClasses/jvmStaticFunInInlineClassCompanion.kt new file mode 100644 index 00000000000..9299a5ec64a --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/jvmStaticFunInInlineClassCompanion.kt @@ -0,0 +1,21 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JS, JS_IR, JVM_IR +// WITH_RUNTIME + +// FILE: test.kt +inline class R(private val r: Int) { + + companion object { + @JvmStatic + fun ok() = "OK" + } +} + +fun box() = J.test() + +// FILE: J.java +public class J { + public static String test() { + return R.ok(); + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/inlineClasses/jvmStaticPropertyAccessorInInlineClassCompanion.kt b/compiler/testData/codegen/box/inlineClasses/jvmStaticPropertyAccessorInInlineClassCompanion.kt new file mode 100644 index 00000000000..5ea207243ef --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/jvmStaticPropertyAccessorInInlineClassCompanion.kt @@ -0,0 +1,21 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JS, JS_IR, JVM_IR +// WITH_RUNTIME + +// FILE: test.kt +inline class R(private val r: Int) { + + companion object { + val ok + @JvmStatic get() = "OK" + } +} + +fun box() = J.test() + +// FILE: J.java +public class J { + public static String test() { + return R.getOk(); + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt b/compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt new file mode 100644 index 00000000000..09caf6ce1e9 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt @@ -0,0 +1,26 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JS, JS_IR, JVM_IR +// WITH_RUNTIME + +// FILE: test.kt +inline class R(private val r: Int) { + + companion object { + private var ok_ = "" + + @JvmStatic + var ok + get() = ok_ + set(value) { ok_ = value } + } +} + +fun box() = J.test() + +// FILE: J.java +public class J { + public static String test() { + R.setOk("OK"); + return R.getOk(); + } +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 85d80a6d8ab..36f9271bf18 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11794,6 +11794,21 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/jvmFieldInInlineClassCompanion.kt"); } + @TestMetadata("jvmStaticFunInInlineClassCompanion.kt") + public void testJvmStaticFunInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticFunInInlineClassCompanion.kt"); + } + + @TestMetadata("jvmStaticPropertyAccessorInInlineClassCompanion.kt") + public void testJvmStaticPropertyAccessorInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticPropertyAccessorInInlineClassCompanion.kt"); + } + + @TestMetadata("jvmStaticVarInInlineClassCompanion.kt") + public void testJvmStaticVarInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt"); + } + @TestMetadata("kt25246.kt") public void testKt25246() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index ca736f41bdb..3bf6ed94266 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11794,6 +11794,21 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/jvmFieldInInlineClassCompanion.kt"); } + @TestMetadata("jvmStaticFunInInlineClassCompanion.kt") + public void testJvmStaticFunInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticFunInInlineClassCompanion.kt"); + } + + @TestMetadata("jvmStaticPropertyAccessorInInlineClassCompanion.kt") + public void testJvmStaticPropertyAccessorInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticPropertyAccessorInInlineClassCompanion.kt"); + } + + @TestMetadata("jvmStaticVarInInlineClassCompanion.kt") + public void testJvmStaticVarInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt"); + } + @TestMetadata("kt25246.kt") public void testKt25246() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index ecf295241fc..e45275efbd5 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11799,6 +11799,21 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/jvmFieldInInlineClassCompanion.kt"); } + @TestMetadata("jvmStaticFunInInlineClassCompanion.kt") + public void testJvmStaticFunInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticFunInInlineClassCompanion.kt"); + } + + @TestMetadata("jvmStaticPropertyAccessorInInlineClassCompanion.kt") + public void testJvmStaticPropertyAccessorInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticPropertyAccessorInInlineClassCompanion.kt"); + } + + @TestMetadata("jvmStaticVarInInlineClassCompanion.kt") + public void testJvmStaticVarInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt"); + } + @TestMetadata("kt25246.kt") public void testKt25246() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index 5aa77deb60d..b4e19bdd42b 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -10329,6 +10329,21 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/jvmFieldInInlineClassCompanion.kt"); } + @TestMetadata("jvmStaticFunInInlineClassCompanion.kt") + public void testJvmStaticFunInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticFunInInlineClassCompanion.kt"); + } + + @TestMetadata("jvmStaticPropertyAccessorInInlineClassCompanion.kt") + public void testJvmStaticPropertyAccessorInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticPropertyAccessorInInlineClassCompanion.kt"); + } + + @TestMetadata("jvmStaticVarInInlineClassCompanion.kt") + public void testJvmStaticVarInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt"); + } + @TestMetadata("kt25246.kt") public void testKt25246() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index ba0d1158f21..a2ce953f0f7 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -11374,6 +11374,21 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/jvmFieldInInlineClassCompanion.kt"); } + @TestMetadata("jvmStaticFunInInlineClassCompanion.kt") + public void testJvmStaticFunInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticFunInInlineClassCompanion.kt"); + } + + @TestMetadata("jvmStaticPropertyAccessorInInlineClassCompanion.kt") + public void testJvmStaticPropertyAccessorInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticPropertyAccessorInInlineClassCompanion.kt"); + } + + @TestMetadata("jvmStaticVarInInlineClassCompanion.kt") + public void testJvmStaticVarInInlineClassCompanion() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/jvmStaticVarInInlineClassCompanion.kt"); + } + @TestMetadata("kt25246.kt") public void testKt25246() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");