/* * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jetbrains.kotlin.resolve.calls.tasks; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.CallableDescriptor; import org.jetbrains.kotlin.psi.Call; import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.kotlin.types.TypeSubstitutor; public class ResolutionCandidate<D extends CallableDescriptor> { private final Call call; private final D candidateDescriptor; private final TypeSubstitutor knownTypeParametersResultingSubstitutor; private ReceiverValue dispatchReceiver; // receiver object of a method private ExplicitReceiverKind explicitReceiverKind; private ResolutionCandidate( @NotNull Call call, @NotNull D descriptor, @Nullable ReceiverValue dispatchReceiver, @NotNull ExplicitReceiverKind explicitReceiverKind, @Nullable TypeSubstitutor knownTypeParametersResultingSubstitutor ) { this.call = call; this.candidateDescriptor = descriptor; this.dispatchReceiver = dispatchReceiver; this.explicitReceiverKind = explicitReceiverKind; this.knownTypeParametersResultingSubstitutor = knownTypeParametersResultingSubstitutor; } public static <D extends CallableDescriptor> ResolutionCandidate<D> create( @NotNull Call call, @NotNull D descriptor ) { return new ResolutionCandidate<>(call, descriptor, null, ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, null); } public static <D extends CallableDescriptor> ResolutionCandidate<D> create( @NotNull Call call, @NotNull D descriptor, @Nullable TypeSubstitutor knownTypeParametersResultingSubstitutor ) { return new ResolutionCandidate<>(call, descriptor, null, ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, knownTypeParametersResultingSubstitutor); } public static <D extends CallableDescriptor> ResolutionCandidate<D> create( @NotNull Call call, @NotNull D descriptor, @Nullable ReceiverValue dispatchReceiver, @NotNull ExplicitReceiverKind explicitReceiverKind, @Nullable TypeSubstitutor knownTypeParametersResultingSubstitutor ) { return new ResolutionCandidate<>(call, descriptor, dispatchReceiver, explicitReceiverKind, knownTypeParametersResultingSubstitutor); } public void setDispatchReceiver(@Nullable ReceiverValue dispatchReceiver) { this.dispatchReceiver = dispatchReceiver; } public void setExplicitReceiverKind(@NotNull ExplicitReceiverKind explicitReceiverKind) { this.explicitReceiverKind = explicitReceiverKind; } @NotNull public Call getCall() { return call; } @NotNull public D getDescriptor() { return candidateDescriptor; } @Nullable public ReceiverValue getDispatchReceiver() { return dispatchReceiver; } @NotNull public ExplicitReceiverKind getExplicitReceiverKind() { return explicitReceiverKind; } @Nullable public TypeSubstitutor getKnownTypeParametersResultingSubstitutor() { return knownTypeParametersResultingSubstitutor; } @Override public String toString() { return candidateDescriptor.toString(); } }