Update KonanSharedVariablesManager to new SharedVariablesManager API
(cherry picked from commit 0f9f6d36955ed709a96624aaa422d5e0081a3a53)
This commit is contained in:
committed by
Vasily Levchenko
parent
be8984ef81
commit
91f4606b99
+19
-32
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user