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 715e9de38fa..6a72dd8a34f 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 @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.backend.common.lower.allOverridden import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns.FQ_NAMES import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.codegen.* @@ -33,7 +32,7 @@ import org.jetbrains.kotlin.load.java.JavaVisibilities import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker -import org.jetbrains.kotlin.resolve.inline.* +import org.jetbrains.kotlin.resolve.inline.INLINE_ONLY_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmClassSignature import org.jetbrains.kotlin.resolve.source.PsiSourceElement import org.jetbrains.kotlin.utils.addIfNotNull @@ -73,8 +72,7 @@ val IrClass.isJvmInterface get() = isAnnotationClass || isInterface val IrDeclaration.fileParent: IrFile get() { - val myParent = parent - return when (myParent) { + return when (val myParent = parent) { is IrFile -> myParent else -> (myParent as IrDeclaration).fileParent } @@ -103,7 +101,7 @@ fun JvmBackendContext.getSourceMapper(declaration: IrClass): SourceMapper { } val IrType.isExtensionFunctionType: Boolean - get() = isFunctionTypeOrSubtype() && hasAnnotation(KotlinBuiltIns.FQ_NAMES.extensionFunctionType) + get() = isFunctionTypeOrSubtype() && hasAnnotation(FQ_NAMES.extensionFunctionType) /* Borrowed with modifications from MemberCodegen.java */ @@ -121,23 +119,13 @@ fun writeInnerClass(innerClass: IrClass, typeMapper: IrTypeMapper, context: JvmB private val NO_FLAG_LOCAL = 0 -private val visibilityToAccessFlag = mapOf( - Visibilities.PRIVATE to Opcodes.ACC_PRIVATE, - Visibilities.PRIVATE_TO_THIS to Opcodes.ACC_PRIVATE, - Visibilities.PROTECTED to Opcodes.ACC_PROTECTED, - JavaVisibilities.PROTECTED_STATIC_VISIBILITY to Opcodes.ACC_PROTECTED, - JavaVisibilities.PROTECTED_AND_PACKAGE to Opcodes.ACC_PROTECTED, - Visibilities.PUBLIC to Opcodes.ACC_PUBLIC, - Visibilities.INTERNAL to Opcodes.ACC_PUBLIC, - Visibilities.LOCAL to NO_FLAG_LOCAL, - JavaVisibilities.PACKAGE_VISIBILITY to AsmUtil.NO_FLAG_PACKAGE_PRIVATE -) - private fun IrDeclaration.getVisibilityAccessFlagForAnonymous(): Int = if (isInlineOrContainedInInline(parent as? IrDeclaration)) Opcodes.ACC_PUBLIC else AsmUtil.NO_FLAG_PACKAGE_PRIVATE fun IrClass.calculateInnerClassAccessFlags(context: JvmBackendContext): Int { - val isLambda = superTypes.any { it.safeAs()?.classifier === context.ir.symbols.lambdaClass } + val isLambda = superTypes.any { + it.safeAs()?.classifier === context.ir.symbols.lambdaClass + } val visibility = when { isLambda -> getVisibilityAccessFlagForAnonymous() visibility === Visibilities.LOCAL -> Opcodes.ACC_PUBLIC @@ -165,18 +153,30 @@ private fun IrClass.innerAccessFlagsForModalityAndKind(): Int { return 0 } -fun IrDeclarationWithVisibility.getVisibilityAccessFlag(kind: OwnerKind? = null): Int = - specialCaseVisibility(kind) - ?: visibilityToAccessFlag[visibility] - ?: throw IllegalStateException("$visibility is not a valid visibility in backend for ${ir2string(this)}") +fun IrDeclarationWithVisibility.getVisibilityAccessFlag(kind: OwnerKind? = null): Int { + specialCaseVisibility(kind)?.let { + return it + } + return when (visibility) { + Visibilities.PRIVATE -> Opcodes.ACC_PRIVATE + Visibilities.PRIVATE_TO_THIS -> Opcodes.ACC_PRIVATE + Visibilities.PROTECTED -> Opcodes.ACC_PROTECTED + JavaVisibilities.PROTECTED_STATIC_VISIBILITY -> Opcodes.ACC_PROTECTED + JavaVisibilities.PROTECTED_AND_PACKAGE -> Opcodes.ACC_PROTECTED + Visibilities.PUBLIC -> Opcodes.ACC_PUBLIC + Visibilities.INTERNAL -> Opcodes.ACC_PUBLIC + Visibilities.LOCAL -> NO_FLAG_LOCAL + JavaVisibilities.PACKAGE_VISIBILITY -> AsmUtil.NO_FLAG_PACKAGE_PRIVATE + else -> throw IllegalStateException("$visibility is not a valid visibility in backend for ${ir2string(this)}") + } +} private fun IrDeclarationWithVisibility.specialCaseVisibility(kind: OwnerKind?): Int? { // if (JvmCodegenUtil.isNonIntrinsicPrivateCompanionObjectInInterface(memberDescriptor)) { // return ACC_PUBLIC // } - if (this is IrClass && Visibilities.isPrivate(visibility) && - hasInterfaceParent() - ) { // TODO: non-intrinsic + if (this is IrClass && Visibilities.isPrivate(visibility) && isCompanion && hasInterfaceParent()) { + // TODO: non-intrinsic return Opcodes.ACC_PUBLIC } diff --git a/compiler/testData/codegen/bytecodeListing/privateNestedClassInInterface.kt b/compiler/testData/codegen/bytecodeListing/privateNestedClassInInterface.kt new file mode 100644 index 00000000000..c7920bfdb1c --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/privateNestedClassInInterface.kt @@ -0,0 +1,3 @@ +interface IFoo { + private class Nested +} \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeListing/privateNestedClassInInterface.txt b/compiler/testData/codegen/bytecodeListing/privateNestedClassInInterface.txt new file mode 100644 index 00000000000..3658eaa6a09 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/privateNestedClassInInterface.txt @@ -0,0 +1,10 @@ +@kotlin.Metadata +final class IFoo$Nested { + public method (): void + private final inner class IFoo$Nested +} + +@kotlin.Metadata +public interface IFoo { + private final inner class IFoo$Nested +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java index 4675180bf19..68fe1383b1b 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java @@ -144,6 +144,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { runTest("compiler/testData/codegen/bytecodeListing/privateDefaultSetter.kt"); } + @TestMetadata("privateNestedClassInInterface.kt") + public void testPrivateNestedClassInInterface() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/privateNestedClassInInterface.kt"); + } + @TestMetadata("samAdapterAndInlinedOne.kt") public void testSamAdapterAndInlinedOne() throws Exception { runTest("compiler/testData/codegen/bytecodeListing/samAdapterAndInlinedOne.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java index 64c33c833c7..7d8a0824c57 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java @@ -144,6 +144,11 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes runTest("compiler/testData/codegen/bytecodeListing/privateDefaultSetter.kt"); } + @TestMetadata("privateNestedClassInInterface.kt") + public void testPrivateNestedClassInInterface() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/privateNestedClassInInterface.kt"); + } + @TestMetadata("samAdapterAndInlinedOne.kt") public void testSamAdapterAndInlinedOne() throws Exception { runTest("compiler/testData/codegen/bytecodeListing/samAdapterAndInlinedOne.kt");