Minor. Refine naming for original suspend lambda descriptors
Also inline some methods with single usage
This commit is contained in:
@@ -164,23 +164,11 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static FunctionDescriptor getOriginalSuspendDescriptor(MethodContext context) {
|
||||
FunctionDescriptor originalCoroutineDescriptor = getOriginalCoroutineDescriptor(context);
|
||||
if (originalCoroutineDescriptor != null) return originalCoroutineDescriptor;
|
||||
|
||||
if (context.getFunctionDescriptor().isSuspend()) {
|
||||
return CoroutineCodegenUtilKt.unwrapInitialDescriptorForSuspendFunction(context.getFunctionDescriptor());
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static FunctionDescriptor getOriginalCoroutineDescriptor(MethodContext context) {
|
||||
private static FunctionDescriptor getOriginalSuspendLambdaDescriptorFromContext(MethodContext context) {
|
||||
if ((context.getParentContext() instanceof ClosureContext) &&
|
||||
(context.getParentContext().closure != null) &&
|
||||
context.getParentContext().closure.isSuspend()) {
|
||||
return ((ClosureContext) context.getParentContext()).getCoroutineDescriptor();
|
||||
return ((ClosureContext) context.getParentContext()).getOriginalSuspendLambdaDescriptor();
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -1754,7 +1742,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
||||
if (captureReceiver != null) {
|
||||
StackValue capturedReceiver =
|
||||
functionReferenceReceiver != null ? functionReferenceReceiver :
|
||||
generateExtensionReceiver(unwrapOriginalLambdaDescriptorForCoroutine(context));
|
||||
generateExtensionReceiver(unwrapOriginalDescriptorForSuspendLambda(context));
|
||||
callGenerator.putCapturedValueOnStack(capturedReceiver, capturedReceiver.type, paramIndex++);
|
||||
}
|
||||
|
||||
@@ -1793,9 +1781,14 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static CallableDescriptor unwrapOriginalLambdaDescriptorForCoroutine(@NotNull MethodContext context) {
|
||||
FunctionDescriptor coroutine = getOriginalSuspendDescriptor(context);
|
||||
if (coroutine != null) return coroutine;
|
||||
private static CallableDescriptor unwrapOriginalDescriptorForSuspendLambda(@NotNull MethodContext context) {
|
||||
FunctionDescriptor originalSuspendLambdaDescriptor = getOriginalSuspendLambdaDescriptorFromContext(context);
|
||||
if (originalSuspendLambdaDescriptor != null) return originalSuspendLambdaDescriptor;
|
||||
|
||||
if (context.getFunctionDescriptor().isSuspend()) {
|
||||
return CoroutineCodegenUtilKt.unwrapInitialDescriptorForSuspendFunction(context.getFunctionDescriptor());
|
||||
}
|
||||
|
||||
return context.getFunctionDescriptor();
|
||||
}
|
||||
|
||||
@@ -2246,9 +2239,9 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
||||
public void returnExpression(KtExpression expr) {
|
||||
boolean isBlockedNamedFunction = expr instanceof KtBlockExpression && expr.getParent() instanceof KtNamedFunction;
|
||||
|
||||
FunctionDescriptor originalCoroutineDescriptor = getOriginalCoroutineDescriptor(context);
|
||||
FunctionDescriptor originalSuspendLambdaDescriptor = getOriginalSuspendLambdaDescriptorFromContext(context);
|
||||
boolean isVoidCoroutineLambda =
|
||||
originalCoroutineDescriptor != null && TypeSignatureMappingKt.hasVoidReturnType(originalCoroutineDescriptor);
|
||||
originalSuspendLambdaDescriptor != null && TypeSignatureMappingKt.hasVoidReturnType(originalSuspendLambdaDescriptor);
|
||||
|
||||
// If generating body for named block-bodied function or Unit-typed coroutine lambda, generate it as sequence of statements
|
||||
Type typeForExpression =
|
||||
|
||||
@@ -26,23 +26,23 @@ import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.anonymousClass
|
||||
|
||||
public class ClosureContext extends ClassContext {
|
||||
private final FunctionDescriptor functionDescriptor;
|
||||
private final FunctionDescriptor coroutineDescriptor;
|
||||
private final FunctionDescriptor originalSuspendLambdaDescriptor;
|
||||
|
||||
public ClosureContext(
|
||||
@NotNull KotlinTypeMapper typeMapper,
|
||||
@NotNull FunctionDescriptor functionDescriptor,
|
||||
@Nullable CodegenContext parentContext,
|
||||
@NotNull LocalLookup localLookup,
|
||||
// original coroutine lambda descriptor having return type T (the type that can be returned within lambda)
|
||||
@Nullable FunctionDescriptor coroutineDescriptor
|
||||
// original suspend lambda descriptor
|
||||
@Nullable FunctionDescriptor originalSuspendLambdaDescriptor
|
||||
) {
|
||||
super(typeMapper,
|
||||
anonymousClassForCallable(
|
||||
typeMapper.getBindingContext(), coroutineDescriptor != null ? coroutineDescriptor : functionDescriptor),
|
||||
typeMapper.getBindingContext(), originalSuspendLambdaDescriptor != null ? originalSuspendLambdaDescriptor : functionDescriptor),
|
||||
OwnerKind.IMPLEMENTATION, parentContext, localLookup);
|
||||
|
||||
this.functionDescriptor = functionDescriptor;
|
||||
this.coroutineDescriptor = coroutineDescriptor;
|
||||
this.originalSuspendLambdaDescriptor = originalSuspendLambdaDescriptor;
|
||||
}
|
||||
|
||||
public ClosureContext(
|
||||
@@ -65,7 +65,7 @@ public class ClosureContext extends ClassContext {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public FunctionDescriptor getCoroutineDescriptor() {
|
||||
return coroutineDescriptor;
|
||||
public FunctionDescriptor getOriginalSuspendLambdaDescriptor() {
|
||||
return originalSuspendLambdaDescriptor;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -340,14 +340,14 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
|
||||
|
||||
@NotNull
|
||||
public ClosureContext intoCoroutineClosure(
|
||||
// copy of lambda descriptor that have Continuation<Unit> return type (as it's ep)
|
||||
@NotNull FunctionDescriptor funDescriptorReturningContinuation,
|
||||
// original coroutine lambda descriptor having return type T (the type that can be returned within lambda)
|
||||
@NotNull FunctionDescriptor coroutineLambdaDescriptor,
|
||||
// copy of lambda descriptor that has an additional value parameter Continuation<T>
|
||||
@NotNull FunctionDescriptor jvmViewOfSuspendLambda,
|
||||
// original coroutine lambda descriptor
|
||||
@NotNull FunctionDescriptor originalSuspendLambdaDescriptor,
|
||||
@NotNull LocalLookup localLookup,
|
||||
@NotNull KotlinTypeMapper typeMapper
|
||||
) {
|
||||
return new ClosureContext(typeMapper, funDescriptorReturningContinuation, this, localLookup, coroutineLambdaDescriptor);
|
||||
return new ClosureContext(typeMapper, jvmViewOfSuspendLambda, this, localLookup, originalSuspendLambdaDescriptor);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
@@ -319,22 +319,22 @@ class CoroutineCodegen(
|
||||
@JvmStatic
|
||||
fun createByLambda(
|
||||
expressionCodegen: ExpressionCodegen,
|
||||
originalCoroutineLambdaDescriptor: FunctionDescriptor,
|
||||
originalSuspendLambdaDescriptor: FunctionDescriptor,
|
||||
declaration: KtElement,
|
||||
classBuilder: ClassBuilder
|
||||
): ClosureCodegen? {
|
||||
if (declaration !is KtFunctionLiteral) return null
|
||||
if (!originalCoroutineLambdaDescriptor.isSuspendLambda) return null
|
||||
if (!originalSuspendLambdaDescriptor.isSuspendLambda) return null
|
||||
|
||||
return CoroutineCodegen(
|
||||
expressionCodegen,
|
||||
declaration,
|
||||
expressionCodegen.context.intoCoroutineClosure(
|
||||
getOrCreateJvmSuspendFunctionView(originalCoroutineLambdaDescriptor, expressionCodegen.state.bindingContext),
|
||||
originalCoroutineLambdaDescriptor, expressionCodegen, expressionCodegen.state.typeMapper
|
||||
getOrCreateJvmSuspendFunctionView(originalSuspendLambdaDescriptor, expressionCodegen.state.bindingContext),
|
||||
originalSuspendLambdaDescriptor, expressionCodegen, expressionCodegen.state.typeMapper
|
||||
),
|
||||
classBuilder,
|
||||
originalCoroutineLambdaDescriptor
|
||||
originalSuspendLambdaDescriptor
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -480,9 +480,9 @@ public class InlineCodegen extends CallGenerator {
|
||||
@NotNull
|
||||
private static CallableMemberDescriptor getLabelOwnerDescriptor(@NotNull MethodContext context) {
|
||||
if (context.getParentContext() instanceof ClosureContext &&
|
||||
((ClosureContext) context.getParentContext()).getCoroutineDescriptor() != null) {
|
||||
((ClosureContext) context.getParentContext()).getOriginalSuspendLambdaDescriptor() != null) {
|
||||
//noinspection ConstantConditions
|
||||
return ((ClosureContext) context.getParentContext()).getCoroutineDescriptor();
|
||||
return ((ClosureContext) context.getParentContext()).getOriginalSuspendLambdaDescriptor();
|
||||
}
|
||||
|
||||
return context.getContextDescriptor();
|
||||
|
||||
Reference in New Issue
Block a user