JVM IR: Create non-synthetic multifile parts for -Xmultifile-parts-inherit
This commit is contained in:
committed by
Alexander Udalov
parent
9db82bfcc8
commit
6d23e50142
+5
-6
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user