001    /*
002     * Copyright 2010-2016 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, @NotNull CallableDescriptor descriptor) {}
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    
107        void bindCall(@NotNull BindingTrace trace, @NotNull Call call);
108    
109        <D extends CallableDescriptor> void bindReference(@NotNull BindingTrace trace, @NotNull ResolvedCall<D> resolvedCall);
110    
111        <D extends CallableDescriptor> void bindResolvedCall(@NotNull BindingTrace trace, @NotNull ResolvedCall<D> resolvedCall);
112    
113        void unresolvedReference(@NotNull BindingTrace trace);
114    
115        <D extends CallableDescriptor> void unresolvedReferenceWrongReceiver(@NotNull BindingTrace trace, @NotNull Collection<? extends ResolvedCall<D>> candidates);
116    
117        <D extends CallableDescriptor> void recordAmbiguity(@NotNull BindingTrace trace, @NotNull Collection<? extends ResolvedCall<D>> candidates);
118    
119        void missingReceiver(@NotNull BindingTrace trace, @NotNull ReceiverParameterDescriptor expectedReceiver);
120    
121        void wrongReceiverType(
122                @NotNull BindingTrace trace,
123                @NotNull ReceiverParameterDescriptor receiverParameter,
124                @NotNull ReceiverValue receiverArgument,
125                @NotNull ResolutionContext<?> c
126        );
127    
128        void noReceiverAllowed(@NotNull BindingTrace trace);
129    
130        void noValueForParameter(@NotNull BindingTrace trace, @NotNull ValueParameterDescriptor valueParameter);
131    
132        void wrongNumberOfTypeArguments(
133                @NotNull BindingTrace trace,
134                int expectedTypeArgumentCount,
135                @NotNull CallableDescriptor descriptor
136        );
137    
138        <D extends CallableDescriptor> void ambiguity(@NotNull BindingTrace trace, @NotNull Collection<? extends ResolvedCall<D>> descriptors);
139    
140        <D extends CallableDescriptor> void noneApplicable(@NotNull BindingTrace trace, @NotNull Collection<? extends ResolvedCall<D>> descriptors);
141    
142        <D extends CallableDescriptor> void cannotCompleteResolve(
143                @NotNull BindingTrace trace,
144                @NotNull Collection<? extends ResolvedCall<D>> descriptors
145        );
146    
147        void instantiationOfAbstractClass(@NotNull BindingTrace trace);
148    
149        void abstractSuperCall(@NotNull BindingTrace trace);
150    
151        void nestedClassAccessViaInstanceReference(
152                @NotNull BindingTrace trace,
153                @NotNull ClassDescriptor classDescriptor,
154                @NotNull ExplicitReceiverKind explicitReceiverKind
155        );
156    
157        void unsafeCall(@NotNull BindingTrace trace, @NotNull KotlinType type, boolean isCallForImplicitInvoke);
158    
159        void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptorWithVisibility descriptor);
160    
161        void typeInferenceFailed(@NotNull ResolutionContext<?> context, @NotNull InferenceErrorData inferenceErrorData);
162    }