[IR] Unbind construction methods of IrClassImpl from symbol.descriptor
This commit is contained in:
@@ -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)
|
||||
|
||||
+1
-8
@@ -288,14 +288,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(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
|
||||
|
||||
+1
-3
@@ -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)
|
||||
|
||||
+1
-8
@@ -231,14 +231,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(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
|
||||
|
||||
+1
-8
@@ -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
|
||||
|
||||
+1
-8
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
@@ -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<ClassCarrier>(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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user