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.declarations.impl.IrClassImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl 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.NaiveSourceBasedFileEntryImpl
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable 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.java.JavaDescriptorVisibilities
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
import org.jetbrains.kotlin.psi2ir.PsiSourceManager 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") else -> error("unknown kind of file entry: $fileEntry")
} }
val isMultifilePart = fileClassInfo.withJvmMultifileClass
return IrClassImpl( return IrClassImpl(
0, fileEntry.maxOffset, 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, IrDeclarationOrigin.FILE_CLASS else IrDeclarationOrigin.SYNTHETIC_FILE_CLASS,
symbol = IrClassSymbolImpl(descriptor), symbol = IrClassSymbolImpl(descriptor),
name = fileClassInfo.fileClassFqName.shortName(), name = fileClassInfo.fileClassFqName.shortName(),
kind = ClassKind.CLASS, 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 modality = Modality.FINAL
).apply { ).apply {
descriptor.bind(this) descriptor.bind(this)
superTypes += context.irBuiltIns.anyType superTypes = listOf(context.irBuiltIns.anyType)
parent = irFile parent = irFile
declarations.addAll(fileClassMembers) declarations.addAll(fileClassMembers)
createImplicitParameterDeclarationWithWrappedDescriptor() createImplicitParameterDeclarationWithWrappedDescriptor()
fileClassMembers.forEach { for (member in fileClassMembers) {
it.parent = this member.parent = this
if (it is IrProperty) { if (member is IrProperty) {
it.getter?.let { it.parent = this } member.getter?.let { it.parent = this }
it.setter?.let { it.parent = this } member.setter?.let { it.parent = this }
it.backingField?.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 metadata = irFile.metadata
val partClassType = AsmUtil.asmTypeByFqNameWithoutInnerClasses(fileClassInfo.fileClassFqName) val partClassType = AsmUtil.asmTypeByFqNameWithoutInnerClasses(fileClassInfo.fileClassFqName)
val facadeClassType = val facadeClassType =
if (fileClassInfo.withJvmMultifileClass) AsmUtil.asmTypeByFqNameWithoutInnerClasses(fileClassInfo.facadeClassFqName) if (isMultifilePart) AsmUtil.asmTypeByFqNameWithoutInnerClasses(fileClassInfo.facadeClassFqName)
else null else null
context.state.factory.packagePartRegistry.addPart(irFile.fqName, partClassType.internalName, facadeClassType?.internalName) 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 // 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:JvmMultifileClass
@file:JvmName("A") @file:JvmName("A")
@@ -5,7 +5,6 @@ public final class A {
} }
@kotlin.Metadata @kotlin.Metadata
@kotlin.jvm.JvmName
synthetic final class A__PrivateFunctionInMultifilePartKt { synthetic final class A__PrivateFunctionInMultifilePartKt {
// source: 'privateFunctionInMultifilePart.kt' // source: 'privateFunctionInMultifilePart.kt'
synthetic static method foo$A__PrivateFunctionInMultifilePartKt$default(p0: java.lang.String, p1: int, p2: java.lang.Object): void 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 // WITH_RUNTIME
@file:[JvmName("Foo") JvmMultifileClass] @file:[JvmName("Foo") JvmMultifileClass]
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
// WITH_RUNTIME // WITH_RUNTIME
@file:[JvmName("Foo") JvmMultifileClass] @file:[JvmName("Foo") JvmMultifileClass]
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
// WITH_RUNTIME // WITH_RUNTIME
@file:[JvmName("Foo") JvmMultifileClass] @file:[JvmName("Foo") JvmMultifileClass]
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
// WITH_RUNTIME // WITH_RUNTIME
@file:[JvmName("Foo") JvmMultifileClass] @file:[JvmName("Foo") JvmMultifileClass]
@@ -17,7 +17,6 @@ synthetic final class Hello/Foo__MultifileSuspendKt$main$2 {
} }
@kotlin.Metadata @kotlin.Metadata
@kotlin.jvm.JvmName
synthetic final class Hello/Foo__MultifileSuspendKt { synthetic final class Hello/Foo__MultifileSuspendKt {
// source: 'multifileSuspend.kt' // source: 'multifileSuspend.kt'
inner (anonymous) class Hello/Foo__MultifileSuspendKt$main$2 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
}