[JS BE] Fix delegation of suspend method member (KT-23094)
This commit is contained in:
committed by
Roman Artemev
parent
8862b26bbd
commit
de9aea6e98
+11
-11
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user