[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 regularClass.modality ?: Modality.FINAL
} }
val irClass = regularClass.convertWithOffsets { startOffset, endOffset -> val irClass = regularClass.convertWithOffsets { startOffset, endOffset ->
symbolTable.declareClass(startOffset, endOffset, origin, descriptor, modality, visibility) { symbol -> symbolTable.declareClass(descriptor) { symbol ->
IrClassImpl( IrClassImpl(
startOffset, startOffset,
endOffset, endOffset,
@@ -211,14 +211,12 @@ class Fir2IrClassifierStorage(
val origin = IrDeclarationOrigin.DEFINED val origin = IrDeclarationOrigin.DEFINED
val modality = Modality.FINAL val modality = Modality.FINAL
val result = anonymousObject.convertWithOffsets { startOffset, endOffset -> val result = anonymousObject.convertWithOffsets { startOffset, endOffset ->
symbolTable.declareClass(startOffset, endOffset, origin, descriptor, modality, visibility) { symbol -> symbolTable.declareClass(descriptor) { symbol ->
IrClassImpl( IrClassImpl(
startOffset, endOffset, origin, symbol, name, startOffset, endOffset, origin, symbol, name,
// NB: for unknown reason, IR uses 'CLASS' kind for simple anonymous objects // NB: for unknown reason, IR uses 'CLASS' kind for simple anonymous objects
anonymousObject.classKind.takeIf { it == ClassKind.ENUM_ENTRY } ?: ClassKind.CLASS, anonymousObject.classKind.takeIf { it == ClassKind.ENUM_ENTRY } ?: ClassKind.CLASS,
visibility, modality, visibility, modality
isCompanion = false, isInner = false, isData = false,
isExternal = false, isInline = false, isExpect = false, isFun = false
).apply { ).apply {
metadata = FirMetadataSource.Class(anonymousObject, descriptor) metadata = FirMetadataSource.Class(anonymousObject, descriptor)
descriptor.bind(this) descriptor.bind(this)
@@ -288,14 +288,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
nameForCoroutineClass(irFunction), nameForCoroutineClass(irFunction),
ClassKind.CLASS, ClassKind.CLASS,
irFunction.visibility, irFunction.visibility,
Modality.FINAL, Modality.FINAL
isCompanion = false,
isInner = false,
isData = false,
isExternal = false,
isInline = false,
isExpect = false,
isFun = false
).apply { ).apply {
d.bind(this) d.bind(this)
parent = irFunction.parent parent = irFunction.parent
@@ -125,9 +125,7 @@ class JsSharedVariablesManager(val builtIns: IrBuiltIns, val implicitDeclaration
val descriptor = WrappedClassDescriptor() val descriptor = WrappedClassDescriptor()
val declaration = IrClassImpl( val declaration = IrClassImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, JsLoweredDeclarationOrigin.JS_CLOSURE_BOX_CLASS_DECLARATION, IrClassSymbolImpl(descriptor), UNDEFINED_OFFSET, UNDEFINED_OFFSET, JsLoweredDeclarationOrigin.JS_CLOSURE_BOX_CLASS_DECLARATION, IrClassSymbolImpl(descriptor),
Name.identifier(boxTypeName), ClassKind.CLASS, Visibilities.PUBLIC, Modality.FINAL, Name.identifier(boxTypeName), ClassKind.CLASS, Visibilities.PUBLIC, Modality.FINAL
isCompanion = false, isInner = false, isData = false, isExternal = false,
isInline = false, isExpect = false, isFun = false
) )
descriptor.bind(declaration) descriptor.bind(declaration)
@@ -231,14 +231,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
nameForCoroutineClass(function), nameForCoroutineClass(function),
ClassKind.CLASS, ClassKind.CLASS,
function.visibility, function.visibility,
Modality.FINAL, Modality.FINAL
isCompanion = false,
isInner = false,
isData = false,
isExternal = false,
isInline = false,
isExpect = false,
isFun = false
).apply { ).apply {
d.bind(this) d.bind(this)
parent = function.parent parent = function.parent
@@ -261,14 +261,7 @@ class JvmDeclarationFactory(
Name.identifier(JvmAbi.DEFAULT_IMPLS_CLASS_NAME), Name.identifier(JvmAbi.DEFAULT_IMPLS_CLASS_NAME),
ClassKind.CLASS, ClassKind.CLASS,
Visibilities.PUBLIC, Visibilities.PUBLIC,
Modality.FINAL, Modality.FINAL
isCompanion = false,
isInner = false,
isData = false,
isExternal = false,
isInline = false,
isExpect = false,
isFun = false
).apply { ).apply {
descriptor.bind(this) descriptor.bind(this)
parent = interfaceClass parent = interfaceClass
@@ -101,14 +101,7 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
name = fileClassInfo.fileClassFqName.shortName(), name = fileClassInfo.fileClassFqName.shortName(),
kind = ClassKind.CLASS, kind = ClassKind.CLASS,
visibility = if (!fileClassInfo.withJvmMultifileClass) Visibilities.PUBLIC else JavaVisibilities.PACKAGE_VISIBILITY, visibility = if (!fileClassInfo.withJvmMultifileClass) Visibilities.PUBLIC else JavaVisibilities.PACKAGE_VISIBILITY,
modality = Modality.FINAL, modality = Modality.FINAL
isCompanion = false,
isInner = false,
isData = false,
isExternal = false,
isInline = false,
isExpect = false,
isFun = false
).apply { ).apply {
descriptor.bind(this) descriptor.bind(this)
superTypes += context.irBuiltIns.anyType 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.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.declarations.* 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.descriptors.IrImplementingDelegateDescriptorImpl
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.expressions.mapValueParameters import org.jetbrains.kotlin.ir.expressions.mapValueParameters
@@ -80,11 +81,16 @@ class ClassGenerator(
val startOffset = ktClassOrObject.getStartOffsetOfClassDeclarationOrNull() ?: ktClassOrObject.pureStartOffset val startOffset = ktClassOrObject.getStartOffsetOfClassDeclarationOrNull() ?: ktClassOrObject.pureStartOffset
val endOffset = ktClassOrObject.pureEndOffset val endOffset = ktClassOrObject.pureEndOffset
val visibility = visibility_ ?: classDescriptor.visibility val visibility = visibility_ ?: classDescriptor.visibility
val modality = getEffectiveModality(ktClassOrObject, classDescriptor)
return context.symbolTable.declareClass( return context.symbolTable.declareClass(classDescriptor) {
startOffset, endOffset, IrDeclarationOrigin.DEFINED, classDescriptor, IrClassImpl(
getEffectiveModality(ktClassOrObject, classDescriptor), visibility startOffset, endOffset, IrDeclarationOrigin.DEFINED, it,
).buildWithScope { irClass -> classDescriptor,
context.symbolTable.nameProvider.nameForDeclaration(classDescriptor),
visibility = visibility, modality = modality,
).apply { metadata = MetadataSource.Class(it.descriptor) }
}.buildWithScope { irClass ->
declarationGenerator.generateGlobalTypeParametersDeclarations(irClass, classDescriptor.declaredTypeParameters) declarationGenerator.generateGlobalTypeParametersDeclarations(irClass, classDescriptor.declaredTypeParameters)
irClass.superTypes = classDescriptor.typeConstructor.supertypes.map { 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 { 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) { symbolTable.withScope(descriptor) {
irClass.metadata = MetadataSource.Class(descriptor) irClass.metadata = MetadataSource.Class(descriptor)
@@ -16,10 +16,7 @@
package org.jetbrains.kotlin.ir.declarations.impl package org.jetbrains.kotlin.ir.declarations.impl
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.carriers.ClassCarrier import org.jetbrains.kotlin.ir.declarations.impl.carriers.ClassCarrier
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
@@ -38,43 +35,65 @@ class IrClassImpl(
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
override val symbol: IrClassSymbol, override val symbol: IrClassSymbol,
override val name: Name = symbol.descriptor.name, override val name: Name,
override val kind: ClassKind = symbol.descriptor.kind, override val kind: ClassKind,
visibility: Visibility = symbol.descriptor.visibility, visibility: Visibility,
modality: Modality = symbol.descriptor.modality, modality: Modality,
override val isCompanion: Boolean = symbol.descriptor.isCompanionObject, override val isCompanion: Boolean = false,
override val isInner: Boolean = symbol.descriptor.isInner, override val isInner: Boolean = false,
override val isData: Boolean = symbol.descriptor.isData, override val isData: Boolean = false,
override val isExternal: Boolean = symbol.descriptor.isEffectivelyExternal(), override val isExternal: Boolean = false,
override val isInline: Boolean = symbol.descriptor.isInline, override val isInline: Boolean = false,
override val isExpect: Boolean = symbol.descriptor.isExpect, override val isExpect: Boolean = false,
override val isFun: Boolean = symbol.descriptor.isFun override val isFun: Boolean = false
) : ) :
IrDeclarationBase<ClassCarrier>(startOffset, endOffset, origin), IrDeclarationBase<ClassCarrier>(startOffset, endOffset, origin),
IrClass, IrClass,
ClassCarrier { 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( constructor(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrClassSymbol, symbol: IrClassSymbol,
modality: Modality = symbol.descriptor.modality, descriptor: ClassDescriptor,
visibility: Visibility = symbol.descriptor.visibility name: Name = descriptor.name,
) : visibility: Visibility = descriptor.visibility,
this( modality: Modality = descriptor.modality
startOffset, endOffset, origin, symbol, ) : this(
symbol.descriptor.name, symbol.descriptor.kind, startOffset, endOffset, origin, symbol,
visibility, name, kind = descriptor.kind,
modality = modality, visibility = visibility, modality = modality,
isCompanion = symbol.descriptor.isCompanionObject, isCompanion = descriptor.isCompanionObject, isInner = descriptor.isInner,
isInner = symbol.descriptor.isInner, isData = descriptor.isData, isExternal = descriptor.isEffectivelyExternal(),
isData = symbol.descriptor.isData, isInline = descriptor.isInline, isExpect = descriptor.isExpect,
isExternal = symbol.descriptor.isEffectivelyExternal(), isFun = descriptor.isFun
isInline = symbol.descriptor.isInline, )
isExpect = symbol.descriptor.isExpect,
isFun = symbol.descriptor.isFun
)
init { init {
symbol.bind(this) 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.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation 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.*
import org.jetbrains.kotlin.ir.declarations.impl.* import org.jetbrains.kotlin.ir.declarations.impl.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
@@ -40,7 +39,7 @@ abstract class IrAbstractFunctionFactory {
fun functionN(n: Int) = functionN(n) { callback -> fun functionN(n: Int) = functionN(n) { callback ->
val descriptor = functionClassDescriptor(n) val descriptor = functionClassDescriptor(n)
declareClass(offset, offset, classOrigin, descriptor) { symbol -> declareClass(descriptor) { symbol ->
callback(symbol) callback(symbol)
} }
} }
@@ -48,7 +47,7 @@ abstract class IrAbstractFunctionFactory {
fun kFunctionN(n: Int): IrClass { fun kFunctionN(n: Int): IrClass {
return kFunctionN(n) { callback -> return kFunctionN(n) { callback ->
val descriptor = kFunctionClassDescriptor(n) val descriptor = kFunctionClassDescriptor(n)
declareClass(offset, offset, classOrigin, descriptor) { symbol -> declareClass(descriptor) { symbol ->
callback(symbol) callback(symbol)
} }
} }
@@ -56,14 +55,14 @@ abstract class IrAbstractFunctionFactory {
fun suspendFunctionN(n: Int): IrClass = suspendFunctionN(n) { callback -> fun suspendFunctionN(n: Int): IrClass = suspendFunctionN(n) { callback ->
val descriptor = suspendFunctionClassDescriptor(n) val descriptor = suspendFunctionClassDescriptor(n)
declareClass(offset, offset, classOrigin, descriptor) { symbol -> declareClass(descriptor) { symbol ->
callback(symbol) callback(symbol)
} }
} }
fun kSuspendFunctionN(n: Int): IrClass = kSuspendFunctionN(n) { callback -> fun kSuspendFunctionN(n: Int): IrClass = kSuspendFunctionN(n) { callback ->
val descriptor = kSuspendFunctionClassDescriptor(n) val descriptor = kSuspendFunctionClassDescriptor(n)
declareClass(offset, offset, classOrigin, descriptor) { symbol -> declareClass(descriptor) { symbol ->
callback(symbol) callback(symbol)
} }
} }
@@ -270,7 +269,7 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa
private fun FunctionClassDescriptor.createFunctionClass(): IrClass { private fun FunctionClassDescriptor.createFunctionClass(): IrClass {
val s = symbolTable.referenceClass(this) val s = symbolTable.referenceClass(this)
if (s.isBound) return s.owner if (s.isBound) return s.owner
return symbolTable.declareClass(offset, offset, classOrigin, this, modality) { return symbolTable.declareClass(this) {
val factory = FunctionDescriptorFactory.RealDescriptorFactory(this, symbolTable) val factory = FunctionDescriptorFactory.RealDescriptorFactory(this, symbolTable)
when (functionKind) { when (functionKind) {
FunctionClassDescriptor.Kind.Function -> FunctionClassDescriptor.Kind.Function ->
@@ -422,14 +421,7 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa
): IrClass { ): IrClass {
val name = functionClassName(isK, isSuspend, n) val name = functionClassName(isK, isSuspend, n)
val klass = IrClassImpl( val klass = IrClassImpl(
offset, offset, classOrigin, symbol, Name.identifier(name), ClassKind.INTERFACE, Visibilities.PUBLIC, Modality.ABSTRACT, 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
) )
val r = klass.createTypeParameters(n, descriptorFactory) val r = klass.createTypeParameters(n, descriptorFactory)
@@ -271,7 +271,7 @@ class DeclarationStubGenerator(
return referenceClass.owner return referenceClass.owner
} }
val origin = computeOrigin(descriptor) val origin = computeOrigin(descriptor)
return symbolTable.declareClass(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor) { return symbolTable.declareClass(descriptor) {
IrLazyClass( IrLazyClass(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin,
it, descriptor, it, descriptor,
@@ -88,7 +88,7 @@ interface ReferenceSymbolTable {
open class SymbolTable( open class SymbolTable(
val signaturer: IdSignatureComposer, val signaturer: IdSignatureComposer,
private val nameProvider: NameProvider = NameProvider.DEFAULT val nameProvider: NameProvider = NameProvider.DEFAULT
) : ReferenceSymbolTable { ) : ReferenceSymbolTable {
@Suppress("LeakingThis") @Suppress("LeakingThis")
@@ -394,15 +394,8 @@ open class SymbolTable(
} }
fun declareClass( fun declareClass(
startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: ClassDescriptor, descriptor: ClassDescriptor,
modality: Modality = descriptor.modality, visibility: Visibility = descriptor.visibility, classFactory: (IrClassSymbol) -> IrClass
classFactory: (IrClassSymbol) -> IrClass = {
IrClassImpl(
startOffset, endOffset, origin, it,
nameProvider.nameForDeclaration(descriptor),
visibility = visibility, modality = modality,
).apply { metadata = MetadataSource.Class(it.descriptor) }
}
): IrClass { ): IrClass {
return classSymbolTable.declare( return classSymbolTable.declare(
descriptor, descriptor,