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    
017    package org.jetbrains.jet.lang.resolve.java.resolver;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.annotations.Nullable;
021    import org.jetbrains.jet.lang.descriptors.*;
022    import org.jetbrains.jet.lang.resolve.java.structure.JavaField;
023    import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod;
024    import org.jetbrains.jet.lang.types.JetType;
025    
026    import java.util.Collections;
027    import java.util.List;
028    
029    public interface ExternalSignatureResolver {
030        abstract class MemberSignature {
031            private final List<String> signatureErrors;
032    
033            protected MemberSignature(@NotNull List<String> signatureErrors) {
034                this.signatureErrors = signatureErrors;
035            }
036    
037            @NotNull
038            public List<String> getErrors() {
039                return signatureErrors;
040            }
041        }
042    
043        class AlternativeMethodSignature extends MemberSignature {
044            private final JetType returnType;
045            private final JetType receiverType;
046            private final List<ValueParameterDescriptor> valueParameters;
047            private final List<TypeParameterDescriptor> typeParameters;
048    
049            public AlternativeMethodSignature(
050                    @Nullable JetType returnType,
051                    @Nullable JetType receiverType,
052                    @NotNull List<ValueParameterDescriptor> valueParameters,
053                    @NotNull List<TypeParameterDescriptor> typeParameters,
054                    @NotNull List<String> signatureErrors
055            ) {
056                super(signatureErrors);
057                this.returnType = returnType;
058                this.receiverType = receiverType;
059                this.valueParameters = valueParameters;
060                this.typeParameters = typeParameters;
061            }
062    
063            @Nullable
064            public JetType getReturnType() {
065                return returnType;
066            }
067    
068            @Nullable
069            public JetType getReceiverType() {
070                return receiverType;
071            }
072    
073            @NotNull
074            public List<ValueParameterDescriptor> getValueParameters() {
075                return valueParameters;
076            }
077    
078            @NotNull
079            public List<TypeParameterDescriptor> getTypeParameters() {
080                return typeParameters;
081            }
082        }
083    
084        class AlternativeFieldSignature extends MemberSignature {
085            private final JetType returnType;
086    
087            public AlternativeFieldSignature(@NotNull JetType returnType, @Nullable String signatureError) {
088                super(signatureError == null ? Collections.<String>emptyList() : Collections.singletonList(signatureError));
089                this.returnType = returnType;
090            }
091    
092            @NotNull
093            public JetType getReturnType() {
094                return returnType;
095            }
096        }
097    
098        class PropagatedMethodSignature extends AlternativeMethodSignature {
099            private final List<FunctionDescriptor> superMethods;
100    
101            public PropagatedMethodSignature(
102                    @Nullable JetType returnType,
103                    @Nullable JetType receiverType,
104                    @NotNull List<ValueParameterDescriptor> valueParameters,
105                    @NotNull List<TypeParameterDescriptor> typeParameters,
106                    @NotNull List<String> signatureErrors,
107                    @NotNull List<FunctionDescriptor> superMethods
108            ) {
109                super(returnType, receiverType, valueParameters, typeParameters, signatureErrors);
110                this.superMethods = superMethods;
111            }
112    
113            @NotNull
114            public List<FunctionDescriptor> getSuperMethods() {
115                return superMethods;
116            }
117        }
118    
119        @NotNull
120        PropagatedMethodSignature resolvePropagatedSignature(
121                @NotNull JavaMethod method,
122                @NotNull ClassDescriptor owner,
123                @NotNull JetType returnType,
124                @Nullable JetType receiverType,
125                @NotNull List<ValueParameterDescriptor> valueParameters,
126                @NotNull List<TypeParameterDescriptor> typeParameters
127        );
128    
129        @NotNull
130        AlternativeMethodSignature resolveAlternativeMethodSignature(
131                @NotNull JavaMethod method,
132                boolean hasSuperMethods,
133                @Nullable JetType returnType,
134                @Nullable JetType receiverType,
135                @NotNull List<ValueParameterDescriptor> valueParameters,
136                @NotNull List<TypeParameterDescriptor> typeParameters
137        );
138    
139        @NotNull
140        AlternativeFieldSignature resolveAlternativeFieldSignature(
141                @NotNull JavaField field,
142                @NotNull JetType returnType,
143                boolean isVar
144        );
145    
146        void reportSignatureErrors(@NotNull CallableMemberDescriptor descriptor, @NotNull List<String> signatureErrors);
147    }