diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt index 3ca296a9015..b15d89c81ff 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt @@ -180,11 +180,7 @@ private fun IrDeclarationWithVisibility.specialCaseVisibility(kind: OwnerKind?): return Opcodes.ACC_PRIVATE } - if (this is IrFunction && (isReifiable() || isBridge())) { - return Opcodes.ACC_PUBLIC - } - - if (isEffectivelyInlineOnly()) { + if (isInlineOnlyPrivateInBytecode() || isInlineOnlyPropertyAccessor()) { return Opcodes.ACC_PRIVATE } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt index b6231123816..6017d3fbd3b 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt @@ -417,31 +417,12 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass overriddenSymbols = irFunction.overriddenSymbols.toList() } - private fun getBridgeVisibility(bridge: Bridge): DescriptorVisibility { - // Even though kotlin.Cloneable#clone() is protected, corresponding bridge is 'public' in JVM. - if (bridge.overridden.name.asString() == "clone" && - bridge.overridden.parentAsClass.hasEqualFqName(StandardNames.FqNames.cloneable.toSafe()) - ) { - return DescriptorVisibilities.PUBLIC - } - - val overriddenVisibility = bridge.overridden.visibility - // Internal functions can be overridden by non-internal functions, which changes their names since the names of internal - // functions are mangled. In order to avoid mangling the name twice we reset the visibility for bridges to internal - // functions to public and use the mangled name directly. - return if (overriddenVisibility == DescriptorVisibilities.INTERNAL) - DescriptorVisibilities.PUBLIC - else - overriddenVisibility - } - private fun IrClass.addBridge(bridge: Bridge, target: IrSimpleFunction): IrSimpleFunction = addFunction { startOffset = this@addBridge.startOffset endOffset = this@addBridge.startOffset modality = Modality.OPEN origin = IrDeclarationOrigin.BRIDGE - visibility = getBridgeVisibility(bridge) name = Name.identifier(bridge.signature.name) returnType = bridge.overridden.returnType.eraseTypeParameters() isSuspend = bridge.overridden.isSuspend diff --git a/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedPropertyVisibility.kt b/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedPropertyVisibility.kt new file mode 100644 index 00000000000..6fb4e5c4ea9 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedPropertyVisibility.kt @@ -0,0 +1,16 @@ +internal inline val Z.internalExtProp: String + get() = "1" + +private inline val Z.privateExtProp: String + get() = "2" + +class Foo { + internal inline val Z.internalExtProp: String + get() = "3" + + protected inline val Z.protectedExtProp: String + get() = "4" + + private inline val Z.privateExtProp: String + get() = "5" +} diff --git a/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedPropertyVisibility.txt b/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedPropertyVisibility.txt new file mode 100644 index 00000000000..ca198bea87f --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedPropertyVisibility.txt @@ -0,0 +1,15 @@ +@kotlin.Metadata +public final class Foo { + // source: 'inlineReifiedPropertyVisibility.kt' + public method (): void + public synthetic final method getInternalExtProp$test_module(p0: java.lang.Object): java.lang.String + private synthetic final method getPrivateExtProp(p0: java.lang.Object): java.lang.String + protected synthetic final method getProtectedExtProp(p0: java.lang.Object): java.lang.String +} + +@kotlin.Metadata +public final class InlineReifiedPropertyVisibilityKt { + // source: 'inlineReifiedPropertyVisibility.kt' + public synthetic final static method getInternalExtProp(p0: java.lang.Object): java.lang.String + private synthetic final static method getPrivateExtProp(p0: java.lang.Object): java.lang.String +} diff --git a/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedVisibility.kt b/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedVisibility.kt new file mode 100644 index 00000000000..8ff61547378 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedVisibility.kt @@ -0,0 +1,8 @@ +internal inline fun f() {} +private inline fun g() {} + +class Foo { + internal inline fun f() {} + protected inline fun g() {} + private inline fun h() {} +} diff --git a/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedVisibility.txt b/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedVisibility.txt new file mode 100644 index 00000000000..9aa03d1a340 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inline/inlineReifiedVisibility.txt @@ -0,0 +1,15 @@ +@kotlin.Metadata +public final class Foo { + // source: 'inlineReifiedVisibility.kt' + public method (): void + public synthetic final method f$test_module(): void + protected synthetic final method g(): void + private synthetic final method h(): void +} + +@kotlin.Metadata +public final class InlineReifiedVisibilityKt { + // source: 'inlineReifiedVisibility.kt' + public synthetic final static method f(): void + private synthetic final static method g(): void +} diff --git a/compiler/testData/codegen/bytecodeListing/inline/suspendInlineReified.kt b/compiler/testData/codegen/bytecodeListing/inline/suspendInlineReified.kt new file mode 100644 index 00000000000..e0725f24146 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inline/suspendInlineReified.kt @@ -0,0 +1,10 @@ +class A { + inline suspend fun publicFun() {} + internal inline suspend fun internalFun() {} + protected inline suspend fun protectedFun() {} + private inline suspend fun privateFun() {} +} + +inline suspend fun publicFun() {} +internal inline suspend fun internalFun() {} +private inline suspend fun privateFun() {} diff --git a/compiler/testData/codegen/bytecodeListing/inline/suspendInlineReified.txt b/compiler/testData/codegen/bytecodeListing/inline/suspendInlineReified.txt new file mode 100644 index 00000000000..fe5988b1144 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inline/suspendInlineReified.txt @@ -0,0 +1,17 @@ +@kotlin.Metadata +public final class A { + // source: 'suspendInlineReified.kt' + public method (): void + public synthetic final method internalFun$test_module(p0: java.lang.Object): java.lang.Object + private synthetic final method privateFun(p0: java.lang.Object): java.lang.Object + protected synthetic final method protectedFun(p0: java.lang.Object): java.lang.Object + public synthetic final method publicFun(p0: java.lang.Object): java.lang.Object +} + +@kotlin.Metadata +public final class SuspendInlineReifiedKt { + // source: 'suspendInlineReified.kt' + public synthetic final static method internalFun(p0: java.lang.Object): java.lang.Object + private synthetic final static method privateFun(p0: java.lang.Object): java.lang.Object + public synthetic final static method publicFun(p0: java.lang.Object): java.lang.Object +} diff --git a/compiler/testData/codegen/bytecodeListing/inline/suspendInlineReified_ir.txt b/compiler/testData/codegen/bytecodeListing/inline/suspendInlineReified_ir.txt new file mode 100644 index 00000000000..3d4ca7f1506 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inline/suspendInlineReified_ir.txt @@ -0,0 +1,17 @@ +@kotlin.Metadata +public final class A { + // source: 'suspendInlineReified.kt' + public method (): void + public synthetic final method internalFun$test_module(p0: kotlin.coroutines.Continuation): java.lang.Object + private synthetic final method privateFun(p0: kotlin.coroutines.Continuation): java.lang.Object + protected synthetic final method protectedFun(p0: kotlin.coroutines.Continuation): java.lang.Object + public synthetic final method publicFun(p0: kotlin.coroutines.Continuation): java.lang.Object +} + +@kotlin.Metadata +public final class SuspendInlineReifiedKt { + // source: 'suspendInlineReified.kt' + public synthetic final static method internalFun(p0: kotlin.coroutines.Continuation): java.lang.Object + private synthetic final static method privateFun(p0: kotlin.coroutines.Continuation): java.lang.Object + public synthetic final static method publicFun(p0: kotlin.coroutines.Continuation): java.lang.Object +} diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java index 7c801ea3ab8..436776ab37a 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java @@ -906,11 +906,26 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { runTest("compiler/testData/codegen/bytecodeListing/inline/InlineReifiedPropertyMultifile.kt"); } + @TestMetadata("inlineReifiedPropertyVisibility.kt") + public void testInlineReifiedPropertyVisibility() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/inline/inlineReifiedPropertyVisibility.kt"); + } + + @TestMetadata("inlineReifiedVisibility.kt") + public void testInlineReifiedVisibility() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/inline/inlineReifiedVisibility.kt"); + } + @TestMetadata("simpleNamed.kt") public void testSimpleNamed() throws Exception { runTest("compiler/testData/codegen/bytecodeListing/inline/simpleNamed.kt"); } + @TestMetadata("suspendInlineReified.kt") + public void testSuspendInlineReified() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/inline/suspendInlineReified.kt"); + } + @TestMetadata("compiler/testData/codegen/bytecodeListing/inline/enclosingInfo") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java index 47a6f5cf4eb..a9ef97c564d 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java @@ -906,11 +906,26 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes runTest("compiler/testData/codegen/bytecodeListing/inline/InlineReifiedPropertyMultifile.kt"); } + @TestMetadata("inlineReifiedPropertyVisibility.kt") + public void testInlineReifiedPropertyVisibility() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/inline/inlineReifiedPropertyVisibility.kt"); + } + + @TestMetadata("inlineReifiedVisibility.kt") + public void testInlineReifiedVisibility() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/inline/inlineReifiedVisibility.kt"); + } + @TestMetadata("simpleNamed.kt") public void testSimpleNamed() throws Exception { runTest("compiler/testData/codegen/bytecodeListing/inline/simpleNamed.kt"); } + @TestMetadata("suspendInlineReified.kt") + public void testSuspendInlineReified() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/inline/suspendInlineReified.kt"); + } + @TestMetadata("compiler/testData/codegen/bytecodeListing/inline/enclosingInfo") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)