Support @JvmStatic in inline class companion object
#KT-27107
This commit is contained in:
@@ -330,7 +330,8 @@ public class FunctionCodegen {
|
|||||||
@NotNull DeclarationDescriptor containingDeclaration
|
@NotNull DeclarationDescriptor containingDeclaration
|
||||||
) {
|
) {
|
||||||
return !canDelegateMethodBodyToInlineClass(origin, functionDescriptor, contextKind, containingDeclaration) ||
|
return !canDelegateMethodBodyToInlineClass(origin, functionDescriptor, contextKind, containingDeclaration) ||
|
||||||
!functionDescriptor.getOverriddenDescriptors().isEmpty();
|
!functionDescriptor.getOverriddenDescriptors().isEmpty() ||
|
||||||
|
CodegenUtilKt.isJvmStaticInInlineClass(functionDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean canDelegateMethodBodyToInlineClass(
|
private static boolean canDelegateMethodBodyToInlineClass(
|
||||||
@@ -343,6 +344,9 @@ public class FunctionCodegen {
|
|||||||
if (contextKind == OwnerKind.ERASED_INLINE_CLASS) return false;
|
if (contextKind == OwnerKind.ERASED_INLINE_CLASS) return false;
|
||||||
if (origin.getOriginKind() == JvmDeclarationOriginKind.UNBOX_METHOD_OF_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
|
// descriptor corresponds to the underlying value
|
||||||
if (functionDescriptor instanceof PropertyAccessorDescriptor) {
|
if (functionDescriptor instanceof PropertyAccessorDescriptor) {
|
||||||
PropertyDescriptor property = ((PropertyAccessorDescriptor) functionDescriptor).getCorrespondingProperty();
|
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.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.*
|
||||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils.isSubclass
|
import org.jetbrains.kotlin.resolve.DescriptorUtils.isSubclass
|
||||||
import org.jetbrains.kotlin.resolve.annotations.hasJvmStaticAnnotation
|
import org.jetbrains.kotlin.resolve.annotations.hasJvmStaticAnnotation
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getFirstArgumentExpression
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getFirstArgumentExpression
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
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.AsmTypes
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
||||||
@@ -257,6 +253,9 @@ fun CallableDescriptor.isJvmStaticInObjectOrClassOrInterface(): Boolean =
|
|||||||
fun CallableDescriptor.isJvmStaticInCompanionObject(): Boolean =
|
fun CallableDescriptor.isJvmStaticInCompanionObject(): Boolean =
|
||||||
isJvmStaticIn { DescriptorUtils.isCompanionObject(it) }
|
isJvmStaticIn { DescriptorUtils.isCompanionObject(it) }
|
||||||
|
|
||||||
|
fun CallableDescriptor.isJvmStaticInInlineClass(): Boolean =
|
||||||
|
isJvmStaticIn { it.isInlineClass() }
|
||||||
|
|
||||||
private fun CallableDescriptor.isJvmStaticIn(predicate: (DeclarationDescriptor) -> Boolean): Boolean =
|
private fun CallableDescriptor.isJvmStaticIn(predicate: (DeclarationDescriptor) -> Boolean): Boolean =
|
||||||
when (this) {
|
when (this) {
|
||||||
is PropertyAccessorDescriptor -> {
|
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");
|
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")
|
@TestMetadata("kt25246.kt")
|
||||||
public void testKt25246() throws Exception {
|
public void testKt25246() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
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");
|
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")
|
@TestMetadata("kt25246.kt")
|
||||||
public void testKt25246() throws Exception {
|
public void testKt25246() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
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");
|
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")
|
@TestMetadata("kt25246.kt")
|
||||||
public void testKt25246() throws Exception {
|
public void testKt25246() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
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");
|
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")
|
@TestMetadata("kt25246.kt")
|
||||||
public void testKt25246() throws Exception {
|
public void testKt25246() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
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");
|
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")
|
@TestMetadata("kt25246.kt")
|
||||||
public void testKt25246() throws Exception {
|
public void testKt25246() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user