[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
|
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,
|
||||||
|
|||||||
+1
-1
@@ -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()
|
||||||
|
|
||||||
+2
-2
@@ -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.
|
||||||
|
|||||||
+1
-1
@@ -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)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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:
|
||||||
|
|||||||
+2
-2
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user