Minor. Refine naming for original suspend lambda descriptors

Also inline some methods with single usage
This commit is contained in:
Denis Zharkov
2017-01-22 14:56:06 +03:00
parent 02b40326cc
commit 131c008ba3
5 changed files with 32 additions and 39 deletions
@@ -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();