Migrate DescriptorsFactory.getSymbolForObjectInstance() API to symbols
This commit is contained in:
+2
-1
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.common.descriptors
|
|||||||
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
|
import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
||||||
@@ -16,5 +17,5 @@ interface DescriptorsFactory {
|
|||||||
fun getSymbolForEnumEntry(enumEntry: IrEnumEntrySymbol): IrFieldSymbol
|
fun getSymbolForEnumEntry(enumEntry: IrEnumEntrySymbol): IrFieldSymbol
|
||||||
fun getOuterThisFieldDescriptor(innerClassDescriptor: ClassDescriptor): PropertyDescriptor
|
fun getOuterThisFieldDescriptor(innerClassDescriptor: ClassDescriptor): PropertyDescriptor
|
||||||
fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: ClassConstructorDescriptor): IrConstructorSymbol
|
fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: ClassConstructorDescriptor): IrConstructorSymbol
|
||||||
fun getFieldDescriptorForObjectInstance(objectDescriptor: ClassDescriptor): PropertyDescriptor
|
fun getSymbolForObjectInstance(singleton: IrClassSymbol): IrFieldSymbol
|
||||||
}
|
}
|
||||||
+6
-4
@@ -26,10 +26,12 @@ import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
|
|||||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrEnumEntry
|
import org.jetbrains.kotlin.ir.declarations.IrEnumEntry
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrField
|
import org.jetbrains.kotlin.ir.declarations.IrField
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
|
import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -114,10 +116,10 @@ class JsDescriptorsFactory(
|
|||||||
return IrConstructorSymbolImpl(newDescriptor)
|
return IrConstructorSymbolImpl(newDescriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFieldDescriptorForObjectInstance(objectDescriptor: ClassDescriptor): PropertyDescriptor =
|
override fun getSymbolForObjectInstance(singleton: IrClassSymbol): IrFieldSymbol =
|
||||||
singletonFieldDescriptors.getOrPut(objectDescriptor) {
|
IrFieldSymbolImpl(singletonFieldDescriptors.getOrPut(singleton.descriptor) {
|
||||||
createObjectInstanceFieldDescriptor(objectDescriptor)
|
createObjectInstanceFieldDescriptor(singleton.descriptor)
|
||||||
}
|
})
|
||||||
|
|
||||||
private fun createObjectInstanceFieldDescriptor(objectDescriptor: ClassDescriptor): PropertyDescriptor {
|
private fun createObjectInstanceFieldDescriptor(objectDescriptor: ClassDescriptor): PropertyDescriptor {
|
||||||
assert(objectDescriptor.kind == ClassKind.OBJECT) { "Should be an object: $objectDescriptor" }
|
assert(objectDescriptor.kind == ClassKind.OBJECT) { "Should be an object: $objectDescriptor" }
|
||||||
|
|||||||
+5
-4
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl
|
|||||||
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
|
||||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
||||||
import org.jetbrains.kotlin.ir.SourceManager
|
import org.jetbrains.kotlin.ir.SourceManager
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
|
import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
||||||
@@ -126,10 +127,10 @@ class JvmDescriptorsFactory(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFieldDescriptorForObjectInstance(objectDescriptor: ClassDescriptor): PropertyDescriptor =
|
override fun getSymbolForObjectInstance(singleton: IrClassSymbol): IrFieldSymbol =
|
||||||
singletonFieldDescriptors.getOrPut(objectDescriptor) {
|
IrFieldSymbolImpl(singletonFieldDescriptors.getOrPut(singleton.descriptor) {
|
||||||
createObjectInstanceFieldDescriptor(objectDescriptor)
|
createObjectInstanceFieldDescriptor(singleton.descriptor)
|
||||||
}
|
})
|
||||||
|
|
||||||
private fun createObjectInstanceFieldDescriptor(objectDescriptor: ClassDescriptor): PropertyDescriptor {
|
private fun createObjectInstanceFieldDescriptor(objectDescriptor: ClassDescriptor): PropertyDescriptor {
|
||||||
assert(objectDescriptor.kind == ClassKind.OBJECT) { "Should be an object: $objectDescriptor" }
|
assert(objectDescriptor.kind == ClassKind.OBJECT) { "Should be an object: $objectDescriptor" }
|
||||||
|
|||||||
+11
-9
@@ -33,6 +33,8 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
|||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
|
||||||
import org.jetbrains.kotlin.codegen.JvmCodegenUtil.isCompanionObjectInInterfaceNotIntrinsic
|
import org.jetbrains.kotlin.codegen.JvmCodegenUtil.isCompanionObjectInInterfaceNotIntrinsic
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
||||||
|
|
||||||
class ObjectClassLowering(val context: JvmBackendContext) : IrElementTransformerVoidWithContext(), FileLoweringPass {
|
class ObjectClassLowering(val context: JvmBackendContext) : IrElementTransformerVoidWithContext(), FileLoweringPass {
|
||||||
|
|
||||||
@@ -53,7 +55,7 @@ class ObjectClassLowering(val context: JvmBackendContext) : IrElementTransformer
|
|||||||
private fun process(irClass: IrClass) {
|
private fun process(irClass: IrClass) {
|
||||||
if (irClass.descriptor.kind != ClassKind.OBJECT) return
|
if (irClass.descriptor.kind != ClassKind.OBJECT) return
|
||||||
|
|
||||||
val publicInstanceDescriptor = context.descriptorsFactory.getFieldDescriptorForObjectInstance(irClass.descriptor)
|
val publicInstance = context.descriptorsFactory.getSymbolForObjectInstance(irClass.symbol)
|
||||||
|
|
||||||
val constructor = irClass.descriptor.unsubstitutedPrimaryConstructor
|
val constructor = irClass.descriptor.unsubstitutedPrimaryConstructor
|
||||||
?: throw AssertionError("Object should have a primary constructor: ${irClass.descriptor}")
|
?: throw AssertionError("Object should have a primary constructor: ${irClass.descriptor}")
|
||||||
@@ -61,7 +63,7 @@ class ObjectClassLowering(val context: JvmBackendContext) : IrElementTransformer
|
|||||||
val publicInstanceOwner = if (irClass.descriptor.isCompanionObject) parentScope!!.irElement as IrDeclarationContainer else irClass
|
val publicInstanceOwner = if (irClass.descriptor.isCompanionObject) parentScope!!.irElement as IrDeclarationContainer else irClass
|
||||||
if (isCompanionObjectInInterfaceNotIntrinsic(irClass.descriptor)) {
|
if (isCompanionObjectInInterfaceNotIntrinsic(irClass.descriptor)) {
|
||||||
// TODO rename to $$INSTANCE
|
// TODO rename to $$INSTANCE
|
||||||
val privateInstance = publicInstanceDescriptor.copy(
|
val privateInstance = publicInstance.descriptor.copy(
|
||||||
irClass.descriptor,
|
irClass.descriptor,
|
||||||
Modality.FINAL,
|
Modality.FINAL,
|
||||||
Visibilities.PROTECTED/*TODO package local*/,
|
Visibilities.PROTECTED/*TODO package local*/,
|
||||||
@@ -69,36 +71,36 @@ class ObjectClassLowering(val context: JvmBackendContext) : IrElementTransformer
|
|||||||
false
|
false
|
||||||
) as PropertyDescriptor
|
) as PropertyDescriptor
|
||||||
privateInstance.name
|
privateInstance.name
|
||||||
val field = createInstanceFieldWithInitializer(privateInstance, constructor, irClass)
|
val field = createInstanceFieldWithInitializer(IrFieldSymbolImpl(privateInstance), constructor, irClass)
|
||||||
createFieldWithCustomInitializer(
|
createFieldWithCustomInitializer(
|
||||||
publicInstanceDescriptor,
|
publicInstance,
|
||||||
IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, field.symbol),
|
IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, field.symbol),
|
||||||
publicInstanceOwner
|
publicInstanceOwner
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
createInstanceFieldWithInitializer(publicInstanceDescriptor, constructor, publicInstanceOwner)
|
createInstanceFieldWithInitializer(publicInstance, constructor, publicInstanceOwner)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createInstanceFieldWithInitializer(
|
private fun createInstanceFieldWithInitializer(
|
||||||
instanceFieldDescriptor: PropertyDescriptor,
|
fieldSymbol: IrFieldSymbol,
|
||||||
constructor: ClassConstructorDescriptor,
|
constructor: ClassConstructorDescriptor,
|
||||||
instanceOwner: IrDeclarationContainer
|
instanceOwner: IrDeclarationContainer
|
||||||
): IrField =
|
): IrField =
|
||||||
createFieldWithCustomInitializer(
|
createFieldWithCustomInitializer(
|
||||||
instanceFieldDescriptor,
|
fieldSymbol,
|
||||||
IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, constructor),
|
IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, constructor),
|
||||||
instanceOwner
|
instanceOwner
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun createFieldWithCustomInitializer(
|
private fun createFieldWithCustomInitializer(
|
||||||
instanceFieldDescriptor: PropertyDescriptor,
|
fieldSymbol: IrFieldSymbol,
|
||||||
instanceInitializer: IrExpression,
|
instanceInitializer: IrExpression,
|
||||||
instanceOwner: IrDeclarationContainer
|
instanceOwner: IrDeclarationContainer
|
||||||
): IrField =
|
): IrField =
|
||||||
IrFieldImpl(
|
IrFieldImpl(
|
||||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, JvmLoweredDeclarationOrigin.FIELD_FOR_OBJECT_INSTANCE,
|
UNDEFINED_OFFSET, UNDEFINED_OFFSET, JvmLoweredDeclarationOrigin.FIELD_FOR_OBJECT_INSTANCE,
|
||||||
instanceFieldDescriptor,
|
fieldSymbol,
|
||||||
IrExpressionBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, instanceInitializer)
|
IrExpressionBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, instanceInitializer)
|
||||||
).also {
|
).also {
|
||||||
pendingTransformations.add { instanceOwner.declarations.add(it) }
|
pendingTransformations.add { instanceOwner.declarations.add(it) }
|
||||||
|
|||||||
+2
-2
@@ -37,7 +37,7 @@ class SingletonReferencesLowering(val context: JvmBackendContext) : BodyLowering
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression {
|
override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression {
|
||||||
val instanceFieldDescriptor = context.descriptorsFactory.getFieldDescriptorForObjectInstance(expression.descriptor)
|
val instanceField = context.descriptorsFactory.getSymbolForObjectInstance(expression.symbol)
|
||||||
return IrGetFieldImpl(expression.startOffset, expression.endOffset, instanceFieldDescriptor)
|
return IrGetFieldImpl(expression.startOffset, expression.endOffset, instanceField)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,13 +42,20 @@ class IrFieldImpl(
|
|||||||
override val isExternal: Boolean
|
override val isExternal: Boolean
|
||||||
) : IrDeclarationBase(startOffset, endOffset, origin), IrField {
|
) : IrDeclarationBase(startOffset, endOffset, origin), IrField {
|
||||||
|
|
||||||
constructor(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, symbol: IrFieldSymbol) :
|
constructor(
|
||||||
this(
|
startOffset: Int,
|
||||||
startOffset, endOffset, origin, symbol,
|
endOffset: Int,
|
||||||
symbol.descriptor.name, symbol.descriptor.type, symbol.descriptor.visibility,
|
origin: IrDeclarationOrigin,
|
||||||
!symbol.descriptor.isVar,
|
symbol: IrFieldSymbol,
|
||||||
symbol.descriptor.isEffectivelyExternal()
|
initializer: IrExpressionBody? = null
|
||||||
)
|
) : this(
|
||||||
|
startOffset, endOffset, origin, symbol,
|
||||||
|
symbol.descriptor.name, symbol.descriptor.type, symbol.descriptor.visibility,
|
||||||
|
!symbol.descriptor.isVar,
|
||||||
|
symbol.descriptor.isEffectivelyExternal()
|
||||||
|
) {
|
||||||
|
this.initializer = initializer
|
||||||
|
}
|
||||||
|
|
||||||
constructor(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: PropertyDescriptor) :
|
constructor(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: PropertyDescriptor) :
|
||||||
this(startOffset, endOffset, origin, IrFieldSymbolImpl(descriptor))
|
this(startOffset, endOffset, origin, IrFieldSymbolImpl(descriptor))
|
||||||
|
|||||||
Reference in New Issue
Block a user