[JVM IR] Make file classes with all private members package-private
This commit is contained in:
committed by
Alexander Udalov
parent
032c64669c
commit
77180a5b13
+21
-11
@@ -22,22 +22,20 @@ import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
||||
import org.jetbrains.kotlin.config.JvmAnalysisFlags
|
||||
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.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
|
||||
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.ir.util.*
|
||||
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities
|
||||
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
|
||||
import org.jetbrains.kotlin.psi2ir.PsiSourceManager
|
||||
import org.jetbrains.kotlin.resolve.inline.INLINE_ONLY_ANNOTATION_FQ_NAME
|
||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||
import java.util.*
|
||||
|
||||
@@ -61,7 +59,8 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
|
||||
|
||||
irFile.declarations.forEach {
|
||||
when (it) {
|
||||
is IrScript -> {}
|
||||
is IrScript -> {
|
||||
}
|
||||
is IrClass -> classes.add(it)
|
||||
else -> fileClassMembers.add(it)
|
||||
}
|
||||
@@ -79,19 +78,27 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
|
||||
|
||||
private fun createFileClass(irFile: IrFile, fileClassMembers: List<IrDeclaration>): IrClass {
|
||||
val fileEntry = irFile.fileEntry
|
||||
val fileClassInfo: JvmFileClassInfo?
|
||||
when (fileEntry) {
|
||||
val fileClassInfo = when (fileEntry) {
|
||||
is PsiSourceManager.PsiFileEntry -> {
|
||||
val ktFile = context.psiSourceManager.getKtFile(fileEntry)
|
||||
?: throw AssertionError("Unexpected file entry: $fileEntry")
|
||||
fileClassInfo = JvmFileClassUtil.getFileClassInfoNoResolve(ktFile)
|
||||
JvmFileClassUtil.getFileClassInfoNoResolve(ktFile)
|
||||
}
|
||||
is NaiveSourceBasedFileEntryImpl -> {
|
||||
fileClassInfo = JvmSimpleFileClassInfo(PackagePartClassUtils.getPackagePartFqName(irFile.fqName, fileEntry.name), false)
|
||||
JvmSimpleFileClassInfo(PackagePartClassUtils.getPackagePartFqName(irFile.fqName, fileEntry.name), false)
|
||||
}
|
||||
else -> error("unknown kind of file entry: $fileEntry")
|
||||
}
|
||||
val isMultifilePart = fileClassInfo.withJvmMultifileClass
|
||||
|
||||
val onlyPrivateDeclarationsAndFeatureIsEnabled =
|
||||
context.state.languageVersionSettings.supportsFeature(LanguageFeature.PackagePrivateFileClassesWithAllPrivateMembers) && fileClassMembers
|
||||
.all {
|
||||
val isPrivate = it is IrDeclarationWithVisibility && DescriptorVisibilities.isPrivate(it.visibility)
|
||||
val isInlineOnly = it.hasAnnotation(INLINE_ONLY_ANNOTATION_FQ_NAME)
|
||||
isPrivate || isInlineOnly
|
||||
}
|
||||
|
||||
return IrClassImpl(
|
||||
0, fileEntry.maxOffset,
|
||||
if (!isMultifilePart || context.state.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts))
|
||||
@@ -99,7 +106,10 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
|
||||
symbol = IrClassSymbolImpl(),
|
||||
name = fileClassInfo.fileClassFqName.shortName(),
|
||||
kind = ClassKind.CLASS,
|
||||
visibility = if (!isMultifilePart) DescriptorVisibilities.PUBLIC else JavaDescriptorVisibilities.PACKAGE_VISIBILITY,
|
||||
visibility = if (isMultifilePart || onlyPrivateDeclarationsAndFeatureIsEnabled)
|
||||
JavaDescriptorVisibilities.PACKAGE_VISIBILITY
|
||||
else
|
||||
DescriptorVisibilities.PUBLIC,
|
||||
modality = Modality.FINAL
|
||||
).apply {
|
||||
superTypes = listOf(context.irBuiltIns.anyType)
|
||||
|
||||
Reference in New Issue
Block a user