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.load.java.components;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.annotations.Nullable;
021    import org.jetbrains.kotlin.descriptors.*;
022    import org.jetbrains.kotlin.load.java.structure.JavaField;
023    import org.jetbrains.kotlin.load.java.structure.JavaMember;
024    import org.jetbrains.kotlin.load.java.structure.JavaMethod;
025    import org.jetbrains.kotlin.types.JetType;
026    
027    import java.util.Collections;
028    import java.util.List;
029    
030    public interface ExternalSignatureResolver {
031        ExternalSignatureResolver DO_NOTHING = new ExternalSignatureResolver() {
032            @NotNull
033            @Override
034            public PropagatedMethodSignature resolvePropagatedSignature(
035                    @NotNull JavaMethod method,
036                    @NotNull ClassDescriptor owner,
037                    @NotNull JetType returnType,
038                    @Nullable JetType receiverType,
039                    @NotNull List<ValueParameterDescriptor> valueParameters,
040                    @NotNull List<TypeParameterDescriptor> typeParameters
041            ) {
042                return new PropagatedMethodSignature(
043                        returnType, receiverType, valueParameters, typeParameters, Collections.<String>emptyList(), false,
044                        Collections.<FunctionDescriptor>emptyList()
045                );
046            }
047    
048            @NotNull
049            @Override
050            public AlternativeMethodSignature resolveAlternativeMethodSignature(
051                    @NotNull JavaMember methodOrConstructor,
052                    boolean hasSuperMethods,
053                    @Nullable JetType returnType,
054                    @Nullable JetType receiverType,
055                    @NotNull List<ValueParameterDescriptor> valueParameters,
056                    @NotNull List<TypeParameterDescriptor> typeParameters,
057                    boolean hasStableParameterNames
058            ) {
059                return new AlternativeMethodSignature(
060                        returnType, receiverType, valueParameters, typeParameters, Collections.<String>emptyList(), hasStableParameterNames
061                );
062            }
063    
064            @NotNull
065            @Override
066            public AlternativeFieldSignature resolveAlternativeFieldSignature(
067                    @NotNull JavaField field, @NotNull JetType returnType, boolean isVar
068            ) {
069                return new AlternativeFieldSignature(returnType, null);
070            }
071    
072            @Override
073            public void reportSignatureErrors(@NotNull CallableMemberDescriptor descriptor, @NotNull List<String> signatureErrors) {
074                throw new UnsupportedOperationException("Should not be called");
075            }
076        };
077    
078        abstract class MemberSignature {
079            private final List<String> signatureErrors;
080    
081            protected MemberSignature(@NotNull List<String> signatureErrors) {
082                this.signatureErrors = signatureErrors;
083            }
084    
085            @NotNull
086            public List<String> getErrors() {
087                return signatureErrors;
088            }
089        }
090    
091        class AlternativeMethodSignature extends MemberSignature {
092            private final JetType returnType;
093            private final JetType receiverType;
094            private final List<ValueParameterDescriptor> valueParameters;
095            private final List<TypeParameterDescriptor> typeParameters;
096            private final boolean hasStableParameterNames;
097    
098            public AlternativeMethodSignature(
099                    @Nullable JetType returnType,
100                    @Nullable JetType receiverType,
101                    @NotNull List<ValueParameterDescriptor> valueParameters,
102                    @NotNull List<TypeParameterDescriptor> typeParameters,
103                    @NotNull List<String> signatureErrors,
104                    boolean hasStableParameterNames
105            ) {
106                super(signatureErrors);
107                this.returnType = returnType;
108                this.receiverType = receiverType;
109                this.valueParameters = valueParameters;
110                this.typeParameters = typeParameters;
111                this.hasStableParameterNames = hasStableParameterNames;
112            }
113    
114            @Nullable
115            public JetType getReturnType() {
116                return returnType;
117            }
118    
119            @Nullable
120            public JetType getReceiverType() {
121                return receiverType;
122            }
123    
124            @NotNull
125            public List<ValueParameterDescriptor> getValueParameters() {
126                return valueParameters;
127            }
128    
129            @NotNull
130            public List<TypeParameterDescriptor> getTypeParameters() {
131                return typeParameters;
132            }
133    
134            public boolean hasStableParameterNames() {
135                return hasStableParameterNames;
136            }
137        }
138    
139        class AlternativeFieldSignature extends MemberSignature {
140            private final JetType returnType;
141    
142            public AlternativeFieldSignature(@NotNull JetType returnType, @Nullable String signatureError) {
143                super(signatureError == null ? Collections.<String>emptyList() : Collections.singletonList(signatureError));
144                this.returnType = returnType;
145            }
146    
147            @NotNull
148            public JetType getReturnType() {
149                return returnType;
150            }
151        }
152    
153        class PropagatedMethodSignature extends AlternativeMethodSignature {
154            private final List<FunctionDescriptor> superMethods;
155    
156            public PropagatedMethodSignature(
157                    @Nullable JetType returnType,
158                    @Nullable JetType receiverType,
159                    @NotNull List<ValueParameterDescriptor> valueParameters,
160                    @NotNull List<TypeParameterDescriptor> typeParameters,
161                    @NotNull List<String> signatureErrors,
162                    boolean hasStableParameterNames,
163                    @NotNull List<FunctionDescriptor> superMethods
164            ) {
165                super(returnType, receiverType, valueParameters, typeParameters, signatureErrors, hasStableParameterNames);
166                this.superMethods = superMethods;
167            }
168    
169            @NotNull
170            public List<FunctionDescriptor> getSuperMethods() {
171                return superMethods;
172            }
173        }
174    
175        @NotNull
176        PropagatedMethodSignature resolvePropagatedSignature(
177                @NotNull JavaMethod method,
178                @NotNull ClassDescriptor owner,
179                @NotNull JetType returnType,
180                @Nullable JetType receiverType,
181                @NotNull List<ValueParameterDescriptor> valueParameters,
182                @NotNull List<TypeParameterDescriptor> typeParameters
183        );
184    
185        @NotNull
186        AlternativeMethodSignature resolveAlternativeMethodSignature(
187                @NotNull JavaMember methodOrConstructor,
188                boolean hasSuperMethods,
189                @Nullable JetType returnType,
190                @Nullable JetType receiverType,
191                @NotNull List<ValueParameterDescriptor> valueParameters,
192                @NotNull List<TypeParameterDescriptor> typeParameters,
193                boolean hasStableParameterNames
194        );
195    
196        @NotNull
197        AlternativeFieldSignature resolveAlternativeFieldSignature(
198                @NotNull JavaField field,
199                @NotNull JetType returnType,
200                boolean isVar
201        );
202    
203        void reportSignatureErrors(@NotNull CallableMemberDescriptor descriptor, @NotNull List<String> signatureErrors);
204    }