From 3dbc5ddb05bb0062b7e1747cd3a29c1bb31cd207 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Mon, 10 Sep 2018 17:53:00 +0300 Subject: [PATCH] [KT-25003] Fix accessing property `COROUTINE_SUSPENDED` from stdlib coroutine --- .../kotlin/js/translate/utils/utils.kt | 56 ++++++++++++++++--- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/utils.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/utils.kt index 9b6ae899adc..aeaad418c85 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/utils.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/utils.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.js.translate.utils +import com.intellij.lang.ASTNode import com.intellij.psi.PsiElement import com.intellij.util.SmartList import org.jetbrains.kotlin.backend.common.COROUTINE_SUSPENDED_NAME @@ -12,13 +13,11 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.coroutinesIntrinsicsPackageFqName import org.jetbrains.kotlin.config.languageVersionSettings -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.PropertyDescriptor -import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.js.backend.ast.* import org.jetbrains.kotlin.js.backend.ast.metadata.* +import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator import org.jetbrains.kotlin.js.translate.context.Namer import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsicWithReceiverComputed @@ -28,7 +27,14 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.components.isActualParameterWithCorrespondingExpectedDefault +import org.jetbrains.kotlin.resolve.calls.model.ArgumentUnmapped +import org.jetbrains.kotlin.resolve.calls.model.DataFlowInfoForArguments import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall +import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument +import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus +import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind +import org.jetbrains.kotlin.resolve.scopes.receivers.Receiver +import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils @@ -167,12 +173,13 @@ fun JsFunction.fillCoroutineMetadata( .memberScope .getContributedVariables(COROUTINE_SUSPENDED_NAME, NoLookupLocation.FROM_BACKEND).first() - fun getCoroutinePropertyName(id: String) = - context.getNameForDescriptor(TranslationUtils.getCoroutineProperty(context, id)) + fun getCoroutinePropertyName(id: String) = context.getNameForDescriptor(TranslationUtils.getCoroutineProperty(context, id)) + + val suspendObject = CallTranslator.translateGet(context, resolveAccessorCall(suspendPropertyDescriptor, context), null) coroutineMetadata = CoroutineMetadata( doResumeName = context.getNameForDescriptor(TranslationUtils.getCoroutineDoResumeFunction(context)), - suspendObjectRef = ReferenceTranslator.translateAsValueReference(suspendPropertyDescriptor, context), + suspendObjectRef = suspendObject, baseClassRef = ReferenceTranslator.translateAsTypeReference(TranslationUtils.getCoroutineBaseClass(context), context), stateName = getCoroutinePropertyName("state"), exceptionStateName = getCoroutinePropertyName("exceptionState"), @@ -185,6 +192,41 @@ fun JsFunction.fillCoroutineMetadata( ) } +private fun resolveAccessorCall( + suspendPropertyDescriptor: PropertyDescriptor, + context: TranslationContext +): ResolvedCall { + return object : ResolvedCall { + override fun getStatus() = ResolutionStatus.SUCCESS + + override fun getCall(): Call = object : Call { + override fun getCallOperationNode(): ASTNode? = null + override fun getExplicitReceiver(): Receiver? = null + override fun getDispatchReceiver(): ReceiverValue? = null + override fun getCalleeExpression(): KtExpression? = null + override fun getValueArgumentList(): KtValueArgumentList? = null + override fun getValueArguments(): List = emptyList() + override fun getFunctionLiteralArguments(): List = emptyList() + override fun getTypeArguments(): List = emptyList() + override fun getTypeArgumentList(): KtTypeArgumentList? = null + override fun getCallElement(): KtElement = KtPsiFactory(context.config.project).createExpression("COROUTINE_SUSPENDED") + override fun getCallType(): Call.CallType = Call.CallType.DEFAULT + } + + override fun getCandidateDescriptor() = suspendPropertyDescriptor + override fun getResultingDescriptor() = suspendPropertyDescriptor + override fun getExtensionReceiver() = null + override fun getDispatchReceiver() = null + override fun getExplicitReceiverKind() = ExplicitReceiverKind.NO_EXPLICIT_RECEIVER + override fun getValueArguments(): MutableMap = mutableMapOf() + override fun getValueArgumentsByIndex(): MutableList = mutableListOf() + override fun getArgumentMapping(valueArgument: ValueArgument) = ArgumentUnmapped + override fun getTypeArguments(): MutableMap = mutableMapOf() + override fun getDataFlowInfoForArguments(): DataFlowInfoForArguments = throw IllegalStateException() + override fun getSmartCastDispatchReceiverType(): KotlinType? = null + } +} + fun definePackageAlias(name: String, varName: JsName, tag: String, parentRef: JsExpression): JsStatement { val selfRef = JsNameRef(name, parentRef) val rhs = JsAstUtils.or(selfRef, JsAstUtils.assignment(selfRef.deepCopy(), JsObjectLiteral(false)))