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.common.phaser.makeIrModulePhase
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.AsmUtil
|
||||||
|
import org.jetbrains.kotlin.config.JvmAnalysisFlags
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
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.JvmFileClassInfo
|
||||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
||||||
import org.jetbrains.kotlin.fileClasses.JvmSimpleFileClassInfo
|
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.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
|
||||||
import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor
|
import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.util.NaiveSourceBasedFileEntryImpl
|
import org.jetbrains.kotlin.ir.util.NaiveSourceBasedFileEntryImpl
|
||||||
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
|
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.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.psi2ir.PsiSourceManager
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||||
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
|
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
|
||||||
import java.io.File
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
internal val fileClassPhase = makeIrModulePhase(
|
internal val fileClassPhase = makeIrModulePhase(
|
||||||
@@ -97,11 +95,12 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
|
|||||||
}
|
}
|
||||||
return IrClassImpl(
|
return IrClassImpl(
|
||||||
0, fileEntry.maxOffset,
|
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),
|
symbol = IrClassSymbolImpl(descriptor),
|
||||||
name = fileClassInfo.fileClassFqName.shortName(),
|
name = fileClassInfo.fileClassFqName.shortName(),
|
||||||
kind = ClassKind.CLASS,
|
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,
|
modality = Modality.FINAL,
|
||||||
isCompanion = false,
|
isCompanion = false,
|
||||||
isInner = false,
|
isInner = false,
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ interface IrDeclarationOrigin {
|
|||||||
object MOVED_EXTENSION_RECEIVER : IrDeclarationOriginImpl("MOVED_EXTENSION_RECEIVER")
|
object MOVED_EXTENSION_RECEIVER : IrDeclarationOriginImpl("MOVED_EXTENSION_RECEIVER")
|
||||||
|
|
||||||
object FILE_CLASS : IrDeclarationOriginImpl("FILE_CLASS")
|
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_DATA_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_DATA_CLASS_MEMBER")
|
||||||
object GENERATED_INLINE_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_INLINE_CLASS_MEMBER")
|
object GENERATED_INLINE_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_INLINE_CLASS_MEMBER")
|
||||||
object LOCAL_FUNCTION_FOR_LAMBDA : IrDeclarationOriginImpl("LOCAL_FUNCTION_FOR_LAMBDA")
|
object LOCAL_FUNCTION_FOR_LAMBDA : IrDeclarationOriginImpl("LOCAL_FUNCTION_FOR_LAMBDA")
|
||||||
|
|||||||
@@ -672,4 +672,4 @@ fun SymbolTable.findOrDeclareExternalPackageFragment(descriptor: PackageFragment
|
|||||||
}.owner
|
}.owner
|
||||||
|
|
||||||
val IrDeclaration.isFileClass: Boolean
|
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 access flags 0x31
|
||||||
|
// 1 public final class Test
|
||||||
|
|
||||||
/*ACC_SYNTHETIC ACC_FINAL ACC_SUPER */
|
/* ACC_SYNTHETIC ACC_FINAL ACC_SUPER */
|
||||||
// 1 access flags 0x1030
|
// 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");
|
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")
|
@TestMetadata("inlineFromOtherModule.kt")
|
||||||
public void testInlineFromOtherModule() throws Exception {
|
public void testInlineFromOtherModule() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeText/inlineFromOtherModule.kt");
|
runTest("compiler/testData/codegen/bytecodeText/inlineFromOtherModule.kt");
|
||||||
|
|||||||
+5
@@ -114,6 +114,11 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest {
|
|||||||
runTest("compiler/testData/codegen/bytecodeText/falseSmartCast.kt");
|
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")
|
@TestMetadata("inlineFromOtherModule.kt")
|
||||||
public void testInlineFromOtherModule() throws Exception {
|
public void testInlineFromOtherModule() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeText/inlineFromOtherModule.kt");
|
runTest("compiler/testData/codegen/bytecodeText/inlineFromOtherModule.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user