diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index fb258b8d31a..0653bb6125b 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -167,7 +167,7 @@ class Fir2IrClassifierStorage( regularClass.modality ?: Modality.FINAL } val irClass = regularClass.convertWithOffsets { startOffset, endOffset -> - symbolTable.declareClass(startOffset, endOffset, origin, descriptor, modality, visibility) { symbol -> + symbolTable.declareClass(descriptor) { symbol -> IrClassImpl( startOffset, endOffset, @@ -211,14 +211,12 @@ class Fir2IrClassifierStorage( val origin = IrDeclarationOrigin.DEFINED val modality = Modality.FINAL val result = anonymousObject.convertWithOffsets { startOffset, endOffset -> - symbolTable.declareClass(startOffset, endOffset, origin, descriptor, modality, visibility) { symbol -> + symbolTable.declareClass(descriptor) { symbol -> IrClassImpl( startOffset, endOffset, origin, symbol, name, // NB: for unknown reason, IR uses 'CLASS' kind for simple anonymous objects anonymousObject.classKind.takeIf { it == ClassKind.ENUM_ENTRY } ?: ClassKind.CLASS, - visibility, modality, - isCompanion = false, isInner = false, isData = false, - isExternal = false, isInline = false, isExpect = false, isFun = false + visibility, modality ).apply { metadata = FirMetadataSource.Class(anonymousObject, descriptor) descriptor.bind(this) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt index 5a9afbbcdd1..27943bc6557 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt @@ -288,14 +288,7 @@ abstract class AbstractSuspendFunctionsLowering(val co nameForCoroutineClass(irFunction), ClassKind.CLASS, irFunction.visibility, - Modality.FINAL, - isCompanion = false, - isInner = false, - isData = false, - isExternal = false, - isInline = false, - isExpect = false, - isFun = false + Modality.FINAL ).apply { d.bind(this) parent = irFunction.parent diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt index e051a448181..e6560532dd1 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt @@ -125,9 +125,7 @@ class JsSharedVariablesManager(val builtIns: IrBuiltIns, val implicitDeclaration val descriptor = WrappedClassDescriptor() val declaration = IrClassImpl( UNDEFINED_OFFSET, UNDEFINED_OFFSET, JsLoweredDeclarationOrigin.JS_CLOSURE_BOX_CLASS_DECLARATION, IrClassSymbolImpl(descriptor), - Name.identifier(boxTypeName), ClassKind.CLASS, Visibilities.PUBLIC, Modality.FINAL, - isCompanion = false, isInner = false, isData = false, isExternal = false, - isInline = false, isExpect = false, isFun = false + Name.identifier(boxTypeName), ClassKind.CLASS, Visibilities.PUBLIC, Modality.FINAL ) descriptor.bind(declaration) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/AbstractSuspendFunctionsLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/AbstractSuspendFunctionsLowering.kt index da09bbf76a9..032fdbf4e60 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/AbstractSuspendFunctionsLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/AbstractSuspendFunctionsLowering.kt @@ -231,14 +231,7 @@ abstract class AbstractSuspendFunctionsLowering(val co nameForCoroutineClass(function), ClassKind.CLASS, function.visibility, - Modality.FINAL, - isCompanion = false, - isInner = false, - isData = false, - isExternal = false, - isInline = false, - isExpect = false, - isFun = false + Modality.FINAL ).apply { d.bind(this) parent = function.parent 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 0a166d46c73..d0bd1a8789a 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 @@ -261,14 +261,7 @@ class JvmDeclarationFactory( Name.identifier(JvmAbi.DEFAULT_IMPLS_CLASS_NAME), ClassKind.CLASS, Visibilities.PUBLIC, - Modality.FINAL, - isCompanion = false, - isInner = false, - isData = false, - isExternal = false, - isInline = false, - isExpect = false, - isFun = false + Modality.FINAL ).apply { descriptor.bind(this) parent = interfaceClass 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 8f935fe7c04..682e75db569 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 @@ -101,14 +101,7 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa name = fileClassInfo.fileClassFqName.shortName(), kind = ClassKind.CLASS, visibility = if (!fileClassInfo.withJvmMultifileClass) Visibilities.PUBLIC else JavaVisibilities.PACKAGE_VISIBILITY, - modality = Modality.FINAL, - isCompanion = false, - isInner = false, - isData = false, - isExternal = false, - isInline = false, - isExpect = false, - isFun = false + modality = Modality.FINAL ).apply { descriptor.bind(this) superTypes += context.irBuiltIns.anyType diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt index 155e98e1fd2..b466cf9c939 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.backend.common.CodegenUtil import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl import org.jetbrains.kotlin.ir.descriptors.IrImplementingDelegateDescriptorImpl import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.mapValueParameters @@ -80,11 +81,16 @@ class ClassGenerator( val startOffset = ktClassOrObject.getStartOffsetOfClassDeclarationOrNull() ?: ktClassOrObject.pureStartOffset val endOffset = ktClassOrObject.pureEndOffset val visibility = visibility_ ?: classDescriptor.visibility + val modality = getEffectiveModality(ktClassOrObject, classDescriptor) - return context.symbolTable.declareClass( - startOffset, endOffset, IrDeclarationOrigin.DEFINED, classDescriptor, - getEffectiveModality(ktClassOrObject, classDescriptor), visibility - ).buildWithScope { irClass -> + return context.symbolTable.declareClass(classDescriptor) { + IrClassImpl( + startOffset, endOffset, IrDeclarationOrigin.DEFINED, it, + classDescriptor, + context.symbolTable.nameProvider.nameForDeclaration(classDescriptor), + visibility = visibility, modality = modality, + ).apply { metadata = MetadataSource.Class(it.descriptor) } + }.buildWithScope { irClass -> declarationGenerator.generateGlobalTypeParametersDeclarations(irClass, classDescriptor.declaredTypeParameters) irClass.superTypes = classDescriptor.typeConstructor.supertypes.map { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt index 282ca9bbb7c..94e616dd9d9 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt @@ -75,7 +75,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) { fun generateClass(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: ClassDescriptor, symbol: IrClassSymbol): IrClass { - val irClass = IrClassImpl(startOffset, endOffset, origin, symbol) + val irClass = IrClassImpl(startOffset, endOffset, origin, symbol, descriptor) symbolTable.withScope(descriptor) { irClass.metadata = MetadataSource.Class(descriptor) 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 8c927f54130..9eb3d42f3ec 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 @@ -16,10 +16,7 @@ package org.jetbrains.kotlin.ir.declarations.impl -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.carriers.ClassCarrier import org.jetbrains.kotlin.ir.symbols.IrClassSymbol @@ -38,43 +35,65 @@ class IrClassImpl( endOffset: Int, origin: IrDeclarationOrigin, override val symbol: IrClassSymbol, - override val name: Name = symbol.descriptor.name, - override val kind: ClassKind = symbol.descriptor.kind, - visibility: Visibility = symbol.descriptor.visibility, - modality: Modality = symbol.descriptor.modality, - override val isCompanion: Boolean = symbol.descriptor.isCompanionObject, - override val isInner: Boolean = symbol.descriptor.isInner, - override val isData: Boolean = symbol.descriptor.isData, - override val isExternal: Boolean = symbol.descriptor.isEffectivelyExternal(), - override val isInline: Boolean = symbol.descriptor.isInline, - override val isExpect: Boolean = symbol.descriptor.isExpect, - override val isFun: Boolean = symbol.descriptor.isFun + override val name: Name, + override val kind: ClassKind, + visibility: Visibility, + modality: Modality, + override val isCompanion: Boolean = false, + override val isInner: Boolean = false, + override val isData: Boolean = false, + override val isExternal: Boolean = false, + override val isInline: Boolean = false, + override val isExpect: Boolean = false, + override val isFun: Boolean = false ) : IrDeclarationBase(startOffset, endOffset, origin), IrClass, ClassCarrier { + @Deprecated( + "This constructor is left for native compilation purpose only. " + + "It takes class attributes from symbol.descriptor " + + "Please either provide class attributes or its descriptor explicitly" + ) + constructor( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrClassSymbol + ) : this( + startOffset, endOffset, origin, symbol, + name = symbol.descriptor.name, + kind = symbol.descriptor.kind, + visibility = symbol.descriptor.visibility, + modality = symbol.descriptor.modality, + isCompanion = symbol.descriptor.isCompanionObject, + isInner = symbol.descriptor.isInner, + isData = symbol.descriptor.isData, + isExternal = symbol.descriptor.isExternal, + isInline = symbol.descriptor.isInline, + isExpect = symbol.descriptor.isExpect, + isFun = symbol.descriptor.isFun + ) + constructor( startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, symbol: IrClassSymbol, - modality: Modality = symbol.descriptor.modality, - visibility: Visibility = symbol.descriptor.visibility - ) : - this( - startOffset, endOffset, origin, symbol, - symbol.descriptor.name, symbol.descriptor.kind, - visibility, - modality = modality, - isCompanion = symbol.descriptor.isCompanionObject, - isInner = symbol.descriptor.isInner, - isData = symbol.descriptor.isData, - isExternal = symbol.descriptor.isEffectivelyExternal(), - isInline = symbol.descriptor.isInline, - isExpect = symbol.descriptor.isExpect, - isFun = symbol.descriptor.isFun - ) + descriptor: ClassDescriptor, + name: Name = descriptor.name, + visibility: Visibility = descriptor.visibility, + modality: Modality = descriptor.modality + ) : this( + startOffset, endOffset, origin, symbol, + name, kind = descriptor.kind, + visibility = visibility, modality = modality, + isCompanion = descriptor.isCompanionObject, isInner = descriptor.isInner, + isData = descriptor.isData, isExternal = descriptor.isEffectivelyExternal(), + isInline = descriptor.isInline, isExpect = descriptor.isExpect, + isFun = descriptor.isFun + ) init { symbol.bind(this) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrFunctionFactory.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrFunctionFactory.kt index 55914026bd0..c11ef13849d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrFunctionFactory.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrFunctionFactory.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.builtins.KOTLIN_REFLECT_FQ_NAME import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation -import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol @@ -40,7 +39,7 @@ abstract class IrAbstractFunctionFactory { fun functionN(n: Int) = functionN(n) { callback -> val descriptor = functionClassDescriptor(n) - declareClass(offset, offset, classOrigin, descriptor) { symbol -> + declareClass(descriptor) { symbol -> callback(symbol) } } @@ -48,7 +47,7 @@ abstract class IrAbstractFunctionFactory { fun kFunctionN(n: Int): IrClass { return kFunctionN(n) { callback -> val descriptor = kFunctionClassDescriptor(n) - declareClass(offset, offset, classOrigin, descriptor) { symbol -> + declareClass(descriptor) { symbol -> callback(symbol) } } @@ -56,14 +55,14 @@ abstract class IrAbstractFunctionFactory { fun suspendFunctionN(n: Int): IrClass = suspendFunctionN(n) { callback -> val descriptor = suspendFunctionClassDescriptor(n) - declareClass(offset, offset, classOrigin, descriptor) { symbol -> + declareClass(descriptor) { symbol -> callback(symbol) } } fun kSuspendFunctionN(n: Int): IrClass = kSuspendFunctionN(n) { callback -> val descriptor = kSuspendFunctionClassDescriptor(n) - declareClass(offset, offset, classOrigin, descriptor) { symbol -> + declareClass(descriptor) { symbol -> callback(symbol) } } @@ -270,7 +269,7 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa private fun FunctionClassDescriptor.createFunctionClass(): IrClass { val s = symbolTable.referenceClass(this) if (s.isBound) return s.owner - return symbolTable.declareClass(offset, offset, classOrigin, this, modality) { + return symbolTable.declareClass(this) { val factory = FunctionDescriptorFactory.RealDescriptorFactory(this, symbolTable) when (functionKind) { FunctionClassDescriptor.Kind.Function -> @@ -422,14 +421,7 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa ): IrClass { val name = functionClassName(isK, isSuspend, n) val klass = IrClassImpl( - offset, offset, classOrigin, symbol, Name.identifier(name), ClassKind.INTERFACE, Visibilities.PUBLIC, Modality.ABSTRACT, - isCompanion = false, - isInner = false, - isData = false, - isExternal = false, - isInline = false, - isExpect = false, - isFun = false + offset, offset, classOrigin, symbol, Name.identifier(name), ClassKind.INTERFACE, Visibilities.PUBLIC, Modality.ABSTRACT ) val r = klass.createTypeParameters(n, descriptorFactory) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt index 4074386d3fb..92a983f83f8 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt @@ -271,7 +271,7 @@ class DeclarationStubGenerator( return referenceClass.owner } val origin = computeOrigin(descriptor) - return symbolTable.declareClass(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor) { + return symbolTable.declareClass(descriptor) { IrLazyClass( UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, it, descriptor, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index 920c99f4242..99d9ffb23f2 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -88,7 +88,7 @@ interface ReferenceSymbolTable { open class SymbolTable( val signaturer: IdSignatureComposer, - private val nameProvider: NameProvider = NameProvider.DEFAULT + val nameProvider: NameProvider = NameProvider.DEFAULT ) : ReferenceSymbolTable { @Suppress("LeakingThis") @@ -394,15 +394,8 @@ open class SymbolTable( } fun declareClass( - startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: ClassDescriptor, - modality: Modality = descriptor.modality, visibility: Visibility = descriptor.visibility, - classFactory: (IrClassSymbol) -> IrClass = { - IrClassImpl( - startOffset, endOffset, origin, it, - nameProvider.nameForDeclaration(descriptor), - visibility = visibility, modality = modality, - ).apply { metadata = MetadataSource.Class(it.descriptor) } - } + descriptor: ClassDescriptor, + classFactory: (IrClassSymbol) -> IrClass ): IrClass { return classSymbolTable.declare( descriptor,