001 /*
002 * Copyright 2010-2015 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.jetbrains.kotlin.codegen.context;
018
019 import org.jetbrains.annotations.NotNull;
020 import org.jetbrains.annotations.Nullable;
021 import org.jetbrains.kotlin.codegen.OwnerKind;
022 import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
023 import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
024
025 import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.anonymousClassForCallable;
026
027 public class ClosureContext extends ClassContext {
028 private final FunctionDescriptor functionDescriptor;
029 private final FunctionDescriptor originalSuspendLambdaDescriptor;
030
031 public ClosureContext(
032 @NotNull KotlinTypeMapper typeMapper,
033 @NotNull FunctionDescriptor functionDescriptor,
034 @Nullable CodegenContext parentContext,
035 @NotNull LocalLookup localLookup,
036 // original suspend lambda descriptor
037 @Nullable FunctionDescriptor originalSuspendLambdaDescriptor
038 ) {
039 super(typeMapper,
040 anonymousClassForCallable(
041 typeMapper.getBindingContext(), originalSuspendLambdaDescriptor != null ? originalSuspendLambdaDescriptor : functionDescriptor),
042 OwnerKind.IMPLEMENTATION, parentContext, localLookup);
043
044 this.functionDescriptor = functionDescriptor;
045 this.originalSuspendLambdaDescriptor = originalSuspendLambdaDescriptor;
046 }
047
048 public ClosureContext(
049 @NotNull KotlinTypeMapper typeMapper,
050 @NotNull FunctionDescriptor functionDescriptor,
051 @Nullable CodegenContext parentContext,
052 @NotNull LocalLookup localLookup
053 ) {
054 this(typeMapper, functionDescriptor, parentContext, localLookup, null);
055 }
056
057 @NotNull
058 public FunctionDescriptor getFunctionDescriptor() {
059 return functionDescriptor;
060 }
061
062 @Override
063 public String toString() {
064 return "Closure: " + getContextDescriptor();
065 }
066
067 @Nullable
068 public FunctionDescriptor getOriginalSuspendLambdaDescriptor() {
069 return originalSuspendLambdaDescriptor;
070 }
071 }