JVM_IR fix local class names for files with @JvmPackageName
This commit is contained in:
committed by
TeamCityServer
parent
c4b2b7e0da
commit
19fb7ebfd5
+19
-9
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassInfo
|
||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
||||
import org.jetbrains.kotlin.fileClasses.JvmSimpleFileClassInfo
|
||||
import org.jetbrains.kotlin.ir.PsiIrFileEntry
|
||||
@@ -78,13 +79,7 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
|
||||
|
||||
private fun createFileClass(irFile: IrFile, fileClassMembers: List<IrDeclaration>): IrClass {
|
||||
val fileEntry = irFile.fileEntry
|
||||
val fileClassInfo = when (fileEntry) {
|
||||
is PsiIrFileEntry ->
|
||||
JvmFileClassUtil.getFileClassInfoNoResolve(fileEntry.psiFile as KtFile)
|
||||
is NaiveSourceBasedFileEntryImpl ->
|
||||
JvmSimpleFileClassInfo(PackagePartClassUtils.getPackagePartFqName(irFile.fqName, fileEntry.name), false)
|
||||
else -> error("unknown kind of file entry: $fileEntry")
|
||||
}
|
||||
val fileClassInfo = irFile.getFileClassInfo()
|
||||
val isMultifilePart = fileClassInfo.withJvmMultifileClass
|
||||
|
||||
val onlyPrivateDeclarationsAndFeatureIsEnabled =
|
||||
@@ -95,10 +90,14 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
|
||||
isPrivate || isInlineOnly
|
||||
}
|
||||
|
||||
val fileClassOrigin =
|
||||
if (!isMultifilePart || context.state.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts))
|
||||
IrDeclarationOrigin.FILE_CLASS
|
||||
else
|
||||
IrDeclarationOrigin.SYNTHETIC_FILE_CLASS
|
||||
return IrClassImpl(
|
||||
0, fileEntry.maxOffset,
|
||||
if (!isMultifilePart || context.state.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts))
|
||||
IrDeclarationOrigin.FILE_CLASS else IrDeclarationOrigin.SYNTHETIC_FILE_CLASS,
|
||||
fileClassOrigin,
|
||||
symbol = IrClassSymbolImpl(),
|
||||
name = fileClassInfo.fileClassFqName.shortName(),
|
||||
kind = ClassKind.CLASS,
|
||||
@@ -148,3 +147,14 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
|
||||
private val JVM_NAME = IdSignature.PublicSignature("kotlin.jvm", "JvmName", null, 0)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun IrFile.getFileClassInfo(): JvmFileClassInfo =
|
||||
when (val fileEntry = this.fileEntry) {
|
||||
is PsiIrFileEntry ->
|
||||
JvmFileClassUtil.getFileClassInfoNoResolve(fileEntry.psiFile as KtFile)
|
||||
is NaiveSourceBasedFileEntryImpl ->
|
||||
JvmSimpleFileClassInfo(PackagePartClassUtils.getPackagePartFqName(fqName, fileEntry.name), false)
|
||||
else ->
|
||||
error("unknown kind of file entry: $fileEntry")
|
||||
}
|
||||
|
||||
+14
-6
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
|
||||
import org.jetbrains.kotlin.ir.expressions.IrPropertyReference
|
||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.util.isAnonymousObject
|
||||
import org.jetbrains.kotlin.ir.util.render
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.NameUtils
|
||||
@@ -54,15 +55,22 @@ class InventNamesForLocalClasses(private val context: JvmBackendContext) : FileL
|
||||
if (!data.isLocal) {
|
||||
// This is not a local class, so we need not invent a name for it, the type mapper will correctly compute it
|
||||
// by navigating through its containers.
|
||||
|
||||
val internalName = data.enclosingName?.let { enclosingName ->
|
||||
val enclosingName = data.enclosingName
|
||||
val internalName = if (enclosingName != null) {
|
||||
"$enclosingName$${declaration.name.asString()}"
|
||||
} ?: (declaration.parent as IrFile).let { file ->
|
||||
JvmClassName.byFqNameWithoutInnerClasses(file.fqName.child(declaration.name)).internalName
|
||||
} else {
|
||||
val file = declaration.parent as? IrFile
|
||||
?: throw AssertionError("Top-level class expected: ${declaration.render()}")
|
||||
val classFqn =
|
||||
if (declaration.origin == IrDeclarationOrigin.FILE_CLASS ||
|
||||
declaration.origin == IrDeclarationOrigin.SYNTHETIC_FILE_CLASS
|
||||
)
|
||||
file.getFileClassInfo().fileClassFqName
|
||||
else
|
||||
file.fqName.child(declaration.name)
|
||||
JvmClassName.byFqNameWithoutInnerClasses(classFqn).internalName
|
||||
}
|
||||
|
||||
declaration.acceptChildren(this, data.withName(internalName))
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user