Migrate DescriptorsFactory.getSymbolForObjectInstance() API to symbols

This commit is contained in:
Mikhael Bogdanov
2018-05-08 11:47:02 +02:00
parent 2631d149b2
commit d4d8fe4995
6 changed files with 40 additions and 27 deletions
@@ -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
}
@@ -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" }
@@ -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" }
@@ -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) }
@@ -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))