[PSI2IR] Additional receiver -> context receiver

This commit is contained in:
Anastasiya Shadrina
2021-10-18 18:50:42 +07:00
committed by TeamCityServer
parent 3f50b675b1
commit f05ca5be33
9 changed files with 18 additions and 18 deletions
@@ -184,7 +184,7 @@ class BodyGenerator(
val classDescriptor = (scopeOwner as ClassConstructorDescriptor).containingDeclaration val classDescriptor = (scopeOwner as ClassConstructorDescriptor).containingDeclaration
if (classDescriptor.contextReceivers.isNotEmpty()) { if (classDescriptor.contextReceivers.isNotEmpty()) {
generateSetAdditionalFieldForPrimaryConstructorBody(classDescriptor, irConstructor, irBlockBody) generateSetContextReceiverFieldForPrimaryConstructorBody(classDescriptor, irConstructor, irBlockBody)
} }
irBlockBody.statements.add( irBlockBody.statements.add(
IrInstanceInitializerCallImpl( IrInstanceInitializerCallImpl(
@@ -334,7 +334,7 @@ class BodyGenerator(
pregenerateCall(constructorCall) pregenerateCall(constructorCall)
) )
private fun generateSetAdditionalFieldForPrimaryConstructorBody( private fun generateSetContextReceiverFieldForPrimaryConstructorBody(
classDescriptor: ClassDescriptor, classDescriptor: ClassDescriptor,
irConstructor: IrConstructor, irConstructor: IrConstructor,
irBlockBody: IrBlockBody irBlockBody: IrBlockBody
@@ -98,7 +98,7 @@ class ClassGenerator(
classDescriptor.thisAsReceiverParameter.type.toIrType() classDescriptor.thisAsReceiverParameter.type.toIrType()
) )
generateFieldsForAdditionalReceivers(irClass, classDescriptor) generateFieldsForContextReceivers(irClass, classDescriptor)
val irPrimaryConstructor = generatePrimaryConstructor(irClass, ktClassOrObject) val irPrimaryConstructor = generatePrimaryConstructor(irClass, ktClassOrObject)
if (irPrimaryConstructor != null) { if (irPrimaryConstructor != null) {
@@ -434,13 +434,13 @@ class ClassGenerator(
EnumClassMembersGenerator(declarationGenerator).generateSpecialMembers(irClass) 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()) { for ((fieldIndex, receiverDescriptor) in classDescriptor.contextReceivers.withIndex()) {
val irField = context.irFactory.createField( val irField = context.irFactory.createField(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
IrDeclarationOrigin.FIELD_FOR_CLASS_CONTEXT_RECEIVER, IrDeclarationOrigin.FIELD_FOR_CLASS_CONTEXT_RECEIVER,
IrFieldSymbolImpl(), IrFieldSymbolImpl(),
Name.identifier("additionalReceiverField$fieldIndex"), Name.identifier("contextReceiverField$fieldIndex"),
receiverDescriptor.type.toIrType(), receiverDescriptor.type.toIrType(),
DescriptorVisibilities.PRIVATE, DescriptorVisibilities.PRIVATE,
isFinal = true, isFinal = true,
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
class DescriptorStorageForAdditionalReceivers { class DescriptorStorageForContextReceivers {
private val variableStorage: MutableMap<KtExpression, VariableDescriptor> = mutableMapOf() private val variableStorage: MutableMap<KtExpression, VariableDescriptor> = mutableMapOf()
private val syntheticFieldStorage: MutableMap<ReceiverValue, IrField> = mutableMapOf() private val syntheticFieldStorage: MutableMap<ReceiverValue, IrField> = mutableMapOf()
@@ -329,8 +329,8 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
val contextReceiverParametersCount = functionDescriptor.contextReceiverParameters.size val contextReceiverParametersCount = functionDescriptor.contextReceiverParameters.size
irFunction.contextReceiverParametersCount = contextReceiverParametersCount irFunction.contextReceiverParametersCount = contextReceiverParametersCount
irFunction.valueParameters += functionDescriptor.contextReceiverParameters.mapIndexed { i, additionalReceiver -> irFunction.valueParameters += functionDescriptor.contextReceiverParameters.mapIndexed { i, contextReceiver ->
declareParameter(additionalReceiver, ktContextReceiverParameterElements.getOrNull(i) ?: ktParameterOwner, irFunction, null, i) declareParameter(contextReceiver, ktContextReceiverParameterElements.getOrNull(i) ?: ktParameterOwner, irFunction, null, i)
} }
// Declare all the value parameters up first. // Declare all the value parameters up first.
@@ -71,7 +71,7 @@ class GeneratorContext private constructor(
// TODO: inject a correct StorageManager instance, or store NotFoundClasses inside ModuleDescriptor // TODO: inject a correct StorageManager instance, or store NotFoundClasses inside ModuleDescriptor
val reflectionTypes = ReflectionTypes(moduleDescriptor, NotFoundClasses(LockBasedStorageManager.NO_LOCKS, moduleDescriptor)) val reflectionTypes = ReflectionTypes(moduleDescriptor, NotFoundClasses(LockBasedStorageManager.NO_LOCKS, moduleDescriptor))
val additionalDescriptorStorage: DescriptorStorageForAdditionalReceivers = DescriptorStorageForAdditionalReceivers() val additionalDescriptorStorage: DescriptorStorageForContextReceivers = DescriptorStorageForContextReceivers()
val samTypeApproximator = SamTypeApproximator(moduleDescriptor.builtIns, languageVersionSettings) val samTypeApproximator = SamTypeApproximator(moduleDescriptor.builtIns, languageVersionSettings)
@@ -52,7 +52,7 @@ abstract class PropertyLValueBase(
val extensionReceiverValue2 = extensionReceiverVariable2?.let { VariableLValue(context, it) } val extensionReceiverValue2 = extensionReceiverVariable2?.let { VariableLValue(context, it) }
val contextReceiverVariables2 = contextReceiverValues.mapIndexed { i, value -> 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) } val contextReceiversValues2 = contextReceiverVariables2.map { VariableLValue(context, it) }
@@ -12,16 +12,16 @@ class Outer {
} }
class Inner { class Inner {
private /* final field */ val additionalReceiverField0: Outer private /* final field */ val contextReceiverField0: Outer
constructor(<this>: Outer, arg: Any) /* primary */ { constructor(<this>: Outer, arg: Any) /* primary */ {
super/*Any*/() super/*Any*/()
<this>.#additionalReceiverField0 = <this> <this>.#contextReceiverField0 = <this>
/* <init>() */ /* <init>() */
} }
fun bar(): Int { fun bar(): Int {
return <this>.#additionalReceiverField0.<get-x>() return <this>.#contextReceiverField0.<get-x>()
} }
} }
@@ -31,13 +31,13 @@ FILE fqName:<root> fileName:/class.kt
$this: VALUE_PARAMETER name:<this> type:kotlin.Any $this: VALUE_PARAMETER name:<this> type:kotlin.Any
CLASS CLASS name:Inner modality:FINAL visibility:public superTypes:[kotlin.Any] CLASS CLASS name:Inner modality:FINAL visibility:public superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Inner $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Inner
FIELD FIELD_FOR_CLASS_CONTEXT_RECEIVER name:additionalReceiverField0 type:<root>.Outer visibility:private [final] FIELD FIELD_FOR_CLASS_CONTEXT_RECEIVER name:contextReceiverField0 type:<root>.Outer visibility:private [final]
CONSTRUCTOR visibility:public <> (<this>:<root>.Outer, arg:kotlin.Any) returnType:<root>.Inner [primary] CONSTRUCTOR visibility:public <> (<this>:<root>.Outer, arg:kotlin.Any) returnType:<root>.Inner [primary]
VALUE_PARAMETER name:<this> index:0 type:<root>.Outer VALUE_PARAMETER name:<this> index:0 type:<root>.Outer
VALUE_PARAMETER name:arg index:1 type:kotlin.Any VALUE_PARAMETER name:arg index:1 type:kotlin.Any
BLOCK_BODY BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any' DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
SET_FIELD 'FIELD FIELD_FOR_CLASS_CONTEXT_RECEIVER name:additionalReceiverField0 type:<root>.Outer visibility:private [final]' type=kotlin.Unit origin=null SET_FIELD 'FIELD FIELD_FOR_CLASS_CONTEXT_RECEIVER name:contextReceiverField0 type:<root>.Outer visibility:private [final]' type=kotlin.Unit origin=null
receiver: GET_VAR '<this>: <root>.Inner declared in <root>.Inner' type=<root>.Inner origin=null receiver: GET_VAR '<this>: <root>.Inner declared in <root>.Inner' type=<root>.Inner origin=null
value: GET_VAR '<this>: <root>.Outer declared in <root>.Inner.<init>' type=<root>.Outer origin=null value: GET_VAR '<this>: <root>.Outer declared in <root>.Inner.<init>' type=<root>.Outer origin=null
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Inner modality:FINAL visibility:public superTypes:[kotlin.Any]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Inner modality:FINAL visibility:public superTypes:[kotlin.Any]'
@@ -46,7 +46,7 @@ FILE fqName:<root> fileName:/class.kt
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun bar (): kotlin.Int declared in <root>.Inner' RETURN type=kotlin.Nothing from='public final fun bar (): kotlin.Int declared in <root>.Inner'
CALL 'public final fun <get-x> (): kotlin.Int declared in <root>.Outer' type=kotlin.Int origin=GET_PROPERTY CALL 'public final fun <get-x> (): kotlin.Int declared in <root>.Outer' type=kotlin.Int origin=GET_PROPERTY
$this: GET_FIELD 'FIELD FIELD_FOR_CLASS_CONTEXT_RECEIVER name:additionalReceiverField0 type:<root>.Outer visibility:private [final]' type=<root>.Outer origin=null $this: GET_FIELD 'FIELD FIELD_FOR_CLASS_CONTEXT_RECEIVER name:contextReceiverField0 type:<root>.Outer visibility:private [final]' type=<root>.Outer origin=null
receiver: GET_VAR '<this>: <root>.Inner declared in <root>.Inner.bar' type=<root>.Inner origin=null receiver: GET_VAR '<this>: <root>.Inner declared in <root>.Inner.bar' type=<root>.Inner origin=null
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden: overridden:
@@ -70,7 +70,7 @@ public class ClassConstructorDescriptorImpl extends FunctionDescriptorImpl imple
@NotNull List<TypeParameterDescriptor> typeParameterDescriptors @NotNull List<TypeParameterDescriptor> typeParameterDescriptors
) { ) {
super.initialize( super.initialize(
null, calculateDispatchReceiverParameter(), calculateAdditionalReceiverParameters(), null, calculateDispatchReceiverParameter(), calculateContextReceiverParameters(),
typeParameterDescriptors, typeParameterDescriptors,
unsubstitutedValueParameters, null, unsubstitutedValueParameters, null,
Modality.FINAL, visibility); Modality.FINAL, visibility);
@@ -98,7 +98,7 @@ public class ClassConstructorDescriptorImpl extends FunctionDescriptorImpl imple
} }
@NotNull @NotNull
List<ReceiverParameterDescriptor> calculateAdditionalReceiverParameters() { private List<ReceiverParameterDescriptor> calculateContextReceiverParameters() {
ClassDescriptor classDescriptor = getContainingDeclaration(); ClassDescriptor classDescriptor = getContainingDeclaration();
if (!classDescriptor.getContextReceivers().isEmpty()) { if (!classDescriptor.getContextReceivers().isEmpty()) {
return classDescriptor.getContextReceivers(); return classDescriptor.getContextReceivers();