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 org.jetbrains.annotations.NotNull;
020    import org.jetbrains.kotlin.descriptors.*;
021    import org.jetbrains.kotlin.psi.Call;
022    import org.jetbrains.kotlin.resolve.BindingTrace;
023    import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext;
024    import org.jetbrains.kotlin.resolve.calls.inference.InferenceErrorData;
025    import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
026    import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue;
027    import org.jetbrains.kotlin.types.KotlinType;
028    
029    import java.util.Collection;
030    
031    public interface TracingStrategy {
032        TracingStrategy EMPTY = new TracingStrategy() {
033    
034            @Override
035            public void bindCall(@NotNull BindingTrace trace, @NotNull Call call) {}
036    
037            @Override
038            public <D extends CallableDescriptor> void bindReference(@NotNull BindingTrace trace, @NotNull ResolvedCall<D> resolvedCall) {}
039    
040            @Override
041            public <D extends CallableDescriptor> void bindResolvedCall(@NotNull BindingTrace trace, @NotNull ResolvedCall<D> resolvedCall) {}
042    
043            @Override
044            public void unresolvedReference(@NotNull BindingTrace trace) {}
045    
046            @Override
047            public <D extends CallableDescriptor> void unresolvedReferenceWrongReceiver(@NotNull BindingTrace trace, @NotNull Collection<? extends ResolvedCall<D>> candidates) {}
048    
049            @Override
050            public <D extends CallableDescriptor> void recordAmbiguity(@NotNull BindingTrace trace, @NotNull Collection<? extends ResolvedCall<D>> candidates) {}
051    
052            @Override
053            public void missingReceiver(@NotNull BindingTrace trace, @NotNull ReceiverParameterDescriptor expectedReceiver) {}
054    
055            @Override
056            public void wrongReceiverType(
057                    @NotNull BindingTrace trace,
058                    @NotNull ReceiverParameterDescriptor receiverParameter,
059                    @NotNull ReceiverValue receiverArgument,
060                    @NotNull ResolutionContext<?> c
061            ) {}
062    
063            @Override
064            public void noReceiverAllowed(@NotNull BindingTrace trace) {}
065    
066            @Override
067            public void noValueForParameter(@NotNull BindingTrace trace, @NotNull ValueParameterDescriptor valueParameter) {}
068    
069            @Override
070            public void wrongNumberOfTypeArguments(@NotNull BindingTrace trace, int expectedTypeArgumentCount) {}
071    
072            @Override
073            public <D extends CallableDescriptor> void ambiguity(@NotNull BindingTrace trace, @NotNull Collection<? extends ResolvedCall<D>> descriptors) {}
074    
075            @Override
076            public <D extends CallableDescriptor> void noneApplicable(@NotNull BindingTrace trace, @NotNull Collection<? extends ResolvedCall<D>> descriptors) {}
077    
078            @Override
079            public <D extends CallableDescriptor> void cannotCompleteResolve(
080                    @NotNull BindingTrace trace,
081                    @NotNull Collection<? extends ResolvedCall<D>> descriptors
082            ) {}
083    
084            @Override
085            public void instantiationOfAbstractClass(@NotNull BindingTrace trace) {}
086    
087            @Override
088            public void abstractSuperCall(@NotNull BindingTrace trace) {}
089    
090            @Override
091            public void nestedClassAccessViaInstanceReference(
092                    @NotNull BindingTrace trace,
093                    @NotNull ClassDescriptor classDescriptor,
094                    @NotNull ExplicitReceiverKind explicitReceiverKind
095            ) {}
096    
097            @Override
098            public void unsafeCall(@NotNull BindingTrace trace, @NotNull KotlinType type, boolean isCallForImplicitInvoke) {}
099    
100            @Override
101            public void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptorWithVisibility descriptor) {}
102    
103            @Override
104            public void typeInferenceFailed(@NotNull ResolutionContext<?> context, @NotNull InferenceErrorData inferenceErrorData) {}
105    
106            @Override
107            public void nonExtensionFunctionCalledAsExtension(@NotNull BindingTrace trace) { }
108        };
109    
110        void bindCall(@NotNull BindingTrace trace, @NotNull Call call);
111    
112        <D extends CallableDescriptor> void bindReference(@NotNull BindingTrace trace, @NotNull ResolvedCall<D> resolvedCall);
113    
114        <D extends CallableDescriptor> void bindResolvedCall(@NotNull BindingTrace trace, @NotNull ResolvedCall<D> resolvedCall);
115    
116        void unresolvedReference(@NotNull BindingTrace trace);
117    
118        <D extends CallableDescriptor> void unresolvedReferenceWrongReceiver(@NotNull BindingTrace trace, @NotNull Collection<? extends ResolvedCall<D>> candidates);
119    
120        <D extends CallableDescriptor> void recordAmbiguity(@NotNull BindingTrace trace, @NotNull Collection<? extends ResolvedCall<D>> candidates);
121    
122        void missingReceiver(@NotNull BindingTrace trace, @NotNull ReceiverParameterDescriptor expectedReceiver);
123    
124        void wrongReceiverType(
125                @NotNull BindingTrace trace,
126                @NotNull ReceiverParameterDescriptor receiverParameter,
127                @NotNull ReceiverValue receiverArgument,
128                @NotNull ResolutionContext<?> c
129        );
130    
131        void noReceiverAllowed(@NotNull BindingTrace trace);
132    
133        void noValueForParameter(@NotNull BindingTrace trace, @NotNull ValueParameterDescriptor valueParameter);
134    
135        void wrongNumberOfTypeArguments(@NotNull BindingTrace trace, int expectedTypeArgumentCount);
136    
137        <D extends CallableDescriptor> void ambiguity(@NotNull BindingTrace trace, @NotNull Collection<? extends ResolvedCall<D>> descriptors);
138    
139        <D extends CallableDescriptor> void noneApplicable(@NotNull BindingTrace trace, @NotNull Collection<? extends ResolvedCall<D>> descriptors);
140    
141        <D extends CallableDescriptor> void cannotCompleteResolve(
142                @NotNull BindingTrace trace,
143                @NotNull Collection<? extends ResolvedCall<D>> descriptors
144        );
145    
146        void instantiationOfAbstractClass(@NotNull BindingTrace trace);
147    
148        void abstractSuperCall(@NotNull BindingTrace trace);
149    
150        void nestedClassAccessViaInstanceReference(
151                @NotNull BindingTrace trace,
152                @NotNull ClassDescriptor classDescriptor,
153                @NotNull ExplicitReceiverKind explicitReceiverKind
154        );
155    
156        void unsafeCall(@NotNull BindingTrace trace, @NotNull KotlinType type, boolean isCallForImplicitInvoke);
157    
158        void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptorWithVisibility descriptor);
159    
160        void typeInferenceFailed(@NotNull ResolutionContext<?> context, @NotNull InferenceErrorData inferenceErrorData);
161    
162        void nonExtensionFunctionCalledAsExtension(@NotNull BindingTrace trace);
163    }