Make inline+reified functions synthetic instead of private in bytecode

#KT-18563 Fixed
This commit is contained in:
Alexander Udalov
2019-04-10 15:52:25 +03:00
parent a645b36688
commit f9d61f2dc7
26 changed files with 119 additions and 34 deletions
@@ -181,7 +181,9 @@ class InlineAnalyzerExtension(
}
if (hasInlineArgs) return
if (functionDescriptor.isInlineOnlyOrReifiable() || functionDescriptor.isExpect || functionDescriptor.isSuspend) return
if (functionDescriptor.isInlineWithReified() || functionDescriptor.isInlineOnly() || functionDescriptor.isExpect ||
functionDescriptor.isSuspend
) return
if (reasonableInlineRules.any { it.isInlineReasonable(functionDescriptor, function, trace.bindingContext) }) return
@@ -14,8 +14,17 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
private val INLINE_ONLY_ANNOTATION_FQ_NAME = FqName("kotlin.internal.InlineOnly")
/**
* @return true if it's impossible to observe a call instruction referencing this member in the bytecode.
*/
fun MemberDescriptor.isEffectivelyInlineOnly(): Boolean =
isInlineWithReified() || isInlineOnly() || isPrivateInlineSuspend()
isInlineWithReified() || isInlineOnlyPrivateInBytecode()
/**
* @return true if this member should be private in bytecode because it's effectively inline-only.
*/
fun MemberDescriptor.isInlineOnlyPrivateInBytecode(): Boolean =
isInlineOnly() || isPrivateInlineSuspend()
fun MemberDescriptor.isInlineOnly(): Boolean =
this is FunctionDescriptor && isInline &&