diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java index bc738c41ed3..c06d7d96fbc 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.codegen.intrinsics.JavaClassProperty; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.JetTypeMapper; import org.jetbrains.kotlin.descriptors.*; +import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor; import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor; import org.jetbrains.kotlin.psi.KtExpression; @@ -493,10 +494,14 @@ public abstract class StackValue { @Nullable Callable callableMethod ) { ReceiverValue callDispatchReceiver = resolvedCall.getDispatchReceiver(); + CallableDescriptor descriptor = resolvedCall.getResultingDescriptor(); + if (descriptor instanceof SyntheticFieldDescriptor) { + callDispatchReceiver = ((SyntheticFieldDescriptor) descriptor).getDispatchReceiverForBackend(); + } + ReceiverValue callExtensionReceiver = resolvedCall.getExtensionReceiver(); if (callDispatchReceiver.exists() || callExtensionReceiver.exists() || isLocalFunCall(callableMethod) || isCallToMemberObjectImportedByName(resolvedCall)) { - CallableDescriptor descriptor = resolvedCall.getResultingDescriptor(); ReceiverParameterDescriptor dispatchReceiverParameter = descriptor.getDispatchReceiverParameter(); ReceiverParameterDescriptor extensionReceiverParameter = descriptor.getExtensionReceiverParameter(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt index e456fd34e91..b2767aceb74 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.source.toSourceElement class SyntheticFieldDescriptor private constructor( @@ -34,7 +35,9 @@ class SyntheticFieldDescriptor private constructor( constructor(accessorDescriptor: PropertyAccessorDescriptor, property: KtProperty): this(accessorDescriptor.correspondingProperty, accessorDescriptor, property) - override fun getDispatchReceiverParameter() = propertyDescriptor.dispatchReceiverParameter + override fun getDispatchReceiverParameter() = null + + fun getDispatchReceiverForBackend() = propertyDescriptor.dispatchReceiverParameter?.value ?: ReceiverValue.NO_RECEIVER companion object { val NAME = Name.identifier("field") diff --git a/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.instructions index 371ecbd086c..e269cd5fdbf 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.instructions @@ -34,17 +34,16 @@ get() { } --------------------- L3: - 3 INIT: in: {} out: {} - 4 mark({ return field }) - magic[IMPLICIT_RECEIVER](field) -> USE: in: {field=READ} out: {field=READ} - r(field|) -> USE: in: {} out: {field=READ} - ret(*|) L4 + 3 INIT: in: {} out: {} + 4 mark({ return field }) USE: in: {field=READ} out: {field=READ} + r(field) -> USE: in: {} out: {field=READ} + ret(*|) L4 L4: 3 error: sink: - USE: in: {} out: {} + USE: in: {} out: {} ===================== == set_a == set(v: Int) { @@ -56,14 +55,13 @@ L6: v(v: Int) INIT: in: {} out: {v=D} magic[FAKE_INITIALIZER](v: Int) -> INIT: in: {v=D} out: {v=D} w(v|) INIT: in: {v=D} out: {v=ID} - 4 mark({ field = v }) INIT: in: {v=ID} out: {v=ID} - magic[IMPLICIT_RECEIVER](field) -> USE: in: {field=ONLY_WRITTEN_NEVER_READ, v=READ} out: {field=ONLY_WRITTEN_NEVER_READ, v=READ} - r(v) -> USE: in: {field=ONLY_WRITTEN_NEVER_READ} out: {field=ONLY_WRITTEN_NEVER_READ, v=READ} - w(field|, ) INIT: in: {v=ID} out: {field=I, v=ID} USE: in: {} out: {field=ONLY_WRITTEN_NEVER_READ} + 4 mark({ field = v }) INIT: in: {v=ID} out: {v=ID} USE: in: {field=ONLY_WRITTEN_NEVER_READ, v=READ} out: {field=ONLY_WRITTEN_NEVER_READ, v=READ} + r(v) -> USE: in: {field=ONLY_WRITTEN_NEVER_READ} out: {field=ONLY_WRITTEN_NEVER_READ, v=READ} + w(field|) INIT: in: {v=ID} out: {field=I, v=ID} USE: in: {} out: {field=ONLY_WRITTEN_NEVER_READ} L7: 3 INIT: in: {field=I, v=ID} out: {field=I, v=ID} error: INIT: in: {} out: {} sink: INIT: in: {field=I, v=ID} out: {field=I, v=ID} USE: in: {} out: {} -===================== \ No newline at end of file +===================== diff --git a/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.values b/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.values index 5260759ff37..64cadabf481 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.values +++ b/compiler/testData/cfg-variables/lexicalScopes/propertyAccessorScope.values @@ -17,10 +17,9 @@ get() { return field } --------------------- - : A NEW: magic[IMPLICIT_RECEIVER](field) -> -field : Int NEW: r(field|) -> -return field !: * -{ return field } !: * COPY +field : Int NEW: r(field) -> +return field !: * +{ return field } !: * COPY ===================== == set_a == set(v: Int) { @@ -28,8 +27,7 @@ set(v: Int) { } --------------------- : Int NEW: magic[FAKE_INITIALIZER](v: Int) -> - : A NEW: magic[IMPLICIT_RECEIVER](field) -> -v : Int NEW: r(v) -> -field = v !: * -{ field = v } !: * COPY +v : Int NEW: r(v) -> +field = v !: * +{ field = v } !: * COPY =====================