[JS BE] Fix delegation of suspend method member (KT-23094)

This commit is contained in:
Roman Artemev
2018-05-21 00:13:18 +03:00
committed by Roman Artemev
parent 8862b26bbd
commit de9aea6e98
4 changed files with 21 additions and 15 deletions
@@ -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;
}
@@ -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)
}
}
@@ -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());
@@ -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()