From 56859f7b87fa1e3c35daf192060e4c2e6793cce6 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Mon, 4 Sep 2017 11:06:05 +0200 Subject: [PATCH] Don't generate reified inline function as privates #KT-18563 Fixed --- .../src/org/jetbrains/kotlin/codegen/AsmUtil.java | 8 +++++++- .../codegen/bytecodeListing/InlineOnlyMultifile.txt | 3 ++- .../bytecodeListing/InlineOnlyPropertyMultifile.txt | 3 ++- .../testData/codegen/bytecodeListing/inlineOnly.txt | 4 ++-- .../codegen/bytecodeListing/inlineOnlyProperty.txt | 4 ++-- .../bytecodeListing/samAdapterAndInlinedOne.txt | 2 +- .../kotlin/descriptors/annotations/annotationUtil.kt | 10 ++++++---- 7 files changed, 22 insertions(+), 12 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index f9358b79b25..afb41be4be6 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -59,6 +59,7 @@ import static org.jetbrains.kotlin.codegen.CodegenUtilKt.isToArrayFromCollection import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConstOrHasJvmFieldAnnotation; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface; import static org.jetbrains.kotlin.descriptors.annotations.AnnotationUtilKt.isEffectivelyInlineOnly; +import static org.jetbrains.kotlin.descriptors.annotations.AnnotationUtilKt.isInlineOnly; import static org.jetbrains.kotlin.resolve.DescriptorUtils.*; import static org.jetbrains.kotlin.resolve.annotations.AnnotationUtilKt.hasJvmDefaultAnnotation; import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.*; @@ -238,6 +239,10 @@ public class AsmUtil { flags |= ACC_SYNTHETIC; } + if (isEffectivelyInlineOnly(functionDescriptor, false)) { + flags |= ACC_SYNTHETIC; + } + return flags; } @@ -346,7 +351,8 @@ public class AsmUtil { DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration(); Visibility memberVisibility = memberDescriptor.getVisibility(); - if (isEffectivelyInlineOnly(memberDescriptor)) { + if (isInlineOnly(memberDescriptor)) { + //inline only functions are only allowed in stdlib and it's never shrinked return ACC_PRIVATE; } diff --git a/compiler/testData/codegen/bytecodeListing/InlineOnlyMultifile.txt b/compiler/testData/codegen/bytecodeListing/InlineOnlyMultifile.txt index 17646e6f65f..77dbae2fb25 100644 --- a/compiler/testData/codegen/bytecodeListing/InlineOnlyMultifile.txt +++ b/compiler/testData/codegen/bytecodeListing/InlineOnlyMultifile.txt @@ -1,11 +1,12 @@ @kotlin.Metadata public final class test/Foo { public final static method foo(): void + public synthetic final static method inlineOnly(): void } @kotlin.Metadata synthetic final class test/Foo__InlineOnlyMultifileKt { public final static method foo(): void - private final static method inlineOnly(): void + public synthetic final static method inlineOnly(): void private final static @kotlin.internal.InlineOnly method inlineOnlyAnnotated(): void } diff --git a/compiler/testData/codegen/bytecodeListing/InlineOnlyPropertyMultifile.txt b/compiler/testData/codegen/bytecodeListing/InlineOnlyPropertyMultifile.txt index 5df386f0305..115a3768d13 100644 --- a/compiler/testData/codegen/bytecodeListing/InlineOnlyPropertyMultifile.txt +++ b/compiler/testData/codegen/bytecodeListing/InlineOnlyPropertyMultifile.txt @@ -1,12 +1,13 @@ @kotlin.Metadata public final class test/Foo { public final static method foo(): void + public synthetic final static @org.jetbrains.annotations.NotNull method getExtProp(p0: java.lang.Object): java.lang.String } @kotlin.Metadata synthetic final class test/Foo__InlineOnlyPropertyMultifileKt { public final static method foo(): void - private final static method getExtProp(p0: java.lang.Object): java.lang.String + public synthetic final static @org.jetbrains.annotations.NotNull method getExtProp(p0: java.lang.Object): java.lang.String private final static method getProp(): java.lang.String public synthetic deprecated static @kotlin.internal.InlineOnly method prop$annotations(): void private final static method setProp(p0: java.lang.String): void diff --git a/compiler/testData/codegen/bytecodeListing/inlineOnly.txt b/compiler/testData/codegen/bytecodeListing/inlineOnly.txt index 0864d92b1f4..16379d00066 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineOnly.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineOnly.txt @@ -2,13 +2,13 @@ public final class Foo { public method (): void public final method bar(): void - private final method baz(): void + public synthetic final method baz(): void private final @kotlin.internal.InlineOnly method foo(): void } @kotlin.Metadata public final class InlineOnlyKt { public final static method bar(): void - private final static method baz(): void + public synthetic final static method baz(): void private final static @kotlin.internal.InlineOnly method foo(): void } diff --git a/compiler/testData/codegen/bytecodeListing/inlineOnlyProperty.txt b/compiler/testData/codegen/bytecodeListing/inlineOnlyProperty.txt index ef353da9bca..050bf673a6d 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineOnlyProperty.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineOnlyProperty.txt @@ -1,7 +1,7 @@ @kotlin.Metadata public final class Foo { public method (): void - private final method getExtProp(p0: java.lang.Object): java.lang.String + public synthetic final @org.jetbrains.annotations.NotNull method getExtProp(p0: java.lang.Object): java.lang.String private final method getProp(): java.lang.String private final @kotlin.internal.InlineOnly method getProp2(): java.lang.String public synthetic deprecated static @kotlin.internal.InlineOnly method prop$annotations(): void @@ -11,7 +11,7 @@ public final class Foo { @kotlin.Metadata public final class InlineOnlyPropertyKt { - private final static method getExtProp(p0: java.lang.Object): java.lang.String + public synthetic final static @org.jetbrains.annotations.NotNull method getExtProp(p0: java.lang.Object): java.lang.String private final static method getProp(): java.lang.String private final static @kotlin.internal.InlineOnly method getProp2(): java.lang.String public synthetic deprecated static @kotlin.internal.InlineOnly method prop$annotations(): void diff --git a/compiler/testData/codegen/bytecodeListing/samAdapterAndInlinedOne.txt b/compiler/testData/codegen/bytecodeListing/samAdapterAndInlinedOne.txt index f1169324842..fc00fab2b09 100644 --- a/compiler/testData/codegen/bytecodeListing/samAdapterAndInlinedOne.txt +++ b/compiler/testData/codegen/bytecodeListing/samAdapterAndInlinedOne.txt @@ -14,7 +14,7 @@ final class test/SamAdapterAndInlinedOneKt$sam$java_lang_Runnable$0 { @kotlin.Metadata public final class test/SamAdapterAndInlinedOneKt { - private final static method makeRunnable(p0: kotlin.jvm.functions.Function0): java.lang.Runnable + public synthetic final static @org.jetbrains.annotations.NotNull method makeRunnable(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function0): java.lang.Runnable public final static @org.jetbrains.annotations.NotNull method makeRunnable2(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function0): java.lang.Runnable public final static @org.jetbrains.annotations.NotNull method noInline(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function0): java.lang.Runnable public final static @org.jetbrains.annotations.NotNull method noInline2(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function0): java.lang.Runnable diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/annotationUtil.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/annotationUtil.kt index 223613b5a3e..5ee2ad9c7f0 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/annotationUtil.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/annotationUtil.kt @@ -69,11 +69,13 @@ private val REPLACE_WITH_IMPORTS_NAME = Name.identifier("imports") 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.isInlineOnlyOrReifiable(checkInlineOnly: Boolean = true): Boolean = + this is CallableMemberDescriptor && + (isReifiable() || DescriptorUtils.getDirectMember(this).isReifiable() || (checkInlineOnly && isInlineOnly())) -fun MemberDescriptor.isEffectivelyInlineOnly(): Boolean = - isInlineOnlyOrReifiable() || safeAs()?.let { it.isSuspend && it.isInline } == true +@JvmOverloads +fun MemberDescriptor.isEffectivelyInlineOnly(checkInlineOnly: Boolean = true): Boolean = + isInlineOnlyOrReifiable(checkInlineOnly) || safeAs()?.let { it.isSuspend && it.isInline } == true fun MemberDescriptor.isInlineOnly(): Boolean { if (this !is FunctionDescriptor ||