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
) : CommonBackendContext {
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)
// 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.createStaticFunctionWithReceivers
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.KotlinTypeMapper
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.PropertyDescriptorImpl
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.declarations.*
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.JvmAbi
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 java.util.*
class JvmDeclarationFactory(
private val psiSourceManager: PsiSourceManager,
private val builtIns: KotlinBuiltIns,
private val state: GenerationState,
private val symbolTable: SymbolTable
) : 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 =
if (!innerClass.isInner) throw AssertionError("Class is not inner: ${innerClass.dump()}")
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()
override fun lower(irClass: IrClass) {
val classDescriptor = irClass.descriptor
if (classDescriptor is FileClassDescriptor) return
if (irClass.isFileClass) return
val classDescriptor = irClass.descriptor
if (classDescriptor is DefaultImplsClassDescriptor) {
return /*TODO?*/
}
@@ -33,9 +33,9 @@ abstract class ClassLowerWithContext : FileLoweringPass, IrElementTransformer<Ir
private val irClass2Context = hashMapOf<IrClass, IrClassContext>()
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) {
visitClass(packageIr as IrClass, null)
visitClass(packageIr, null)
irFile.declarations.filterNot { it == packageIr }.forEach { it.accept(this, irClass2Context[packageIr]!!) }
} else {
irFile.accept(this, null)
@@ -17,12 +17,20 @@
package org.jetbrains.kotlin.backend.jvm.lower
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.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.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFile
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.*
class FileClassLowering(val context: JvmBackendContext) : FileLoweringPass {
@@ -39,8 +47,7 @@ class FileClassLowering(val context: JvmBackendContext) : FileLoweringPass {
if (fileClassMembers.isEmpty()) return
val fileClassDescriptor = context.declarationFactory.createFileClassDescriptor(irFile.fileEntry, irFile.packageFragmentDescriptor)
val irFileClass = IrClassImpl(0, irFile.fileEntry.maxOffset, IrDeclarationOrigin.DEFINED, fileClassDescriptor, fileClassMembers)
val irFileClass = createFileClass(irFile, fileClassMembers)
classes.add(irFileClass)
irFile.declarations.clear()
@@ -35,6 +35,7 @@ interface IrClass : IrSymbolDeclaration<IrClassSymbol>, IrDeclarationWithVisibil
val isData: Boolean
val isExternal: Boolean
val isInline: Boolean
val isFileClass: Boolean
val superTypes: MutableList<IrType>
@@ -44,7 +44,8 @@ class IrClassImpl(
override val isInner: Boolean,
override val isData: Boolean,
override val isExternal: Boolean,
override val isInline: Boolean
override val isInline: Boolean,
override val isFileClass: Boolean = false
) :
IrDeclarationBase(startOffset, endOffset, origin),
IrClass {
@@ -66,6 +66,8 @@ class IrLazyClass(
symbol.bind(this)
}
override val isFileClass = false // file classes are never crated lazily
override val annotations: MutableList<IrCall> = arrayListOf()
override val descriptor: ClassDescriptor get() = symbol.descriptor