diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt index f5d603af78c..c5044cb907b 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt @@ -33,8 +33,10 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl +import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.NaiveSourceBasedFileEntryImpl import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable +import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.psi2ir.PsiSourceManager @@ -93,37 +95,40 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa } else -> error("unknown kind of file entry: $fileEntry") } + val isMultifilePart = fileClassInfo.withJvmMultifileClass return IrClassImpl( 0, fileEntry.maxOffset, - if (!fileClassInfo.withJvmMultifileClass || context.state.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts)) + if (!isMultifilePart || context.state.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts)) IrDeclarationOrigin.FILE_CLASS else IrDeclarationOrigin.SYNTHETIC_FILE_CLASS, symbol = IrClassSymbolImpl(descriptor), name = fileClassInfo.fileClassFqName.shortName(), kind = ClassKind.CLASS, - visibility = if (!fileClassInfo.withJvmMultifileClass) DescriptorVisibilities.PUBLIC else JavaDescriptorVisibilities.PACKAGE_VISIBILITY, + visibility = if (!isMultifilePart) DescriptorVisibilities.PUBLIC else JavaDescriptorVisibilities.PACKAGE_VISIBILITY, modality = Modality.FINAL ).apply { descriptor.bind(this) - superTypes += context.irBuiltIns.anyType + superTypes = listOf(context.irBuiltIns.anyType) parent = irFile declarations.addAll(fileClassMembers) createImplicitParameterDeclarationWithWrappedDescriptor() - fileClassMembers.forEach { - it.parent = this - if (it is IrProperty) { - it.getter?.let { it.parent = this } - it.setter?.let { it.parent = this } - it.backingField?.let { it.parent = this } + for (member in fileClassMembers) { + member.parent = this + if (member is IrProperty) { + member.getter?.let { it.parent = this } + member.setter?.let { it.parent = this } + member.backingField?.let { it.parent = this } } } - annotations += irFile.annotations + annotations = + if (isMultifilePart) irFile.annotations.filterNot { it.symbol.owner.parentAsClass.symbol.signature == JVM_NAME } + else irFile.annotations metadata = irFile.metadata val partClassType = AsmUtil.asmTypeByFqNameWithoutInnerClasses(fileClassInfo.fileClassFqName) val facadeClassType = - if (fileClassInfo.withJvmMultifileClass) AsmUtil.asmTypeByFqNameWithoutInnerClasses(fileClassInfo.facadeClassFqName) + if (isMultifilePart) AsmUtil.asmTypeByFqNameWithoutInnerClasses(fileClassInfo.facadeClassFqName) else null context.state.factory.packagePartRegistry.addPart(irFile.fqName, partClassType.internalName, facadeClassType?.internalName) @@ -137,4 +142,8 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa } } } + + private companion object { + private val JVM_NAME = IdSignature.PublicSignature("kotlin.jvm", "JvmName", null, 0) + } } diff --git a/compiler/testData/codegen/bytecodeListing/defaultArguments/privateFunctionInMultifilePart.kt b/compiler/testData/codegen/bytecodeListing/defaultArguments/privateFunctionInMultifilePart.kt index 09df7d16058..95174ba172d 100644 --- a/compiler/testData/codegen/bytecodeListing/defaultArguments/privateFunctionInMultifilePart.kt +++ b/compiler/testData/codegen/bytecodeListing/defaultArguments/privateFunctionInMultifilePart.kt @@ -1,5 +1,5 @@ // WITH_RUNTIME -// The remaining differences of JVM and JVM_IR here are reported at KT-36970, KT-41841. +// The remaining difference of JVM and JVM_IR here is reported at KT-41841. @file:JvmMultifileClass @file:JvmName("A") diff --git a/compiler/testData/codegen/bytecodeListing/defaultArguments/privateFunctionInMultifilePart_ir.txt b/compiler/testData/codegen/bytecodeListing/defaultArguments/privateFunctionInMultifilePart_ir.txt index 60fbfc17c29..ad00dcdd25a 100644 --- a/compiler/testData/codegen/bytecodeListing/defaultArguments/privateFunctionInMultifilePart_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/defaultArguments/privateFunctionInMultifilePart_ir.txt @@ -5,7 +5,6 @@ public final class A { } @kotlin.Metadata -@kotlin.jvm.JvmName synthetic final class A__PrivateFunctionInMultifilePartKt { // source: 'privateFunctionInMultifilePart.kt' synthetic static method foo$A__PrivateFunctionInMultifilePartKt$default(p0: java.lang.String, p1: int, p2: java.lang.Object): void diff --git a/compiler/testData/codegen/bytecodeListing/emptyMultifileFacade.kt b/compiler/testData/codegen/bytecodeListing/emptyMultifileFacade.kt index d81ae42cc9c..bf435726c0a 100644 --- a/compiler/testData/codegen/bytecodeListing/emptyMultifileFacade.kt +++ b/compiler/testData/codegen/bytecodeListing/emptyMultifileFacade.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME @file:[JvmName("Foo") JvmMultifileClass] diff --git a/compiler/testData/codegen/bytecodeListing/inline/InlineOnlyMultifile.kt b/compiler/testData/codegen/bytecodeListing/inline/InlineOnlyMultifile.kt index 097d02557a2..9ca588a09ef 100644 --- a/compiler/testData/codegen/bytecodeListing/inline/InlineOnlyMultifile.kt +++ b/compiler/testData/codegen/bytecodeListing/inline/InlineOnlyMultifile.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME @file:[JvmName("Foo") JvmMultifileClass] diff --git a/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedMultifile.kt b/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedMultifile.kt index a1ea740d039..a73ab89072c 100644 --- a/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedMultifile.kt +++ b/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedMultifile.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME @file:[JvmName("Foo") JvmMultifileClass] diff --git a/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedPropertyMultifile.kt b/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedPropertyMultifile.kt index d46823c27d3..15ae30ba78c 100644 --- a/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedPropertyMultifile.kt +++ b/compiler/testData/codegen/bytecodeListing/inline/InlineReifiedPropertyMultifile.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME @file:[JvmName("Foo") JvmMultifileClass] diff --git a/compiler/testData/codegen/bytecodeListing/main/multifileSuspend_ir.txt b/compiler/testData/codegen/bytecodeListing/main/multifileSuspend_ir.txt index 6331143ec1f..1e0999dfe5e 100644 --- a/compiler/testData/codegen/bytecodeListing/main/multifileSuspend_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/main/multifileSuspend_ir.txt @@ -17,7 +17,6 @@ synthetic final class Hello/Foo__MultifileSuspendKt$main$2 { } @kotlin.Metadata -@kotlin.jvm.JvmName synthetic final class Hello/Foo__MultifileSuspendKt { // source: 'multifileSuspend.kt' inner (anonymous) class Hello/Foo__MultifileSuspendKt$main$2 diff --git a/compiler/testData/codegen/bytecodeListing/multiClassPartSourceMultipleParts_ir.txt b/compiler/testData/codegen/bytecodeListing/multiClassPartSourceMultipleParts_ir.txt deleted file mode 100644 index 5a106aadbd9..00000000000 --- a/compiler/testData/codegen/bytecodeListing/multiClassPartSourceMultipleParts_ir.txt +++ /dev/null @@ -1,19 +0,0 @@ -@kotlin.Metadata -public final class MultiFileClass { - public final static method bar(): void - public final static method foo(): void -} - -@kotlin.Metadata -@kotlin.jvm.JvmName -synthetic final class MultiFileClass__Part1Kt { - // source: 'part1.kt' - public final static method foo(): void -} - -@kotlin.Metadata -@kotlin.jvm.JvmName -synthetic final class MultiFileClass__Part2Kt { - // source: 'part2.kt' - public final static method bar(): void -} diff --git a/compiler/testData/codegen/bytecodeListing/multiClassPartSourceSinglePart_ir.txt b/compiler/testData/codegen/bytecodeListing/multiClassPartSourceSinglePart_ir.txt deleted file mode 100644 index 174b419f18e..00000000000 --- a/compiler/testData/codegen/bytecodeListing/multiClassPartSourceSinglePart_ir.txt +++ /dev/null @@ -1,12 +0,0 @@ -@kotlin.Metadata -public final class MultiFileClass { - // source: 'multiClassPartSourceSinglePart.kt' - public final static method foo(): void -} - -@kotlin.Metadata -@kotlin.jvm.JvmName -synthetic final class MultiFileClass__MultiClassPartSourceSinglePartKt { - // source: 'multiClassPartSourceSinglePart.kt' - public final static method foo(): void -}