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.resolve.calls.tasks;
018
019 import com.intellij.util.SmartList;
020 import kotlin.jvm.functions.Function0;
021 import org.jetbrains.annotations.NotNull;
022 import org.jetbrains.annotations.Nullable;
023 import org.jetbrains.kotlin.descriptors.CallableDescriptor;
024 import org.jetbrains.kotlin.psi.Call;
025 import org.jetbrains.kotlin.resolve.BindingTrace;
026 import org.jetbrains.kotlin.resolve.StatementFilter;
027 import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker;
028 import org.jetbrains.kotlin.resolve.calls.context.*;
029 import org.jetbrains.kotlin.resolve.calls.model.MutableDataFlowInfoForArguments;
030 import org.jetbrains.kotlin.resolve.calls.model.MutableResolvedCall;
031 import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
032 import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
033 import org.jetbrains.kotlin.types.KotlinType;
034
035 import java.util.Collection;
036
037 /**
038 * Stores candidates for call resolution.
039 */
040 public class ResolutionTask<D extends CallableDescriptor, F extends D> extends CallResolutionContext<ResolutionTask<D, F>> {
041 private final Function0<Collection<ResolutionCandidate<D>>> lazyCandidates;
042 private final Collection<MutableResolvedCall<F>> resolvedCalls;
043 public final TracingStrategy tracing;
044
045 private ResolutionTask(
046 @NotNull Function0<Collection<ResolutionCandidate<D>>> lazyCandidates,
047 @NotNull TracingStrategy tracing,
048 @NotNull BindingTrace trace,
049 @NotNull LexicalScope scope,
050 @NotNull Call call,
051 @NotNull KotlinType expectedType,
052 @NotNull DataFlowInfo dataFlowInfo,
053 @NotNull ContextDependency contextDependency,
054 @NotNull CheckArgumentTypesMode checkArguments,
055 @NotNull ResolutionResultsCache resolutionResultsCache,
056 @Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments,
057 @NotNull CallChecker callChecker,
058 @NotNull StatementFilter statementFilter,
059 @NotNull Collection<MutableResolvedCall<F>> resolvedCalls,
060 boolean isAnnotationContext,
061 boolean collectAllCandidates
062 ) {
063 super(trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments, resolutionResultsCache,
064 dataFlowInfoForArguments, callChecker, statementFilter, isAnnotationContext, collectAllCandidates);
065 this.lazyCandidates = lazyCandidates;
066 this.resolvedCalls = resolvedCalls;
067 this.tracing = tracing;
068 }
069
070 public ResolutionTask(
071 @NotNull BasicCallResolutionContext context,
072 @NotNull TracingStrategy tracing,
073 @NotNull Function0<Collection<ResolutionCandidate<D>>> lazyCandidates
074 ) {
075 this(lazyCandidates, tracing,
076 context.trace, context.scope, context.call,
077 context.expectedType, context.dataFlowInfo, context.contextDependency, context.checkArguments,
078 context.resolutionResultsCache, context.dataFlowInfoForArguments,
079 context.callChecker,
080 context.statementFilter, new SmartList<MutableResolvedCall<F>>(),
081 context.isAnnotationContext, context.collectAllCandidates);
082 }
083
084 @NotNull
085 public Collection<ResolutionCandidate<D>> getCandidates() {
086 return lazyCandidates.invoke();
087 }
088
089 public void addResolvedCall(@NotNull MutableResolvedCall<F> resolvedCall) {
090 resolvedCalls.add(resolvedCall);
091 }
092
093 @NotNull
094 public Collection<MutableResolvedCall<F>> getResolvedCalls() {
095 return resolvedCalls;
096 }
097
098 @Override
099 protected ResolutionTask<D, F> create(
100 @NotNull BindingTrace trace,
101 @NotNull LexicalScope scope,
102 @NotNull DataFlowInfo dataFlowInfo,
103 @NotNull KotlinType expectedType,
104 @NotNull ContextDependency contextDependency,
105 @NotNull ResolutionResultsCache resolutionResultsCache,
106 @NotNull StatementFilter statementFilter,
107 boolean collectAllCandidates
108 ) {
109 return new ResolutionTask<D, F>(
110 lazyCandidates, tracing, trace, scope, call, expectedType, dataFlowInfo, contextDependency, checkArguments,
111 resolutionResultsCache, dataFlowInfoForArguments,
112 callChecker,
113 statementFilter, resolvedCalls,
114 isAnnotationContext, collectAllCandidates);
115 }
116
117 @Override
118 public String toString() {
119 return lazyCandidates.toString();
120 }
121 }