Support @JvmStatic in inline class companion object
#KT-27107
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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 -> {
|
||||
|
||||
+21
@@ -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();
|
||||
}
|
||||
}
|
||||
Vendored
+21
@@ -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();
|
||||
}
|
||||
}
|
||||
+26
@@ -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();
|
||||
}
|
||||
}
|
||||
+15
@@ -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");
|
||||
|
||||
+15
@@ -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");
|
||||
|
||||
+15
@@ -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");
|
||||
|
||||
+15
@@ -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");
|
||||
|
||||
+15
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user