JVM_IR. Remove descriptors from FileClassLowering

This commit is contained in:
Georgy Bronnikov
2018-10-21 11:07:14 +03:00
parent 95fbe29350
commit 0a43054a92
8 changed files with 19 additions and 29 deletions
@@ -36,7 +36,7 @@ class JvmBackendContext(
irModuleFragment: IrModuleFragment, symbolTable: SymbolTable irModuleFragment: IrModuleFragment, symbolTable: SymbolTable
) : CommonBackendContext { ) : CommonBackendContext {
override val builtIns = state.module.builtIns override val builtIns = state.module.builtIns
override val declarationFactory: JvmDeclarationFactory = JvmDeclarationFactory(psiSourceManager, builtIns, state, symbolTable) override val declarationFactory: JvmDeclarationFactory = JvmDeclarationFactory(state, symbolTable)
override val sharedVariablesManager = JvmSharedVariablesManager(builtIns, irBuiltIns) override val sharedVariablesManager = JvmSharedVariablesManager(builtIns, irBuiltIns)
// TODO: inject a correct StorageManager instance, or store NotFoundClasses inside ModuleDescriptor // TODO: inject a correct StorageManager instance, or store NotFoundClasses inside ModuleDescriptor
@@ -10,8 +10,6 @@ import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
import org.jetbrains.kotlin.backend.jvm.lower.createFunctionAndMapVariables import org.jetbrains.kotlin.backend.jvm.lower.createFunctionAndMapVariables
import org.jetbrains.kotlin.backend.jvm.lower.createStaticFunctionWithReceivers import org.jetbrains.kotlin.backend.jvm.lower.createStaticFunctionWithReceivers
import org.jetbrains.kotlin.builtins.CompanionObjectMapping.isMappedIntrinsicCompanionObject import org.jetbrains.kotlin.builtins.CompanionObjectMapping.isMappedIntrinsicCompanionObject
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.codegen.descriptors.FileClassDescriptor
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
@@ -19,8 +17,6 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
import org.jetbrains.kotlin.ir.SourceManager
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
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
@@ -37,14 +33,10 @@ import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.load.java.JavaVisibilities import org.jetbrains.kotlin.load.java.JavaVisibilities
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi2ir.PsiSourceManager
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Opcodes
import java.util.* import java.util.*
class JvmDeclarationFactory( class JvmDeclarationFactory(
private val psiSourceManager: PsiSourceManager,
private val builtIns: KotlinBuiltIns,
private val state: GenerationState, private val state: GenerationState,
private val symbolTable: SymbolTable private val symbolTable: SymbolTable
) : DeclarationFactory { ) : DeclarationFactory {
@@ -67,19 +59,6 @@ class JvmDeclarationFactory(
) )
} }
fun createFileClassDescriptor(fileEntry: SourceManager.FileEntry, packageFragment: PackageFragmentDescriptor): FileClassDescriptor {
val ktFile = psiSourceManager.getKtFile(fileEntry as PsiSourceManager.PsiFileEntry)
?: throw AssertionError("Unexpected file entry: $fileEntry")
val fileClassInfo = JvmFileClassUtil.getFileClassInfoNoResolve(ktFile)
val sourceElement = KotlinSourceElement(ktFile)
return FileClassDescriptorImpl(
fileClassInfo.fileClassFqName.shortName(), packageFragment,
listOf(builtIns.anyType),
sourceElement,
Annotations.EMPTY // TODO file annotations
)
}
override fun getOuterThisField(innerClass: IrClass): IrField = override fun getOuterThisField(innerClass: IrClass): IrField =
if (!innerClass.isInner) throw AssertionError("Class is not inner: ${innerClass.dump()}") if (!innerClass.isInner) throw AssertionError("Class is not inner: ${innerClass.dump()}")
else outerThisDeclarations.getOrPut(innerClass) { else outerThisDeclarations.getOrPut(innerClass) {
@@ -70,9 +70,9 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
!isInterface(descriptor.containingDeclaration) || state.target !== JvmTarget.JVM_1_6 && descriptor.hasJvmDefaultAnnotation() !isInterface(descriptor.containingDeclaration) || state.target !== JvmTarget.JVM_1_6 && descriptor.hasJvmDefaultAnnotation()
override fun lower(irClass: IrClass) { override fun lower(irClass: IrClass) {
val classDescriptor = irClass.descriptor if (irClass.isFileClass) return
if (classDescriptor is FileClassDescriptor) return
val classDescriptor = irClass.descriptor
if (classDescriptor is DefaultImplsClassDescriptor) { if (classDescriptor is DefaultImplsClassDescriptor) {
return /*TODO?*/ return /*TODO?*/
} }
@@ -33,9 +33,9 @@ abstract class ClassLowerWithContext : FileLoweringPass, IrElementTransformer<Ir
private val irClass2Context = hashMapOf<IrClass, IrClassContext>() private val irClass2Context = hashMapOf<IrClass, IrClassContext>()
override fun lower(irFile: IrFile) { override fun lower(irFile: IrFile) {
val packageIr = irFile.declarations.singleOrNull { it.descriptor is FileClassDescriptor } val packageIr = irFile.declarations.singleOrNull { it is IrClass && it.isFileClass } as? IrClass
if (packageIr != null) { if (packageIr != null) {
visitClass(packageIr as IrClass, null) visitClass(packageIr, null)
irFile.declarations.filterNot { it == packageIr }.forEach { it.accept(this, irClass2Context[packageIr]!!) } irFile.declarations.filterNot { it == packageIr }.forEach { it.accept(this, irClass2Context[packageIr]!!) }
} else { } else {
irFile.accept(this, null) irFile.accept(this, null)
@@ -17,12 +17,20 @@
package org.jetbrains.kotlin.backend.jvm.lower package org.jetbrains.kotlin.backend.jvm.lower
import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.descriptors.WrappedClassDescriptor
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
import org.jetbrains.kotlin.psi2ir.PsiSourceManager
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
import java.util.* import java.util.*
class FileClassLowering(val context: JvmBackendContext) : FileLoweringPass { class FileClassLowering(val context: JvmBackendContext) : FileLoweringPass {
@@ -39,8 +47,7 @@ class FileClassLowering(val context: JvmBackendContext) : FileLoweringPass {
if (fileClassMembers.isEmpty()) return if (fileClassMembers.isEmpty()) return
val fileClassDescriptor = context.declarationFactory.createFileClassDescriptor(irFile.fileEntry, irFile.packageFragmentDescriptor) val irFileClass = createFileClass(irFile, fileClassMembers)
val irFileClass = IrClassImpl(0, irFile.fileEntry.maxOffset, IrDeclarationOrigin.DEFINED, fileClassDescriptor, fileClassMembers)
classes.add(irFileClass) classes.add(irFileClass)
irFile.declarations.clear() irFile.declarations.clear()
@@ -35,6 +35,7 @@ interface IrClass : IrSymbolDeclaration<IrClassSymbol>, IrDeclarationWithVisibil
val isData: Boolean val isData: Boolean
val isExternal: Boolean val isExternal: Boolean
val isInline: Boolean val isInline: Boolean
val isFileClass: Boolean
val superTypes: MutableList<IrType> val superTypes: MutableList<IrType>
@@ -44,7 +44,8 @@ class IrClassImpl(
override val isInner: Boolean, override val isInner: Boolean,
override val isData: Boolean, override val isData: Boolean,
override val isExternal: Boolean, override val isExternal: Boolean,
override val isInline: Boolean override val isInline: Boolean,
override val isFileClass: Boolean = false
) : ) :
IrDeclarationBase(startOffset, endOffset, origin), IrDeclarationBase(startOffset, endOffset, origin),
IrClass { IrClass {
@@ -66,6 +66,8 @@ class IrLazyClass(
symbol.bind(this) symbol.bind(this)
} }
override val isFileClass = false // file classes are never crated lazily
override val annotations: MutableList<IrCall> = arrayListOf() override val annotations: MutableList<IrCall> = arrayListOf()
override val descriptor: ClassDescriptor get() = symbol.descriptor override val descriptor: ClassDescriptor get() = symbol.descriptor