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            private final boolean hasStableParameterNames;
049    
050            public AlternativeMethodSignature(
051                    @Nullable JetType returnType,
052                    @Nullable JetType receiverType,
053                    @NotNull List<ValueParameterDescriptor> valueParameters,
054                    @NotNull List<TypeParameterDescriptor> typeParameters,
055                    @NotNull List<String> signatureErrors,
056                    boolean hasStableParameterNames
057            ) {
058                super(signatureErrors);
059                this.returnType = returnType;
060                this.receiverType = receiverType;
061                this.valueParameters = valueParameters;
062                this.typeParameters = typeParameters;
063                this.hasStableParameterNames = hasStableParameterNames;
064            }
065    
066            @Nullable
067            public JetType getReturnType() {
068                return returnType;
069            }
070    
071            @Nullable
072            public JetType getReceiverType() {
073                return receiverType;
074            }
075    
076            @NotNull
077            public List<ValueParameterDescriptor> getValueParameters() {
078                return valueParameters;
079            }
080    
081            @NotNull
082            public List<TypeParameterDescriptor> getTypeParameters() {
083                return typeParameters;
084            }
085    
086            public boolean hasStableParameterNames() {
087                return hasStableParameterNames;
088            }
089        }
090    
091        class AlternativeFieldSignature extends MemberSignature {
092            private final JetType returnType;
093    
094            public AlternativeFieldSignature(@NotNull JetType returnType, @Nullable String signatureError) {
095                super(signatureError == null ? Collections.<String>emptyList() : Collections.singletonList(signatureError));
096                this.returnType = returnType;
097            }
098    
099            @NotNull
100            public JetType getReturnType() {
101                return returnType;
102            }
103        }
104    
105        class PropagatedMethodSignature extends AlternativeMethodSignature {
106            private final List<FunctionDescriptor> superMethods;
107    
108            public PropagatedMethodSignature(
109                    @Nullable JetType returnType,
110                    @Nullable JetType receiverType,
111                    @NotNull List<ValueParameterDescriptor> valueParameters,
112                    @NotNull List<TypeParameterDescriptor> typeParameters,
113                    @NotNull List<String> signatureErrors,
114                    boolean hasStableParameterNames,
115                    @NotNull List<FunctionDescriptor> superMethods
116            ) {
117                super(returnType, receiverType, valueParameters, typeParameters, signatureErrors, hasStableParameterNames);
118                this.superMethods = superMethods;
119            }
120    
121            @NotNull
122            public List<FunctionDescriptor> getSuperMethods() {
123                return superMethods;
124            }
125        }
126    
127        @NotNull
128        PropagatedMethodSignature resolvePropagatedSignature(
129                @NotNull JavaMethod method,
130                @NotNull ClassDescriptor owner,
131                @NotNull JetType returnType,
132                @Nullable JetType receiverType,
133                @NotNull List<ValueParameterDescriptor> valueParameters,
134                @NotNull List<TypeParameterDescriptor> typeParameters
135        );
136    
137        @NotNull
138        AlternativeMethodSignature resolveAlternativeMethodSignature(
139                @NotNull JavaMethod method,
140                boolean hasSuperMethods,
141                @Nullable JetType returnType,
142                @Nullable JetType receiverType,
143                @NotNull List<ValueParameterDescriptor> valueParameters,
144                @NotNull List<TypeParameterDescriptor> typeParameters,
145                boolean hasStableParameterNames
146        );
147    
148        @NotNull
149        AlternativeFieldSignature resolveAlternativeFieldSignature(
150                @NotNull JavaField field,
151                @NotNull JetType returnType,
152                boolean isVar
153        );
154    
155        void reportSignatureErrors(@NotNull CallableMemberDescriptor descriptor, @NotNull List<String> signatureErrors);
156    }