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.descriptors.impl;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.annotations.Nullable;
021    import org.jetbrains.kotlin.descriptors.*;
022    import org.jetbrains.kotlin.descriptors.annotations.Annotations;
023    import org.jetbrains.kotlin.name.Name;
024    import org.jetbrains.kotlin.types.TypeSubstitutor;
025    
026    import java.util.ArrayList;
027    import java.util.Collection;
028    import java.util.Collections;
029    import java.util.List;
030    
031    public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescriptorNonRootImpl implements PropertyAccessorDescriptor {
032        private final boolean isDefault;
033        private final boolean isExternal;
034        private final Modality modality;
035        private final PropertyDescriptor correspondingProperty;
036        private final boolean isInline;
037        private final Kind kind;
038        private Visibility visibility;
039        @Nullable
040        private FunctionDescriptor initialSignatureDescriptor = null;
041    
042        public PropertyAccessorDescriptorImpl(
043                @NotNull Modality modality,
044                @NotNull Visibility visibility,
045                @NotNull PropertyDescriptor correspondingProperty,
046                @NotNull Annotations annotations,
047                @NotNull Name name,
048                boolean isDefault,
049                boolean isExternal,
050                boolean isInline,
051                Kind kind,
052                @NotNull SourceElement source
053        ) {
054            super(correspondingProperty.getContainingDeclaration(), annotations, name, source);
055            this.modality = modality;
056            this.visibility = visibility;
057            this.correspondingProperty = correspondingProperty;
058            this.isDefault = isDefault;
059            this.isExternal = isExternal;
060            this.isInline = isInline;
061            this.kind = kind;
062        }
063    
064        @Override
065        public boolean isDefault() {
066            return isDefault;
067        }
068    
069        @NotNull
070        @Override
071        public Kind getKind() {
072            return kind;
073        }
074    
075        @Override
076        public boolean isOperator() {
077            return false;
078        }
079    
080        @Override
081        public boolean isInfix() {
082            return false;
083        }
084    
085        @Override
086        public boolean isExternal() {
087            return isExternal;
088        }
089    
090        @Override
091        public boolean isInline() {
092            return isInline;
093        }
094    
095        @Override
096        public boolean isTailrec() {
097            return false;
098        }
099    
100        @Override
101        public boolean isSuspend() {
102            return false;
103        }
104    
105        @Override
106        public boolean isHeader() {
107            return false;
108        }
109    
110        @Override
111        public boolean isImpl() {
112            return false;
113        }
114    
115        @NotNull
116        @Override
117        public FunctionDescriptor substitute(@NotNull TypeSubstitutor substitutor) {
118            throw new UnsupportedOperationException(); // TODO
119        }
120    
121        @NotNull
122        @Override
123        public List<TypeParameterDescriptor> getTypeParameters() {
124            return Collections.emptyList();
125        }
126    
127        @Override
128        public boolean hasStableParameterNames() {
129            return false;
130        }
131    
132        @Override
133        public boolean hasSynthesizedParameterNames() {
134            return false;
135        }
136    
137        @NotNull
138        @Override
139        public Modality getModality() {
140            return modality;
141        }
142    
143        @NotNull
144        @Override
145        public Visibility getVisibility() {
146            return visibility;
147        }
148    
149        public void setVisibility(Visibility visibility) {
150            this.visibility = visibility;
151        }
152    
153        @NotNull
154        @Override
155        public VariableDescriptorWithAccessors getCorrespondingVariable() {
156            return correspondingProperty;
157        }
158    
159        @Override
160        @NotNull
161        public PropertyDescriptor getCorrespondingProperty() {
162            return correspondingProperty;
163        }
164    
165        @Nullable
166        @Override
167        public ReceiverParameterDescriptor getExtensionReceiverParameter() {
168            return getCorrespondingProperty().getExtensionReceiverParameter();
169        }
170    
171        @Nullable
172        @Override
173        public ReceiverParameterDescriptor getDispatchReceiverParameter() {
174            return getCorrespondingProperty().getDispatchReceiverParameter();
175        }
176    
177        @NotNull
178        @Override
179        public CopyBuilder<? extends FunctionDescriptor> newCopyBuilder() {
180            throw new UnsupportedOperationException("Accessors must be copied by the corresponding property");
181        }
182    
183        @NotNull
184        @Override
185        public PropertyAccessorDescriptor copy(
186                DeclarationDescriptor newOwner,
187                Modality modality,
188                Visibility visibility,
189                Kind kind,
190                boolean copyOverrides
191        ) {
192            throw new UnsupportedOperationException("Accessors must be copied by the corresponding property");
193        }
194    
195        @NotNull
196        protected Collection<PropertyAccessorDescriptor> getOverriddenDescriptors(boolean isGetter) {
197            Collection<PropertyAccessorDescriptor> result = new ArrayList<PropertyAccessorDescriptor>(0);
198            for (PropertyDescriptor overriddenProperty : getCorrespondingProperty().getOverriddenDescriptors()) {
199                PropertyAccessorDescriptor accessorDescriptor = isGetter ? overriddenProperty.getGetter() : overriddenProperty.getSetter();
200                if (accessorDescriptor != null) {
201                    result.add(accessorDescriptor);
202                }
203            }
204            return result;
205        }
206    
207        @Override
208        public void setOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> overriddenDescriptors) {
209            assert overriddenDescriptors.isEmpty() : "Overridden accessors should be empty";
210        }
211    
212        @NotNull
213        @Override
214        public abstract PropertyAccessorDescriptor getOriginal();
215    
216        @Override
217        @Nullable
218        public FunctionDescriptor getInitialSignatureDescriptor() {
219            return initialSignatureDescriptor;
220        }
221    
222        public void setInitialSignatureDescriptor(@Nullable FunctionDescriptor initialSignatureDescriptor) {
223            this.initialSignatureDescriptor = initialSignatureDescriptor;
224        }
225    
226        @Override
227        public boolean isHiddenToOvercomeSignatureClash() {
228            return false;
229        }
230    
231        @Override
232        public boolean isHiddenForResolutionEverywhereBesideSupercalls() {
233            return false;
234        }
235    
236        @Nullable
237        @Override
238        public <V> V getUserData(UserDataKey<V> key) {
239            return null;
240        }
241    }