From 9db82bfcc81fc49f5cb266bd1769620c5a2bcaf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Fri, 7 Feb 2020 10:20:46 +0100 Subject: [PATCH] JVM IR: Create package private synthetic multi file part classes --- .../src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt | 2 +- .../backend/common/lower/SingleAbstractMethodLowering.kt | 2 +- .../org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt | 2 +- .../kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt | 3 ++- .../kotlin/backend/jvm/lower/CallableReferenceLowering.kt | 2 +- .../jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt | 5 +++-- .../kotlin/backend/jvm/lower/MainMethodGenerationLowering.kt | 3 ++- .../jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt | 1 + .../jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt | 2 +- .../ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt | 3 +++ .../codegen/bytecodeText/superFlagInMultiFileFacade.kt | 1 - 11 files changed, 16 insertions(+), 10 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt index aea1cce20de..6d5349d11d2 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt @@ -393,7 +393,7 @@ val IrDeclaration.isTopLevel: Boolean get() { if (parent is IrPackageFragment) return true val parentClass = parent as? IrClass - return parentClass?.origin == IrDeclarationOrigin.FILE_CLASS && parentClass.parent is IrPackageFragment + return parentClass?.isFileClass == true && parentClass.parent is IrPackageFragment } fun Scope.createTemporaryVariableWithWrappedDescriptor( diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SingleAbstractMethodLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SingleAbstractMethodLowering.kt index ee0e9844c7f..0c23064fd9d 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SingleAbstractMethodLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SingleAbstractMethodLowering.kt @@ -65,7 +65,7 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) : abstract fun getSuperTypeForWrapper(typeOperand: IrType): IrType override fun lower(irFile: IrFile) { - enclosingContainer = irFile.declarations.filterIsInstance().find { it.origin == IrDeclarationOrigin.FILE_CLASS } + enclosingContainer = irFile.declarations.filterIsInstance().find { it.isFileClass } ?: irFile irFile.transformChildrenVoid() diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt index cf12f809525..512aec2c8b0 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt @@ -266,7 +266,7 @@ open class ClassCodegen protected constructor( val entry = irClass.fileParent.fileEntry if (entry is MultifileFacadeFileEntry) { val partInternalNames = entry.partFiles.mapNotNull { partFile -> - val fileClass = partFile.declarations.singleOrNull { it.origin == IrDeclarationOrigin.FILE_CLASS } as IrClass? + val fileClass = partFile.declarations.singleOrNull { it.isFileClass } as IrClass? if (fileClass != null) typeMapper.mapClass(fileClass).internalName else null } MultifileClassCodegenImpl.writeMetadata( diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt index f64c59f5d2a..a81dd7e9d5c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.types.classOrNull import org.jetbrains.kotlin.ir.types.classifierOrNull import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable +import org.jetbrains.kotlin.ir.util.isFileClass import org.jetbrains.kotlin.lexer.KtSingleValueToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqName @@ -209,7 +210,7 @@ class IrIntrinsicMethods(val irBuiltIns: IrBuiltIns, val symbols: JvmSymbols) { private fun IrFunctionSymbol.toKey(): Key? { val parent = owner.parent val ownerFqName = when { - parent is IrClass && parent.origin == IrDeclarationOrigin.FILE_CLASS -> + parent is IrClass && parent.isFileClass -> (parent.parent as IrPackageFragment).fqName parent is IrClass -> parent.fqNameWhenAvailable ?: return null parent is IrPackageFragment -> parent.fqName diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt index cf748bdc3c1..767549ee173 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt @@ -374,7 +374,7 @@ internal class CallableReferenceLowering(private val context: JvmBackendContext) // The non-IR backend generates equally meaningless "kotlin/KotlinPackage" in this case (see KT-17151). val kClass = kClassReference((irContainer as? IrClass)?.defaultType ?: context.irBuiltIns.anyNType) - if ((irContainer as? IrClass)?.origin != IrDeclarationOrigin.FILE_CLASS && irContainer !is IrPackageFragment) + if ((irContainer as? IrClass)?.isFileClass != true && irContainer !is IrPackageFragment) return kClass return irCall(context.ir.symbols.getOrCreateKotlinPackage).apply { 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 1909d9d693f..c84e95fe287 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 @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fileClasses.JvmFileClassInfo import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.fileClasses.JvmSimpleFileClassInfo +import org.jetbrains.kotlin.ir.builders.declarations.buildClass import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor @@ -96,11 +97,11 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa } return IrClassImpl( 0, fileEntry.maxOffset, - IrDeclarationOrigin.FILE_CLASS, + if (!fileClassInfo.withJvmMultifileClass) IrDeclarationOrigin.FILE_CLASS else IrDeclarationOrigin.MULTIFILE_PART_CLASS, symbol = IrClassSymbolImpl(descriptor), name = fileClassInfo.fileClassFqName.shortName(), kind = ClassKind.CLASS, - visibility = Visibilities.PUBLIC, + visibility = if (!fileClassInfo.withJvmMultifileClass) Visibilities.PUBLIC else Visibilities.PRIVATE, modality = Modality.FINAL, isCompanion = false, isInner = false, diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MainMethodGenerationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MainMethodGenerationLowering.kt index 7c52e777f75..27378e33595 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MainMethodGenerationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MainMethodGenerationLowering.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.functions +import org.jetbrains.kotlin.ir.util.isFileClass import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance @@ -40,7 +41,7 @@ internal class MainMethodGenerationLowering(val context: JvmBackendContext) : Cl override fun lower(irClass: IrClass) { if (!context.configuration.languageVersionSettings.supportsFeature(LanguageFeature.ExtendedMainConvention)) return - if (irClass.origin != IrDeclarationOrigin.FILE_CLASS) return + if (!irClass.isFileClass) return val parameterlessMain = irClass.functions.find { it.isParameterlessMainMethod() } ?: return diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt index d30fe6b5b17..77f0b90b6db 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt @@ -37,6 +37,7 @@ interface IrDeclarationOrigin { object MOVED_EXTENSION_RECEIVER : IrDeclarationOriginImpl("MOVED_EXTENSION_RECEIVER") object FILE_CLASS : IrDeclarationOriginImpl("FILE_CLASS") + object MULTIFILE_PART_CLASS : IrDeclarationOriginImpl("MULTIFILE_PART_CLASS", isSynthetic = true) object GENERATED_DATA_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_DATA_CLASS_MEMBER") object GENERATED_INLINE_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_INLINE_CLASS_MEMBER") object LOCAL_FUNCTION_FOR_LAMBDA : IrDeclarationOriginImpl("LOCAL_FUNCTION_FOR_LAMBDA") diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt index d9bce58713f..9d4e734a367 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt @@ -1069,7 +1069,7 @@ open class WrappedFieldDescriptor( private fun getContainingDeclaration(declaration: IrDeclarationWithName): DeclarationDescriptor { val parent = declaration.parent val parentDescriptor = (parent as IrSymbolOwner).symbol.descriptor - return if (parent is IrClass && parent.origin == IrDeclarationOrigin.FILE_CLASS) { + return if (parent is IrClass && parent.isFileClass) { // JVM IR adds facade classes for IR of functions/properties loaded both from sources and dependencies. However, these shouldn't // exist in the descriptor hierarchy, since this is what the old backend (dealing with descriptors) expects. parentDescriptor.containingDeclaration!! diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 90ae80796f6..dac12f974e4 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -670,3 +670,6 @@ fun SymbolTable.findOrDeclareExternalPackageFragment(descriptor: PackageFragment declareExternalPackageFragment(descriptor) } }.owner + +val IrDeclaration.isFileClass: Boolean + get() = origin == IrDeclarationOrigin.FILE_CLASS || origin == IrDeclarationOrigin.MULTIFILE_PART_CLASS diff --git a/compiler/testData/codegen/bytecodeText/superFlagInMultiFileFacade.kt b/compiler/testData/codegen/bytecodeText/superFlagInMultiFileFacade.kt index 861d1ea64a9..4c5b29c5e83 100644 --- a/compiler/testData/codegen/bytecodeText/superFlagInMultiFileFacade.kt +++ b/compiler/testData/codegen/bytecodeText/superFlagInMultiFileFacade.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR @file:kotlin.jvm.JvmMultifileClass @file:kotlin.jvm.JvmName("Test")