JVM IR: Create non-synthetic multifile parts for -Xmultifile-parts-inherit

This commit is contained in:
Steven Schäfer
2020-02-10 11:57:17 +01:00
committed by Alexander Udalov
parent 9db82bfcc8
commit 6d23e50142
7 changed files with 38 additions and 11 deletions
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclaration
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.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
@@ -28,20 +29,17 @@ 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
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
import org.jetbrains.kotlin.ir.util.NaiveSourceBasedFileEntryImpl
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
import org.jetbrains.kotlin.load.java.JavaVisibilities
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi2ir.PsiSourceManager
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
import java.io.File
import java.util.*
internal val fileClassPhase = makeIrModulePhase(
@@ -97,11 +95,12 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
}
return IrClassImpl(
0, fileEntry.maxOffset,
if (!fileClassInfo.withJvmMultifileClass) IrDeclarationOrigin.FILE_CLASS else IrDeclarationOrigin.MULTIFILE_PART_CLASS,
if (!fileClassInfo.withJvmMultifileClass || 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) Visibilities.PUBLIC else Visibilities.PRIVATE,
visibility = if (!fileClassInfo.withJvmMultifileClass) Visibilities.PUBLIC else JavaVisibilities.PACKAGE_VISIBILITY,
modality = Modality.FINAL,
isCompanion = false,
isInner = false,
@@ -37,7 +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 SYNTHETIC_FILE_CLASS : IrDeclarationOriginImpl("SYNTHETIC_FILE_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")
@@ -672,4 +672,4 @@ fun SymbolTable.findOrDeclareExternalPackageFragment(descriptor: PackageFragment
}.owner
val IrDeclaration.isFileClass: Boolean
get() = origin == IrDeclarationOrigin.FILE_CLASS || origin == IrDeclarationOrigin.MULTIFILE_PART_CLASS
get() = origin == IrDeclarationOrigin.FILE_CLASS || origin == IrDeclarationOrigin.SYNTHETIC_FILE_CLASS
@@ -0,0 +1,16 @@
// !INHERIT_MULTIFILE_PARTS
@file:kotlin.jvm.JvmMultifileClass
@file:kotlin.jvm.JvmName("Test")
fun foo() {
}
/* ACC_PUBLIC ACC_FINAL ACC_SUPER */
// 1 access flags 0x31
// 1 public final class Test extends Test__FlagsInMultiFileInheritKt
/* ACC_SUPER */
// 1 access flags 0x20
// 1 class Test__FlagsInMultiFileInheritKt
@@ -6,8 +6,10 @@ fun foo() {
}
/*ACC_PUBLIC ACC_FINAL ACC_SUPER */
/* ACC_PUBLIC ACC_FINAL ACC_SUPER */
// 1 access flags 0x31
// 1 public final class Test
/*ACC_SYNTHETIC ACC_FINAL ACC_SUPER */
// 1 access flags 0x1030
/* ACC_SYNTHETIC ACC_FINAL ACC_SUPER */
// 1 access flags 0x1030
// 1 final synthetic class Test__SuperFlagInMultiFileFacadeKt
@@ -114,6 +114,11 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
runTest("compiler/testData/codegen/bytecodeText/falseSmartCast.kt");
}
@TestMetadata("flagsInMultiFileInherit.kt")
public void testFlagsInMultiFileInherit() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/flagsInMultiFileInherit.kt");
}
@TestMetadata("inlineFromOtherModule.kt")
public void testInlineFromOtherModule() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/inlineFromOtherModule.kt");
@@ -114,6 +114,11 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest {
runTest("compiler/testData/codegen/bytecodeText/falseSmartCast.kt");
}
@TestMetadata("flagsInMultiFileInherit.kt")
public void testFlagsInMultiFileInherit() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/flagsInMultiFileInherit.kt");
}
@TestMetadata("inlineFromOtherModule.kt")
public void testInlineFromOtherModule() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/inlineFromOtherModule.kt");