[PSI2IR] Additional receiver -> context receiver
This commit is contained in:
committed by
TeamCityServer
parent
3f50b675b1
commit
f05ca5be33
@@ -184,7 +184,7 @@ class BodyGenerator(
|
||||
|
||||
val classDescriptor = (scopeOwner as ClassConstructorDescriptor).containingDeclaration
|
||||
if (classDescriptor.contextReceivers.isNotEmpty()) {
|
||||
generateSetAdditionalFieldForPrimaryConstructorBody(classDescriptor, irConstructor, irBlockBody)
|
||||
generateSetContextReceiverFieldForPrimaryConstructorBody(classDescriptor, irConstructor, irBlockBody)
|
||||
}
|
||||
irBlockBody.statements.add(
|
||||
IrInstanceInitializerCallImpl(
|
||||
@@ -334,7 +334,7 @@ class BodyGenerator(
|
||||
pregenerateCall(constructorCall)
|
||||
)
|
||||
|
||||
private fun generateSetAdditionalFieldForPrimaryConstructorBody(
|
||||
private fun generateSetContextReceiverFieldForPrimaryConstructorBody(
|
||||
classDescriptor: ClassDescriptor,
|
||||
irConstructor: IrConstructor,
|
||||
irBlockBody: IrBlockBody
|
||||
|
||||
@@ -98,7 +98,7 @@ class ClassGenerator(
|
||||
classDescriptor.thisAsReceiverParameter.type.toIrType()
|
||||
)
|
||||
|
||||
generateFieldsForAdditionalReceivers(irClass, classDescriptor)
|
||||
generateFieldsForContextReceivers(irClass, classDescriptor)
|
||||
|
||||
val irPrimaryConstructor = generatePrimaryConstructor(irClass, ktClassOrObject)
|
||||
if (irPrimaryConstructor != null) {
|
||||
@@ -434,13 +434,13 @@ class ClassGenerator(
|
||||
EnumClassMembersGenerator(declarationGenerator).generateSpecialMembers(irClass)
|
||||
}
|
||||
|
||||
private fun generateFieldsForAdditionalReceivers(irClass: IrClass, classDescriptor: ClassDescriptor) {
|
||||
private fun generateFieldsForContextReceivers(irClass: IrClass, classDescriptor: ClassDescriptor) {
|
||||
for ((fieldIndex, receiverDescriptor) in classDescriptor.contextReceivers.withIndex()) {
|
||||
val irField = context.irFactory.createField(
|
||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
|
||||
IrDeclarationOrigin.FIELD_FOR_CLASS_CONTEXT_RECEIVER,
|
||||
IrFieldSymbolImpl(),
|
||||
Name.identifier("additionalReceiverField$fieldIndex"),
|
||||
Name.identifier("contextReceiverField$fieldIndex"),
|
||||
receiverDescriptor.type.toIrType(),
|
||||
DescriptorVisibilities.PRIVATE,
|
||||
isFinal = true,
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.ir.declarations.IrField
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||
|
||||
class DescriptorStorageForAdditionalReceivers {
|
||||
class DescriptorStorageForContextReceivers {
|
||||
private val variableStorage: MutableMap<KtExpression, VariableDescriptor> = mutableMapOf()
|
||||
private val syntheticFieldStorage: MutableMap<ReceiverValue, IrField> = mutableMapOf()
|
||||
|
||||
+2
-2
@@ -329,8 +329,8 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
|
||||
|
||||
val contextReceiverParametersCount = functionDescriptor.contextReceiverParameters.size
|
||||
irFunction.contextReceiverParametersCount = contextReceiverParametersCount
|
||||
irFunction.valueParameters += functionDescriptor.contextReceiverParameters.mapIndexed { i, additionalReceiver ->
|
||||
declareParameter(additionalReceiver, ktContextReceiverParameterElements.getOrNull(i) ?: ktParameterOwner, irFunction, null, i)
|
||||
irFunction.valueParameters += functionDescriptor.contextReceiverParameters.mapIndexed { i, contextReceiver ->
|
||||
declareParameter(contextReceiver, ktContextReceiverParameterElements.getOrNull(i) ?: ktParameterOwner, irFunction, null, i)
|
||||
}
|
||||
|
||||
// Declare all the value parameters up first.
|
||||
|
||||
+1
-1
@@ -71,7 +71,7 @@ class GeneratorContext private constructor(
|
||||
// TODO: inject a correct StorageManager instance, or store NotFoundClasses inside ModuleDescriptor
|
||||
val reflectionTypes = ReflectionTypes(moduleDescriptor, NotFoundClasses(LockBasedStorageManager.NO_LOCKS, moduleDescriptor))
|
||||
|
||||
val additionalDescriptorStorage: DescriptorStorageForAdditionalReceivers = DescriptorStorageForAdditionalReceivers()
|
||||
val additionalDescriptorStorage: DescriptorStorageForContextReceivers = DescriptorStorageForContextReceivers()
|
||||
|
||||
val samTypeApproximator = SamTypeApproximator(moduleDescriptor.builtIns, languageVersionSettings)
|
||||
|
||||
|
||||
+1
-1
@@ -52,7 +52,7 @@ abstract class PropertyLValueBase(
|
||||
val extensionReceiverValue2 = extensionReceiverVariable2?.let { VariableLValue(context, it) }
|
||||
|
||||
val contextReceiverVariables2 = contextReceiverValues.mapIndexed { i, value ->
|
||||
scope.createTemporaryVariable(value.load(), "additionalReceiver$i")
|
||||
scope.createTemporaryVariable(value.load(), "contextReceiver$i")
|
||||
}
|
||||
val contextReceiversValues2 = contextReceiverVariables2.map { VariableLValue(context, it) }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user