[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 com.intellij.psi.PsiElement;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
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.*;
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
|
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.TypeAliasConstructorDescriptor;
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl;
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation;
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation;
|
||||||
import org.jetbrains.kotlin.js.backend.ast.*;
|
import org.jetbrains.kotlin.js.backend.ast.*;
|
||||||
import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties;
|
import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties;
|
||||||
@@ -68,7 +70,7 @@ public class TranslationContext {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private final ClassDescriptor classDescriptor;
|
private final ClassDescriptor classDescriptor;
|
||||||
@Nullable
|
@Nullable
|
||||||
private final VariableDescriptor continuationParameterDescriptor;
|
private final ValueParameterDescriptor continuationParameterDescriptor;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private InlineFunctionContext inlineFunctionContext;
|
private InlineFunctionContext inlineFunctionContext;
|
||||||
@@ -115,7 +117,7 @@ public class TranslationContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private VariableDescriptor calculateContinuationParameter() {
|
private ValueParameterDescriptor calculateContinuationParameter() {
|
||||||
if (parent != null && parent.declarationDescriptor == declarationDescriptor) {
|
if (parent != null && parent.declarationDescriptor == declarationDescriptor) {
|
||||||
return parent.continuationParameterDescriptor;
|
return parent.continuationParameterDescriptor;
|
||||||
}
|
}
|
||||||
@@ -127,12 +129,10 @@ public class TranslationContext {
|
|||||||
getCurrentModule(), NoLookupLocation.FROM_BACKEND,
|
getCurrentModule(), NoLookupLocation.FROM_BACKEND,
|
||||||
getLanguageVersionSettings().supportsFeature(LanguageFeature.ReleaseCoroutines));
|
getLanguageVersionSettings().supportsFeature(LanguageFeature.ReleaseCoroutines));
|
||||||
|
|
||||||
return new LocalVariableDescriptor(
|
return new ValueParameterDescriptorImpl(function, null, function.getValueParameters().size(),
|
||||||
declarationDescriptor,
|
Annotations.Companion.getEMPTY(), Name.identifier("continuation"),
|
||||||
Annotations.Companion.getEMPTY(),
|
continuationDescriptor.getDefaultType(), false, false, false, null,
|
||||||
Name.identifier("continuation"),
|
SourceElement.NO_SOURCE);
|
||||||
continuationDescriptor.getDefaultType(),
|
|
||||||
SourceElement.NO_SOURCE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -858,7 +858,7 @@ public class TranslationContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public VariableDescriptor getContinuationParameterDescriptor() {
|
public ValueParameterDescriptor getContinuationParameterDescriptor() {
|
||||||
return continuationParameterDescriptor;
|
return continuationParameterDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -207,7 +207,7 @@ class DelegationTranslator(
|
|||||||
delegateName: JsName
|
delegateName: JsName
|
||||||
) {
|
) {
|
||||||
val delegateRef = JsNameRef(delegateName, JsThisRef())
|
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)
|
context().addDeclarationStatement(statement)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -370,8 +370,8 @@ public final class TranslationUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static VariableDescriptor getEnclosingContinuationParameter(@NotNull TranslationContext context) {
|
public static ValueParameterDescriptor getEnclosingContinuationParameter(@NotNull TranslationContext context) {
|
||||||
VariableDescriptor result = context.getContinuationParameterDescriptor();
|
ValueParameterDescriptor result = context.getContinuationParameterDescriptor();
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
assert context.getParent() != null;
|
assert context.getParent() != null;
|
||||||
result = getEnclosingContinuationParameter(context.getParent());
|
result = getEnclosingContinuationParameter(context.getParent());
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.js.translate.utils
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.util.SmartList
|
import com.intellij.util.SmartList
|
||||||
import org.jetbrains.kotlin.backend.common.COROUTINE_SUSPENDED_NAME
|
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.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.config.coroutinesIntrinsicsPackageFqName
|
import org.jetbrains.kotlin.config.coroutinesIntrinsicsPackageFqName
|
||||||
@@ -61,7 +62,11 @@ fun generateDelegateCall(
|
|||||||
args.add(JsNameRef(extensionFunctionReceiverName))
|
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 paramName = param.name.asString()
|
||||||
val jsParamName = JsScope.declareTemporaryName(paramName)
|
val jsParamName = JsScope.declareTemporaryName(paramName)
|
||||||
parameters.add(JsParameter(jsParamName))
|
parameters.add(JsParameter(jsParamName))
|
||||||
@@ -80,6 +85,7 @@ fun generateDelegateCall(
|
|||||||
val functionObject = simpleReturnFunction(context.scope(), invocation)
|
val functionObject = simpleReturnFunction(context.scope(), invocation)
|
||||||
functionObject.source = source?.finalElement
|
functionObject.source = source?.finalElement
|
||||||
functionObject.parameters.addAll(parameters)
|
functionObject.parameters.addAll(parameters)
|
||||||
|
functionObject.onlyIf(JsFunction::isSuspend) { it.fillCoroutineMetadata(context, fromDescriptor, false) }
|
||||||
|
|
||||||
val fromFunctionName = fromDescriptor.getNameForFunctionWithPossibleDefaultParam()
|
val fromFunctionName = fromDescriptor.getNameForFunctionWithPossibleDefaultParam()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user