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.ClassDescriptor
|
||||
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.IrEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
||||
@@ -16,5 +17,5 @@ interface DescriptorsFactory {
|
||||
fun getSymbolForEnumEntry(enumEntry: IrEnumEntrySymbol): IrFieldSymbol
|
||||
fun getOuterThisFieldDescriptor(innerClassDescriptor: ClassDescriptor): PropertyDescriptor
|
||||
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.ir.declarations.IrEnumEntry
|
||||
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.IrEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
||||
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.resolve.DescriptorUtils
|
||||
import java.util.*
|
||||
@@ -114,10 +116,10 @@ class JsDescriptorsFactory(
|
||||
return IrConstructorSymbolImpl(newDescriptor)
|
||||
}
|
||||
|
||||
override fun getFieldDescriptorForObjectInstance(objectDescriptor: ClassDescriptor): PropertyDescriptor =
|
||||
singletonFieldDescriptors.getOrPut(objectDescriptor) {
|
||||
createObjectInstanceFieldDescriptor(objectDescriptor)
|
||||
}
|
||||
override fun getSymbolForObjectInstance(singleton: IrClassSymbol): IrFieldSymbol =
|
||||
IrFieldSymbolImpl(singletonFieldDescriptors.getOrPut(singleton.descriptor) {
|
||||
createObjectInstanceFieldDescriptor(singleton.descriptor)
|
||||
})
|
||||
|
||||
private fun createObjectInstanceFieldDescriptor(objectDescriptor: ClassDescriptor): PropertyDescriptor {
|
||||
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.fileClasses.JvmFileClassUtil
|
||||
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.IrEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
||||
@@ -126,10 +127,10 @@ class JvmDescriptorsFactory(
|
||||
)
|
||||
}
|
||||
|
||||
override fun getFieldDescriptorForObjectInstance(objectDescriptor: ClassDescriptor): PropertyDescriptor =
|
||||
singletonFieldDescriptors.getOrPut(objectDescriptor) {
|
||||
createObjectInstanceFieldDescriptor(objectDescriptor)
|
||||
}
|
||||
override fun getSymbolForObjectInstance(singleton: IrClassSymbol): IrFieldSymbol =
|
||||
IrFieldSymbolImpl(singletonFieldDescriptors.getOrPut(singleton.descriptor) {
|
||||
createObjectInstanceFieldDescriptor(singleton.descriptor)
|
||||
})
|
||||
|
||||
private fun createObjectInstanceFieldDescriptor(objectDescriptor: ClassDescriptor): PropertyDescriptor {
|
||||
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.IrGetFieldImpl
|
||||
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 {
|
||||
|
||||
@@ -53,7 +55,7 @@ class ObjectClassLowering(val context: JvmBackendContext) : IrElementTransformer
|
||||
private fun process(irClass: IrClass) {
|
||||
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
|
||||
?: 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
|
||||
if (isCompanionObjectInInterfaceNotIntrinsic(irClass.descriptor)) {
|
||||
// TODO rename to $$INSTANCE
|
||||
val privateInstance = publicInstanceDescriptor.copy(
|
||||
val privateInstance = publicInstance.descriptor.copy(
|
||||
irClass.descriptor,
|
||||
Modality.FINAL,
|
||||
Visibilities.PROTECTED/*TODO package local*/,
|
||||
@@ -69,36 +71,36 @@ class ObjectClassLowering(val context: JvmBackendContext) : IrElementTransformer
|
||||
false
|
||||
) as PropertyDescriptor
|
||||
privateInstance.name
|
||||
val field = createInstanceFieldWithInitializer(privateInstance, constructor, irClass)
|
||||
val field = createInstanceFieldWithInitializer(IrFieldSymbolImpl(privateInstance), constructor, irClass)
|
||||
createFieldWithCustomInitializer(
|
||||
publicInstanceDescriptor,
|
||||
publicInstance,
|
||||
IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, field.symbol),
|
||||
publicInstanceOwner
|
||||
)
|
||||
} else {
|
||||
createInstanceFieldWithInitializer(publicInstanceDescriptor, constructor, publicInstanceOwner)
|
||||
createInstanceFieldWithInitializer(publicInstance, constructor, publicInstanceOwner)
|
||||
}
|
||||
}
|
||||
|
||||
private fun createInstanceFieldWithInitializer(
|
||||
instanceFieldDescriptor: PropertyDescriptor,
|
||||
fieldSymbol: IrFieldSymbol,
|
||||
constructor: ClassConstructorDescriptor,
|
||||
instanceOwner: IrDeclarationContainer
|
||||
): IrField =
|
||||
createFieldWithCustomInitializer(
|
||||
instanceFieldDescriptor,
|
||||
fieldSymbol,
|
||||
IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, constructor),
|
||||
instanceOwner
|
||||
)
|
||||
|
||||
private fun createFieldWithCustomInitializer(
|
||||
instanceFieldDescriptor: PropertyDescriptor,
|
||||
fieldSymbol: IrFieldSymbol,
|
||||
instanceInitializer: IrExpression,
|
||||
instanceOwner: IrDeclarationContainer
|
||||
): IrField =
|
||||
IrFieldImpl(
|
||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, JvmLoweredDeclarationOrigin.FIELD_FOR_OBJECT_INSTANCE,
|
||||
instanceFieldDescriptor,
|
||||
fieldSymbol,
|
||||
IrExpressionBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, instanceInitializer)
|
||||
).also {
|
||||
pendingTransformations.add { instanceOwner.declarations.add(it) }
|
||||
|
||||
+2
-2
@@ -37,7 +37,7 @@ class SingletonReferencesLowering(val context: JvmBackendContext) : BodyLowering
|
||||
}
|
||||
|
||||
override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression {
|
||||
val instanceFieldDescriptor = context.descriptorsFactory.getFieldDescriptorForObjectInstance(expression.descriptor)
|
||||
return IrGetFieldImpl(expression.startOffset, expression.endOffset, instanceFieldDescriptor)
|
||||
val instanceField = context.descriptorsFactory.getSymbolForObjectInstance(expression.symbol)
|
||||
return IrGetFieldImpl(expression.startOffset, expression.endOffset, instanceField)
|
||||
}
|
||||
}
|
||||
@@ -42,13 +42,20 @@ class IrFieldImpl(
|
||||
override val isExternal: Boolean
|
||||
) : IrDeclarationBase(startOffset, endOffset, origin), IrField {
|
||||
|
||||
constructor(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, symbol: IrFieldSymbol) :
|
||||
this(
|
||||
startOffset, endOffset, origin, symbol,
|
||||
symbol.descriptor.name, symbol.descriptor.type, symbol.descriptor.visibility,
|
||||
!symbol.descriptor.isVar,
|
||||
symbol.descriptor.isEffectivelyExternal()
|
||||
)
|
||||
constructor(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
origin: IrDeclarationOrigin,
|
||||
symbol: IrFieldSymbol,
|
||||
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) :
|
||||
this(startOffset, endOffset, origin, IrFieldSymbolImpl(descriptor))
|
||||
|
||||
Reference in New Issue
Block a user