From de9aea6e983ac0eafd098eb34fcf63bc9263f62b Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Mon, 21 May 2018 00:13:18 +0300 Subject: [PATCH] [JS BE] Fix delegation of suspend method member (KT-23094) --- .../translate/context/TranslationContext.java | 22 +++++++++---------- .../declaration/DelegationTranslator.kt | 2 +- .../js/translate/utils/TranslationUtils.java | 4 ++-- .../kotlin/js/translate/utils/utils.kt | 8 ++++++- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java index d09f9f58fc5..5eb83d4b406 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java @@ -8,11 +8,13 @@ package org.jetbrains.kotlin.js.translate.context; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.config.*; +import org.jetbrains.kotlin.config.CommonConfigurationKeysKt; +import org.jetbrains.kotlin.config.LanguageFeature; +import org.jetbrains.kotlin.config.LanguageVersionSettings; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; -import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor; import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor; +import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.js.backend.ast.*; import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties; @@ -68,7 +70,7 @@ public class TranslationContext { @Nullable private final ClassDescriptor classDescriptor; @Nullable - private final VariableDescriptor continuationParameterDescriptor; + private final ValueParameterDescriptor continuationParameterDescriptor; @Nullable private InlineFunctionContext inlineFunctionContext; @@ -115,7 +117,7 @@ public class TranslationContext { } } - private VariableDescriptor calculateContinuationParameter() { + private ValueParameterDescriptor calculateContinuationParameter() { if (parent != null && parent.declarationDescriptor == declarationDescriptor) { return parent.continuationParameterDescriptor; } @@ -127,12 +129,10 @@ public class TranslationContext { getCurrentModule(), NoLookupLocation.FROM_BACKEND, getLanguageVersionSettings().supportsFeature(LanguageFeature.ReleaseCoroutines)); - return new LocalVariableDescriptor( - declarationDescriptor, - Annotations.Companion.getEMPTY(), - Name.identifier("continuation"), - continuationDescriptor.getDefaultType(), - SourceElement.NO_SOURCE); + return new ValueParameterDescriptorImpl(function, null, function.getValueParameters().size(), + Annotations.Companion.getEMPTY(), Name.identifier("continuation"), + continuationDescriptor.getDefaultType(), false, false, false, null, + SourceElement.NO_SOURCE); } } return null; @@ -858,7 +858,7 @@ public class TranslationContext { } @Nullable - public VariableDescriptor getContinuationParameterDescriptor() { + public ValueParameterDescriptor getContinuationParameterDescriptor() { return continuationParameterDescriptor; } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt index 2764acded44..182c60c4e12 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt @@ -207,7 +207,7 @@ class DelegationTranslator( delegateName: JsName ) { val delegateRef = JsNameRef(delegateName, JsThisRef()) - val statement = generateDelegateCall(classDescriptor, descriptor, overriddenDescriptor, delegateRef, context(), true, specifier) + val statement = generateDelegateCall(classDescriptor, descriptor, overriddenDescriptor, delegateRef, context().newDeclaration(overriddenDescriptor), true, specifier) context().addDeclarationStatement(statement) } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java index d5b93d49ee9..37233de1a0a 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java @@ -370,8 +370,8 @@ public final class TranslationUtils { } @NotNull - public static VariableDescriptor getEnclosingContinuationParameter(@NotNull TranslationContext context) { - VariableDescriptor result = context.getContinuationParameterDescriptor(); + public static ValueParameterDescriptor getEnclosingContinuationParameter(@NotNull TranslationContext context) { + ValueParameterDescriptor result = context.getContinuationParameterDescriptor(); if (result == null) { assert context.getParent() != null; result = getEnclosingContinuationParameter(context.getParent()); 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 afc9a76296b..592ef1274e9 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 @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.js.translate.utils import com.intellij.psi.PsiElement import com.intellij.util.SmartList import org.jetbrains.kotlin.backend.common.COROUTINE_SUSPENDED_NAME +import org.jetbrains.kotlin.backend.common.onlyIf import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.coroutinesIntrinsicsPackageFqName @@ -61,7 +62,11 @@ fun generateDelegateCall( args.add(JsNameRef(extensionFunctionReceiverName)) } - for (param in fromDescriptor.valueParameters) { + val valueParameterDescriptors = if (fromDescriptor.isSuspend) { + fromDescriptor.valueParameters + context.continuationParameterDescriptor!! + } else fromDescriptor.valueParameters + + for (param in valueParameterDescriptors) { val paramName = param.name.asString() val jsParamName = JsScope.declareTemporaryName(paramName) parameters.add(JsParameter(jsParamName)) @@ -80,6 +85,7 @@ fun generateDelegateCall( val functionObject = simpleReturnFunction(context.scope(), invocation) functionObject.source = source?.finalElement functionObject.parameters.addAll(parameters) + functionObject.onlyIf(JsFunction::isSuspend) { it.fillCoroutineMetadata(context, fromDescriptor, false) } val fromFunctionName = fromDescriptor.getNameForFunctionWithPossibleDefaultParam()