From f9d61f2dc73212f9fa548e1a0e321318ff06cc39 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 10 Apr 2019 15:52:25 +0300 Subject: [PATCH] Make inline+reified functions synthetic instead of private in bytecode #KT-18563 Fixed --- .../src/org/jetbrains/kotlin/codegen/AsmUtil.java | 8 +++++--- .../jetbrains/kotlin/codegen/FunctionCodegen.java | 9 +++++---- .../kotlin/codegen/context/CodegenContext.java | 4 ++-- .../resolve/inline/InlineAnalyzerExtension.kt | 4 +++- .../jetbrains/kotlin/resolve/inline/inlineOnly.kt | 11 ++++++++++- .../kotlin/asJava/classes/ultraLightClass.kt | 9 +++++---- .../testData/asJava/lightClasses/InlineReified.java | 3 +++ .../testData/asJava/lightClasses/InlineReified.kt | 13 +++++++++++++ .../asJava/ultraLightClasses/inlineReified.kt | 11 +++++++++++ .../inline/InlineReifiedMultifile.txt | 3 ++- .../inline/InlineReifiedPropertyMultifile.txt | 3 ++- .../bytecodeListing/inline/inlineReified.txt | 4 ++-- .../inline/inlineReifiedProperty.txt | 4 ++-- .../codegen/bytecodeListing/inline/simpleNamed.txt | 8 ++++---- .../bytecodeListing/samAdapterAndInlinedOne.txt | 4 ++-- .../codegen/bytecodeListing/suspendReifiedFun.txt | 2 +- .../withDefaultArguments/reifiedFunInClass.kt | 3 +-- compiler/testData/writeFlags/inline/inlineOnly.kt | 10 ++++++++++ .../asJava/CompilerLightClassTestGenerated.java | 5 +++++ .../codegen/flags/WriteFlagsTestGenerated.java | 5 +++++ .../codegen/ir/IrWriteFlagsTestGenerated.java | 5 +++++ .../src/kotlin/reflect/jvm/ReflectJvmMapping.kt | 5 +---- .../UltraLightClassLoadingTestGenerated.java | 5 +++++ .../classes/UltraLightClassSanityTestGenerated.java | 5 +++++ .../resolve/IdeCompiledLightClassTestGenerated.java | 5 +++++ .../caches/resolve/IdeLightClassTestGenerated.java | 5 +++++ 26 files changed, 119 insertions(+), 34 deletions(-) create mode 100644 compiler/testData/asJava/lightClasses/InlineReified.java create mode 100644 compiler/testData/asJava/lightClasses/InlineReified.kt create mode 100644 compiler/testData/asJava/ultraLightClasses/inlineReified.kt create mode 100644 compiler/testData/writeFlags/inline/inlineOnly.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index 0a389e88d3b..4068ce8741f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -65,7 +65,8 @@ 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.resolve.DescriptorUtils.*; -import static org.jetbrains.kotlin.resolve.inline.InlineOnlyKt.isEffectivelyInlineOnly; +import static org.jetbrains.kotlin.resolve.inline.InlineOnlyKt.isInlineOnlyPrivateInBytecode; +import static org.jetbrains.kotlin.resolve.inline.InlineOnlyKt.isInlineWithReified; import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.*; import static org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt.hasJvmDefaultAnnotation; import static org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt.hasJvmSyntheticAnnotation; @@ -388,7 +389,8 @@ public class AsmUtil { flags |= getVarargsFlag(functionDescriptor); flags |= getDeprecatedAccessFlag(functionDescriptor); if (deprecationResolver.isDeprecatedHidden(functionDescriptor) || - (functionDescriptor.isSuspend()) && functionDescriptor.getVisibility().equals(Visibilities.PRIVATE)) { + isInlineWithReified(functionDescriptor) || + functionDescriptor.isSuspend() && functionDescriptor.getVisibility().equals(Visibilities.PRIVATE)) { flags |= ACC_SYNTHETIC; } return flags; @@ -526,7 +528,7 @@ public class AsmUtil { return ACC_PRIVATE; } - if (isEffectivelyInlineOnly(memberDescriptor)) { + if (isInlineOnlyPrivateInBytecode(memberDescriptor)) { return ACC_PRIVATE; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index e811936ea72..d0f96f5a2e6 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -76,6 +76,7 @@ import static org.jetbrains.kotlin.descriptors.ModalityKt.isOverridable; import static org.jetbrains.kotlin.resolve.DescriptorToSourceUtils.getSourceFromDescriptor; import static org.jetbrains.kotlin.resolve.DescriptorUtils.*; import static org.jetbrains.kotlin.resolve.inline.InlineOnlyKt.isEffectivelyInlineOnly; +import static org.jetbrains.kotlin.resolve.inline.InlineOnlyKt.isInlineOnlyPrivateInBytecode; import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE; import static org.jetbrains.kotlin.resolve.jvm.InlineClassManglingRulesKt.shouldHideConstructorDueToInlineClassTypeValueParameters; import static org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt.hasJvmDefaultAnnotation; @@ -1153,10 +1154,10 @@ public class FunctionCodegen { // $default methods are never private to be accessible from other class files (e.g. inner) without the need of synthetic accessors // $default methods are never protected to be accessible from subclass nested classes - int visibilityFlag = Visibilities.isPrivate(functionDescriptor.getVisibility()) || - isEffectivelyInlineOnly(functionDescriptor) ? - AsmUtil.NO_FLAG_PACKAGE_PRIVATE : Opcodes.ACC_PUBLIC; - int flags = visibilityFlag | getDeprecatedAccessFlag(functionDescriptor) | ACC_SYNTHETIC; + int visibilityFlag = + Visibilities.isPrivate(functionDescriptor.getVisibility()) || isInlineOnlyPrivateInBytecode(functionDescriptor) + ? AsmUtil.NO_FLAG_PACKAGE_PRIVATE : Opcodes.ACC_PUBLIC; + int flags = visibilityFlag | getDeprecatedAccessFlag(functionDescriptor) | ACC_SYNTHETIC; if (!(functionDescriptor instanceof ConstructorDescriptor && !InlineClassesUtilsKt.isInlineClass(functionDescriptor.getContainingDeclaration())) ) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java index 03422e3bdc6..d16937c220d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java @@ -27,7 +27,7 @@ import java.util.*; import static org.jetbrains.kotlin.codegen.AsmUtil.getVisibilityAccessFlag; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isNonDefaultInterfaceMember; -import static org.jetbrains.kotlin.resolve.inline.InlineOnlyKt.isEffectivelyInlineOnly; +import static org.jetbrains.kotlin.resolve.inline.InlineOnlyKt.isInlineOnlyPrivateInBytecode; import static org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt.hasJvmDefaultAnnotation; import static org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt.isCallableMemberWithJvmDefaultAnnotation; import static org.jetbrains.org.objectweb.asm.Opcodes.ACC_PRIVATE; @@ -693,7 +693,7 @@ public abstract class CodegenContext { boolean withinInline, boolean isSuperCall ) { - if (isEffectivelyInlineOnly(unwrappedDescriptor)) return false; + if (isInlineOnlyPrivateInBytecode(unwrappedDescriptor)) return false; return isSuperCall && withinInline || (accessFlag & ACC_PRIVATE) != 0 || diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt index a0db576c6be..8a37a83e62d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt @@ -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 diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/inlineOnly.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/inlineOnly.kt index ea16e6702a6..51a7336e488 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/inlineOnly.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/inlineOnly.kt @@ -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 && diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt index 4f68066f8e4..899a7533c8f 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt @@ -431,8 +431,7 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor forceStatic: Boolean, forcePrivate: Boolean = false ): Collection { - - if (ktFunction.hasAnnotation(JVM_SYNTHETIC_ANNOTATION_FQ_NAME)) return emptyList() + if (ktFunction.hasAnnotation(JVM_SYNTHETIC_ANNOTATION_FQ_NAME) || ktFunction.hasReifiedParameters()) return emptyList() val basicMethod = asJavaMethod(ktFunction, forceStatic, forcePrivate) @@ -562,7 +561,6 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor private fun KtDeclaration.isInlineOnly(): Boolean { if (this !is KtCallableDeclaration || !hasModifier(INLINE_KEYWORD)) return false - if (typeParameters.any { it.hasModifier(REIFIED_KEYWORD) }) return true if (annotationEntries.isEmpty()) return false val descriptor = resolve() as? CallableMemberDescriptor ?: return false @@ -638,7 +636,7 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor ): List { val propertyName = declaration.name ?: return emptyList() - if (declaration.isConstOrJvmField()) return emptyList() + if (declaration.isConstOrJvmField() || declaration.hasReifiedParameters()) return emptyList() val ktGetter = (declaration as? KtProperty)?.getter val ktSetter = (declaration as? KtProperty)?.setter @@ -704,6 +702,9 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor !declaration.hasModifier(ABSTRACT_KEYWORD) } + private fun KtCallableDeclaration.hasReifiedParameters(): Boolean = + typeParameters.any { it.hasModifier(REIFIED_KEYWORD) } + override fun getInitializers(): Array = emptyArray() override fun getContainingClass(): PsiClass? = diff --git a/compiler/testData/asJava/lightClasses/InlineReified.java b/compiler/testData/asJava/lightClasses/InlineReified.java new file mode 100644 index 00000000000..de2a76e3d28 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/InlineReified.java @@ -0,0 +1,3 @@ +public final class InlineReified { + public InlineReified() { /* compiled code */ } +} diff --git a/compiler/testData/asJava/lightClasses/InlineReified.kt b/compiler/testData/asJava/lightClasses/InlineReified.kt new file mode 100644 index 00000000000..5a4dcba1474 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/InlineReified.kt @@ -0,0 +1,13 @@ +// a.InlineReified +package a + +class InlineReified { + inline fun foo(x: Any): T = x as T + + inline val T.bar: T? + get() = null as T? + + var T.x: String + inline get() = toString() + inline set(value) {} +} diff --git a/compiler/testData/asJava/ultraLightClasses/inlineReified.kt b/compiler/testData/asJava/ultraLightClasses/inlineReified.kt new file mode 100644 index 00000000000..06b275b8232 --- /dev/null +++ b/compiler/testData/asJava/ultraLightClasses/inlineReified.kt @@ -0,0 +1,11 @@ +class C { + inline fun foo(x: Any): T = x as T + + inline val bar: T? + get() = null as T? + set(value) {} + + var T.x: String + inline get() = toString() + inline set(value) {} +} diff --git a/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedMultifile.txt b/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedMultifile.txt index f8fd810a97d..cfb6d14ec5b 100644 --- a/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedMultifile.txt +++ b/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedMultifile.txt @@ -1,10 +1,11 @@ @kotlin.Metadata public final class test/Foo { public final static method foo(): void + public synthetic final static method inlineReified(): void } @kotlin.Metadata synthetic final class test/Foo__InlineReifiedMultifileKt { public final static method foo(): void - private final static method inlineReified(): void + public synthetic final static method inlineReified(): void } diff --git a/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedPropertyMultifile.txt b/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedPropertyMultifile.txt index 13a193d578f..1fe0d2fa223 100644 --- a/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedPropertyMultifile.txt +++ b/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedPropertyMultifile.txt @@ -1,10 +1,11 @@ @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__InlineReifiedPropertyMultifileKt { 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 } diff --git a/compiler/testData/codegen/bytecodeListing/inline/inlineReified.txt b/compiler/testData/codegen/bytecodeListing/inline/inlineReified.txt index 5785773aaa3..a39ca7f5fd6 100644 --- a/compiler/testData/codegen/bytecodeListing/inline/inlineReified.txt +++ b/compiler/testData/codegen/bytecodeListing/inline/inlineReified.txt @@ -2,11 +2,11 @@ public final class Foo { public method (): void public final method bar(): void - private final method baz(): void + public synthetic final method baz(): void } @kotlin.Metadata public final class InlineReifiedKt { public final static method bar(): void - private final static method baz(): void + public synthetic final static method baz(): void } diff --git a/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedProperty.txt b/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedProperty.txt index 106c7fb78ce..0aff0739840 100644 --- a/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedProperty.txt +++ b/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedProperty.txt @@ -1,10 +1,10 @@ @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 } @kotlin.Metadata public final class InlineReifiedPropertyKt { - 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 } diff --git a/compiler/testData/codegen/bytecodeListing/inline/simpleNamed.txt b/compiler/testData/codegen/bytecodeListing/inline/simpleNamed.txt index 4e5a791ff5a..aca87388eb6 100644 --- a/compiler/testData/codegen/bytecodeListing/inline/simpleNamed.txt +++ b/compiler/testData/codegen/bytecodeListing/inline/simpleNamed.txt @@ -7,8 +7,8 @@ public final class Foo { private final @org.jetbrains.annotations.Nullable method generic$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object public final @org.jetbrains.annotations.Nullable method generic(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object public final @org.jetbrains.annotations.Nullable method generic(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object - private final method genericWithReified(p0: java.lang.Object, p1: kotlin.coroutines.Continuation): java.lang.Object - private final method genericWithReified(p0: kotlin.coroutines.Continuation): java.lang.Object + public synthetic final @org.jetbrains.annotations.Nullable method genericWithReified(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object + public synthetic final @org.jetbrains.annotations.Nullable method genericWithReified(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object private synthetic final method privateInline(p0: kotlin.coroutines.Continuation): java.lang.Object private final @kotlin.internal.InlineOnly method shouldNotHaveSuffix(p0: kotlin.coroutines.Continuation): java.lang.Object private final @org.jetbrains.annotations.Nullable method simple$$forInline(@org.jetbrains.annotations.NotNull p0: kotlin.Unit, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object @@ -25,8 +25,8 @@ public final class SimpleNamedKt { private final static @org.jetbrains.annotations.Nullable method generic$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object public final static @org.jetbrains.annotations.Nullable method generic(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object public final static @org.jetbrains.annotations.Nullable method generic(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object - private final static method genericWithReified(p0: java.lang.Object, p1: kotlin.coroutines.Continuation): java.lang.Object - private final static method genericWithReified(p0: kotlin.coroutines.Continuation): java.lang.Object + public synthetic final static @org.jetbrains.annotations.Nullable method genericWithReified(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object + public synthetic final static @org.jetbrains.annotations.Nullable method genericWithReified(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object private synthetic final static method privateInline(p0: kotlin.coroutines.Continuation): java.lang.Object private final static @kotlin.internal.InlineOnly method shouldNotHaveSuffix(p0: kotlin.coroutines.Continuation): java.lang.Object private final static @org.jetbrains.annotations.Nullable method simple$$forInline(@org.jetbrains.annotations.NotNull p0: kotlin.Unit, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object diff --git a/compiler/testData/codegen/bytecodeListing/samAdapterAndInlinedOne.txt b/compiler/testData/codegen/bytecodeListing/samAdapterAndInlinedOne.txt index f1169324842..e741959576a 100644 --- a/compiler/testData/codegen/bytecodeListing/samAdapterAndInlinedOne.txt +++ b/compiler/testData/codegen/bytecodeListing/samAdapterAndInlinedOne.txt @@ -14,8 +14,8 @@ 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 -} \ No newline at end of file +} diff --git a/compiler/testData/codegen/bytecodeListing/suspendReifiedFun.txt b/compiler/testData/codegen/bytecodeListing/suspendReifiedFun.txt index 014c0bc10ee..862a220217f 100644 --- a/compiler/testData/codegen/bytecodeListing/suspendReifiedFun.txt +++ b/compiler/testData/codegen/bytecodeListing/suspendReifiedFun.txt @@ -1,7 +1,7 @@ @kotlin.Metadata public class AbstractStuff { public method (): void - private final method hello(p0: java.lang.Object, p1: COROUTINES_PACKAGE.Continuation): java.lang.Object + public synthetic final @org.jetbrains.annotations.Nullable method hello(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: COROUTINES_PACKAGE.Continuation): java.lang.Object } @kotlin.Metadata diff --git a/compiler/testData/writeFlags/function/withDefaultArguments/reifiedFunInClass.kt b/compiler/testData/writeFlags/function/withDefaultArguments/reifiedFunInClass.kt index 74a18e8f7ad..b9924b1a502 100644 --- a/compiler/testData/writeFlags/function/withDefaultArguments/reifiedFunInClass.kt +++ b/compiler/testData/writeFlags/function/withDefaultArguments/reifiedFunInClass.kt @@ -1,8 +1,7 @@ -// IGNORE_BACKEND: JVM_IR class MyClass() { inline fun test(s: String = "") {} } // TESTED_OBJECT_KIND: function // TESTED_OBJECTS: MyClass, test$default -// FLAGS: ACC_STATIC, ACC_SYNTHETIC +// FLAGS: ACC_PUBLIC, ACC_STATIC, ACC_SYNTHETIC diff --git a/compiler/testData/writeFlags/inline/inlineOnly.kt b/compiler/testData/writeFlags/inline/inlineOnly.kt new file mode 100644 index 00000000000..3da64fbc274 --- /dev/null +++ b/compiler/testData/writeFlags/inline/inlineOnly.kt @@ -0,0 +1,10 @@ +// IGNORE_BACKEND: JVM_IR +class MyClass { + @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") + @kotlin.internal.InlineOnly + inline fun test(s: String) {} +} + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: MyClass, test +// FLAGS: ACC_PRIVATE, ACC_FINAL diff --git a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index bb26c1c0dd7..3477f2b5d2b 100644 --- a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -99,6 +99,11 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT runTest("compiler/testData/asJava/lightClasses/InheritingInterfaceDefaultImpls.kt"); } + @TestMetadata("InlineReified.kt") + public void testInlineReified() throws Exception { + runTest("compiler/testData/asJava/lightClasses/InlineReified.kt"); + } + @TestMetadata("JvmNameOnMember.kt") public void testJvmNameOnMember() throws Exception { runTest("compiler/testData/asJava/lightClasses/JvmNameOnMember.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java index 90d5085898f..b13ccba1441 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java @@ -635,6 +635,11 @@ public class WriteFlagsTestGenerated extends AbstractWriteFlagsTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/writeFlags/inline"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); } + @TestMetadata("inlineOnly.kt") + public void testInlineOnly() throws Exception { + runTest("compiler/testData/writeFlags/inline/inlineOnly.kt"); + } + @TestMetadata("lostInnerClass.kt") public void testLostInnerClass() throws Exception { runTest("compiler/testData/writeFlags/inline/lostInnerClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteFlagsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteFlagsTestGenerated.java index 020dec36dda..51bfecafd6a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteFlagsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteFlagsTestGenerated.java @@ -635,6 +635,11 @@ public class IrWriteFlagsTestGenerated extends AbstractIrWriteFlagsTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/writeFlags/inline"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true); } + @TestMetadata("inlineOnly.kt") + public void testInlineOnly() throws Exception { + runTest("compiler/testData/writeFlags/inline/inlineOnly.kt"); + } + @TestMetadata("lostInnerClass.kt") public void testLostInnerClass() throws Exception { runTest("compiler/testData/writeFlags/inline/lostInnerClass.kt"); diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt index 8ed8136bcfa..9df594bb17e 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt @@ -110,13 +110,10 @@ private fun Member.getKPackage(): KDeclarationContainer? = /** * Returns a [KFunction] instance corresponding to the given Java [Method] instance, - * or `null` if this method cannot be represented by a Kotlin function - * (for example, if it is a synthetic method). + * or `null` if this method cannot be represented by a Kotlin function. */ val Method.kotlinFunction: KFunction<*>? get() { - if (isSynthetic) return null - if (Modifier.isStatic(modifiers)) { val kotlinPackage = getKPackage() if (kotlinPackage != null) { diff --git a/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassLoadingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassLoadingTestGenerated.java index 7f2ebec22c9..f2cb1c03da4 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassLoadingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassLoadingTestGenerated.java @@ -104,6 +104,11 @@ public class UltraLightClassLoadingTestGenerated extends AbstractUltraLightClass runTest("compiler/testData/asJava/ultraLightClasses/inlineOnly.kt"); } + @TestMetadata("inlineReified.kt") + public void testInlineReified() throws Exception { + runTest("compiler/testData/asJava/ultraLightClasses/inlineReified.kt"); + } + @TestMetadata("jvmField.kt") public void testJvmField() throws Exception { runTest("compiler/testData/asJava/ultraLightClasses/jvmField.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassSanityTestGenerated.java b/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassSanityTestGenerated.java index 6144add9eb2..8d3012de835 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassSanityTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassSanityTestGenerated.java @@ -99,6 +99,11 @@ public class UltraLightClassSanityTestGenerated extends AbstractUltraLightClassS runTest("compiler/testData/asJava/lightClasses/InheritingInterfaceDefaultImpls.kt"); } + @TestMetadata("InlineReified.kt") + public void testInlineReified() throws Exception { + runTest("compiler/testData/asJava/lightClasses/InlineReified.kt"); + } + @TestMetadata("JvmNameOnMember.kt") public void testJvmNameOnMember() throws Exception { runTest("compiler/testData/asJava/lightClasses/JvmNameOnMember.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java index 6c7858f950c..00b16005e23 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeCompiledLightClassTestGenerated.java @@ -99,6 +99,11 @@ public class IdeCompiledLightClassTestGenerated extends AbstractIdeCompiledLight runTest("compiler/testData/asJava/lightClasses/InheritingInterfaceDefaultImpls.kt"); } + @TestMetadata("InlineReified.kt") + public void testInlineReified() throws Exception { + runTest("compiler/testData/asJava/lightClasses/InlineReified.kt"); + } + @TestMetadata("JvmNameOnMember.kt") public void testJvmNameOnMember() throws Exception { runTest("compiler/testData/asJava/lightClasses/JvmNameOnMember.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java index 7a6ea3ad72c..8eda58d79e6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java @@ -99,6 +99,11 @@ public class IdeLightClassTestGenerated extends AbstractIdeLightClassTest { runTest("compiler/testData/asJava/lightClasses/InheritingInterfaceDefaultImpls.kt"); } + @TestMetadata("InlineReified.kt") + public void testInlineReified() throws Exception { + runTest("compiler/testData/asJava/lightClasses/InlineReified.kt"); + } + @TestMetadata("JvmNameOnMember.kt") public void testJvmNameOnMember() throws Exception { runTest("compiler/testData/asJava/lightClasses/JvmNameOnMember.kt");