Update KonanSharedVariablesManager to new SharedVariablesManager API

(cherry picked from commit 0f9f6d36955ed709a96624aaa422d5e0081a3a53)
This commit is contained in:
Mikhael Bogdanov
2018-05-04 12:46:45 +02:00
committed by Vasily Levchenko
parent be8984ef81
commit 91f4606b99
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
@@ -35,7 +34,6 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.ir.util.defaultType import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.*
@@ -48,9 +46,6 @@ internal class KonanSharedVariablesManager(val context: KonanBackendContext) : S
private val elementProperty = refClass.owner.declarations.filterIsInstance<IrProperty>().single() private val elementProperty = refClass.owner.declarations.filterIsInstance<IrProperty>().single()
// TODO: refactor `SharedVariablesManager` interface instead of tracking the mapping:
private val sharedVariableDescriptorToSymbol = mutableMapOf<VariableDescriptor, IrVariableSymbol>()
private fun refConstructor(elementType: KotlinType): ClassConstructorDescriptor { private fun refConstructor(elementType: KotlinType): ClassConstructorDescriptor {
val typeParameter = refClassConstructor.descriptor.typeParameters[0] val typeParameter = refClassConstructor.descriptor.typeParameters[0]
@@ -63,16 +58,6 @@ internal class KonanSharedVariablesManager(val context: KonanBackendContext) : S
return refClass.owner.defaultType.replace(listOf(TypeProjectionImpl(elementType))) return refClass.owner.defaultType.replace(listOf(TypeProjectionImpl(elementType)))
} }
override fun createSharedVariableDescriptor(variableDescriptor: VariableDescriptor): VariableDescriptor {
return LocalVariableDescriptor(
variableDescriptor.containingDeclaration, variableDescriptor.annotations, variableDescriptor.name,
refType(variableDescriptor.type),
false, false, variableDescriptor.source
).also {
sharedVariableDescriptorToSymbol[it] = IrVariableSymbolImpl(it)
}
}
private fun getElementPropertyDescriptor(sharedVariableDescriptor: VariableDescriptor): PropertyDescriptor { private fun getElementPropertyDescriptor(sharedVariableDescriptor: VariableDescriptor): PropertyDescriptor {
return sharedVariableDescriptor.type.memberScope.getContributedDescriptors() return sharedVariableDescriptor.type.memberScope.getContributedDescriptors()
.filterIsInstance<PropertyDescriptor>() .filterIsInstance<PropertyDescriptor>()
@@ -81,10 +66,13 @@ internal class KonanSharedVariablesManager(val context: KonanBackendContext) : S
} }
} }
override fun defineSharedValue(sharedVariableDescriptor: VariableDescriptor, override fun declareSharedVariable(originalDeclaration: IrVariable): IrVariable {
originalDeclaration: IrVariable): IrStatement { val variableDescriptor = originalDeclaration.descriptor
val sharedVariableDescriptor = LocalVariableDescriptor(
val sharedVariableSymbol = sharedVariableDescriptorToSymbol[sharedVariableDescriptor]!! variableDescriptor.containingDeclaration, variableDescriptor.annotations, variableDescriptor.name,
refType(variableDescriptor.type),
false, false, variableDescriptor.source
)
val valueType = originalDeclaration.descriptor.type val valueType = originalDeclaration.descriptor.type
@@ -94,24 +82,26 @@ internal class KonanSharedVariablesManager(val context: KonanBackendContext) : S
originalDeclaration.startOffset, originalDeclaration.endOffset, originalDeclaration.startOffset, originalDeclaration.endOffset,
refClassConstructor, refConstructor(valueType), refConstructorTypeArguments refClassConstructor, refConstructor(valueType), refConstructorTypeArguments
) )
val sharedVariableDeclaration = IrVariableImpl(
return IrVariableImpl(
originalDeclaration.startOffset, originalDeclaration.endOffset, originalDeclaration.origin, originalDeclaration.startOffset, originalDeclaration.endOffset, originalDeclaration.origin,
sharedVariableSymbol sharedVariableDescriptor
).apply { ).apply {
initializer = refConstructorCall initializer = refConstructorCall
} }
}
val initializer = originalDeclaration.initializer ?: override fun defineSharedValue(originalDeclaration: IrVariable, sharedVariableDeclaration: IrVariable): IrStatement {
return sharedVariableDeclaration val initializer = originalDeclaration.initializer ?: return sharedVariableDeclaration
val elementPropertyDescriptor = getElementPropertyDescriptor(sharedVariableDescriptor) val elementPropertyDescriptor = getElementPropertyDescriptor(sharedVariableDeclaration.descriptor)
val sharedVariableInitialization = val sharedVariableInitialization =
IrCallImpl(initializer.startOffset, initializer.endOffset, elementProperty.setter!!.symbol, IrCallImpl(initializer.startOffset, initializer.endOffset, elementProperty.setter!!.symbol,
elementPropertyDescriptor.setter!!) elementPropertyDescriptor.setter!!)
sharedVariableInitialization.dispatchReceiver = sharedVariableInitialization.dispatchReceiver =
IrGetValueImpl(initializer.startOffset, initializer.endOffset, sharedVariableSymbol) IrGetValueImpl(initializer.startOffset, initializer.endOffset, sharedVariableDeclaration.symbol)
sharedVariableInitialization.putValueArgument(0, initializer) sharedVariableInitialization.putValueArgument(0, initializer)
@@ -121,10 +111,9 @@ internal class KonanSharedVariablesManager(val context: KonanBackendContext) : S
) )
} }
override fun getSharedValue(sharedVariableDescriptor: VariableDescriptor, originalGet: IrGetValue): IrExpression { override fun getSharedValue(sharedVariableSymbol: IrVariableSymbol, originalGet: IrGetValue): IrExpression {
val sharedVariableSymbol = sharedVariableDescriptorToSymbol[sharedVariableDescriptor]!!
val elementPropertyDescriptor = getElementPropertyDescriptor(sharedVariableDescriptor) val elementPropertyDescriptor = getElementPropertyDescriptor(sharedVariableSymbol.descriptor)
return IrCallImpl(originalGet.startOffset, originalGet.endOffset, elementProperty.getter!!.symbol, return IrCallImpl(originalGet.startOffset, originalGet.endOffset, elementProperty.getter!!.symbol,
elementPropertyDescriptor.getter!!).apply { elementPropertyDescriptor.getter!!).apply {
@@ -132,10 +121,8 @@ internal class KonanSharedVariablesManager(val context: KonanBackendContext) : S
} }
} }
override fun setSharedValue(sharedVariableDescriptor: VariableDescriptor, originalSet: IrSetVariable): IrExpression { override fun setSharedValue(sharedVariableSymbol: IrVariableSymbol, originalSet: IrSetVariable): IrExpression {
val sharedVariableSymbol = sharedVariableDescriptorToSymbol[sharedVariableDescriptor]!! val elementPropertyDescriptor = getElementPropertyDescriptor(sharedVariableSymbol.descriptor)
val elementPropertyDescriptor = getElementPropertyDescriptor(sharedVariableDescriptor)
return IrCallImpl(originalSet.startOffset, originalSet.endOffset, elementProperty.setter!!.symbol, return IrCallImpl(originalSet.startOffset, originalSet.endOffset, elementProperty.setter!!.symbol,
elementPropertyDescriptor.setter!!).apply { elementPropertyDescriptor.setter!!).apply {