Treat inline suspend functions as inline-only

Now their bodies don't have real state machines, thus they cannot
be called correctly from Java

 #KT-17585 In progress
 #KT-16603 In progress
This commit is contained in:
Denis Zharkov
2017-05-04 15:01:31 +03:00
parent ba200f5de1
commit 7c6a15ddfe
9 changed files with 18 additions and 16 deletions
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.resolve.constants.ArrayValue
import org.jetbrains.kotlin.resolve.constants.EnumValue
import org.jetbrains.kotlin.resolve.constants.StringValue
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
fun KotlinBuiltIns.createDeprecatedAnnotation(
message: String,
@@ -73,6 +74,9 @@ private val INLINE_ONLY_ANNOTATION_FQ_NAME = FqName("kotlin.internal.InlineOnly"
fun MemberDescriptor.isInlineOnlyOrReifiable(): Boolean =
this is CallableMemberDescriptor && (isReifiable() || DescriptorUtils.getDirectMember(this).isReifiable() || isInlineOnly())
fun MemberDescriptor.isEffectivelyInlineOnly(): Boolean =
isInlineOnlyOrReifiable() || safeAs<FunctionDescriptor>()?.let { it.isSuspend && it.isInline } == true
fun MemberDescriptor.isInlineOnly(): Boolean {
if (this !is FunctionDescriptor ||
!(hasInlineOnlyAnnotation() || DescriptorUtils.getDirectMember(this).hasInlineOnlyAnnotation())) return false
@@ -19,7 +19,7 @@ package kotlin.reflect.jvm.internal
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.annotations.isInlineOnlyOrReifiable
import org.jetbrains.kotlin.descriptors.annotations.isEffectivelyInlineOnly
import java.lang.reflect.Constructor
import java.lang.reflect.Member
import java.lang.reflect.Method
@@ -60,7 +60,7 @@ internal class KFunctionImpl private constructor(
private fun isPrivateInBytecode(): Boolean =
Visibilities.isPrivate(descriptor.visibility) ||
descriptor.isInlineOnlyOrReifiable()
descriptor.isEffectivelyInlineOnly()
private fun isDeclared(): Boolean = isPrivateInBytecode()