JVM IR: do not generate JvmName on multifile parts

#KT-36970 Fixed
This commit is contained in:
Alexander Udalov
2020-10-13 11:02:53 +02:00
parent 0eccb9661f
commit b257b03152
10 changed files with 21 additions and 49 deletions
@@ -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)
}
}
@@ -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")
@@ -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
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
// WITH_RUNTIME
@file:[JvmName("Foo") JvmMultifileClass]
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
// WITH_RUNTIME
@file:[JvmName("Foo") JvmMultifileClass]
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
// WITH_RUNTIME
@file:[JvmName("Foo") JvmMultifileClass]
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
// WITH_RUNTIME
@file:[JvmName("Foo") JvmMultifileClass]
@@ -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
@@ -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
}
@@ -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
}