[IR] Unbind construction methods of IrClassImpl from symbol.descriptor

This commit is contained in:
Mikhail Glukhikh
2020-05-18 15:31:21 +03:00
parent 9e807ebb89
commit a7d514a0a9
12 changed files with 79 additions and 101 deletions
@@ -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)
@@ -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
@@ -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)
@@ -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
@@ -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
@@ -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 {
@@ -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,