JVM IR: do not generate JvmName on multifile parts
#KT-36970 Fixed
This commit is contained in:
+20
-11
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -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")
|
||||
|
||||
Vendored
-1
@@ -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
@@ -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
|
||||
|
||||
-19
@@ -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
|
||||
}
|
||||
-12
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user