diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt index 6b17cbbdb96..228ff9cfc13 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt @@ -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 diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt index 0d95cc13445..a4097eba697 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt @@ -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) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt index 3c259d20284..8005bd7e22d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt @@ -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?*/ } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ClassLowerWithContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ClassLowerWithContext.kt index 6c7ff801519..872ae227232 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ClassLowerWithContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ClassLowerWithContext.kt @@ -33,9 +33,9 @@ abstract class ClassLowerWithContext : FileLoweringPass, IrElementTransformer() 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) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt index b8d3c6b561a..f34adbc8851 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt @@ -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() diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt index bbf7d75e4ef..a852ec79d6d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt @@ -35,6 +35,7 @@ interface IrClass : IrSymbolDeclaration, IrDeclarationWithVisibil val isData: Boolean val isExternal: Boolean val isInline: Boolean + val isFileClass: Boolean val superTypes: MutableList diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt index 9f488cd01d9..5884b8e042d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt @@ -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 { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt index d6510bdec68..3721c529ab3 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt @@ -66,6 +66,8 @@ class IrLazyClass( symbol.bind(this) } + override val isFileClass = false // file classes are never crated lazily + override val annotations: MutableList = arrayListOf() override val descriptor: ClassDescriptor get() = symbol.descriptor