Support @JvmStatic in inline class companion object

#KT-27107
This commit is contained in:
Dmitry Petrov
2018-10-04 11:52:35 +03:00
parent 5304754e88
commit 0fd68d29f4
10 changed files with 152 additions and 6 deletions
@@ -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 -> {
@@ -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();
}
}
@@ -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();
}
}
@@ -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();
}
}
@@ -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");
@@ -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");
@@ -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");
@@ -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");
@@ -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");