001/*
002 * Copyright 2010-2013 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
017package org.jetbrains.jet.lang.resolve.calls.tasks;
018
019import org.jetbrains.annotations.NotNull;
020import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
021import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorWithVisibility;
022import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
023import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
024import org.jetbrains.jet.lang.psi.JetExpression;
025import org.jetbrains.jet.lang.resolve.BindingTrace;
026import org.jetbrains.jet.lang.resolve.calls.inference.InferenceErrorData;
027import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace;
028import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue;
029import org.jetbrains.jet.lang.types.JetType;
030
031import java.util.Collection;
032import java.util.List;
033
034import static org.jetbrains.jet.lang.resolve.calls.inference.InferenceErrorData.ExtendedInferenceErrorData;
035
036public interface TracingStrategy {
037    TracingStrategy EMPTY = new TracingStrategy() {
038
039        @Override
040        public <D extends CallableDescriptor> void bindReference(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace<D> resolvedCall) {}
041
042        @Override
043        public <D extends CallableDescriptor> void bindResolvedCall(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace<D> resolvedCall) {}
044
045        @Override
046        public void unresolvedReference(@NotNull BindingTrace trace) {}
047
048        @Override
049        public <D extends CallableDescriptor> void unresolvedReferenceWrongReceiver(@NotNull BindingTrace trace, @NotNull Collection<ResolvedCallWithTrace<D>> candidates) {}
050
051        @Override
052        public <D extends CallableDescriptor> void recordAmbiguity(@NotNull BindingTrace trace, @NotNull Collection<ResolvedCallWithTrace<D>> candidates) {}
053
054        @Override
055        public void missingReceiver(@NotNull BindingTrace trace, @NotNull ReceiverParameterDescriptor expectedReceiver) {}
056
057        @Override
058        public void wrongReceiverType(@NotNull BindingTrace trace, @NotNull ReceiverParameterDescriptor receiverParameter, @NotNull ReceiverValue receiverArgument) {}
059
060        @Override
061        public void noReceiverAllowed(@NotNull BindingTrace trace) {}
062
063        @Override
064        public void noValueForParameter(@NotNull BindingTrace trace, @NotNull ValueParameterDescriptor valueParameter) {}
065
066        @Override
067        public void wrongNumberOfTypeArguments(@NotNull BindingTrace trace, int expectedTypeArgumentCount) {}
068
069        @Override
070        public <D extends CallableDescriptor> void ambiguity(@NotNull BindingTrace trace, @NotNull Collection<ResolvedCallWithTrace<D>> descriptors) {}
071
072        @Override
073        public <D extends CallableDescriptor> void noneApplicable(@NotNull BindingTrace trace, @NotNull Collection<ResolvedCallWithTrace<D>> descriptors) {}
074
075        @Override
076        public <D extends CallableDescriptor> void cannotCompleteResolve(
077                @NotNull BindingTrace trace,
078                @NotNull Collection<ResolvedCallWithTrace<D>> descriptors
079        ) {}
080
081        @Override
082        public void instantiationOfAbstractClass(@NotNull BindingTrace trace) {}
083
084        @Override
085        public void unsafeCall(@NotNull BindingTrace trace, @NotNull JetType type, boolean isCallForImplicitInvoke) {}
086
087        @Override
088        public void unnecessarySafeCall(@NotNull BindingTrace trace, @NotNull JetType type) {}
089
090        @Override
091        public void danglingFunctionLiteralArgumentSuspected(@NotNull BindingTrace trace, @NotNull List<JetExpression> functionLiteralArguments) {}
092
093        @Override
094        public void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptorWithVisibility descriptor) {}
095
096        @Override
097        public void typeInferenceFailed(@NotNull BindingTrace trace, @NotNull ExtendedInferenceErrorData inferenceErrorData) {}
098
099        @Override
100        public void upperBoundViolated(@NotNull BindingTrace trace, @NotNull InferenceErrorData inferenceErrorData) {}
101    };
102
103    <D extends CallableDescriptor> void bindReference(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace<D> resolvedCall);
104
105    <D extends CallableDescriptor> void bindResolvedCall(@NotNull BindingTrace trace, @NotNull ResolvedCallWithTrace<D> resolvedCall);
106
107    void unresolvedReference(@NotNull BindingTrace trace);
108
109    <D extends CallableDescriptor> void unresolvedReferenceWrongReceiver(@NotNull BindingTrace trace, @NotNull Collection<ResolvedCallWithTrace<D>> candidates);
110
111    <D extends CallableDescriptor> void recordAmbiguity(@NotNull BindingTrace trace, @NotNull Collection<ResolvedCallWithTrace<D>> candidates);
112
113    void missingReceiver(@NotNull BindingTrace trace, @NotNull ReceiverParameterDescriptor expectedReceiver);
114
115    void wrongReceiverType(@NotNull BindingTrace trace, @NotNull ReceiverParameterDescriptor receiverParameter, @NotNull ReceiverValue receiverArgument);
116
117    void noReceiverAllowed(@NotNull BindingTrace trace);
118
119    void noValueForParameter(@NotNull BindingTrace trace, @NotNull ValueParameterDescriptor valueParameter);
120
121    void wrongNumberOfTypeArguments(@NotNull BindingTrace trace, int expectedTypeArgumentCount);
122
123    <D extends CallableDescriptor> void ambiguity(@NotNull BindingTrace trace, @NotNull Collection<ResolvedCallWithTrace<D>> descriptors);
124
125    <D extends CallableDescriptor> void noneApplicable(@NotNull BindingTrace trace, @NotNull Collection<ResolvedCallWithTrace<D>> descriptors);
126
127    <D extends CallableDescriptor> void cannotCompleteResolve(
128            @NotNull BindingTrace trace,
129            @NotNull Collection<ResolvedCallWithTrace<D>> descriptors
130    );
131
132    void instantiationOfAbstractClass(@NotNull BindingTrace trace);
133
134    void unsafeCall(@NotNull BindingTrace trace, @NotNull JetType type, boolean isCallForImplicitInvoke);
135
136    void unnecessarySafeCall(@NotNull BindingTrace trace, @NotNull JetType type);
137
138    void danglingFunctionLiteralArgumentSuspected(@NotNull BindingTrace trace, @NotNull List<JetExpression> functionLiteralArguments);
139
140    void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptorWithVisibility descriptor);
141
142    void typeInferenceFailed(@NotNull BindingTrace trace, @NotNull ExtendedInferenceErrorData inferenceErrorData);
143
144    void upperBoundViolated(@NotNull BindingTrace trace, @NotNull InferenceErrorData inferenceErrorData);
145}