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 Kind kind;
037        private Visibility visibility;
038        @Nullable
039        private FunctionDescriptor initialSignatureDescriptor = null;
040    
041        public PropertyAccessorDescriptorImpl(
042                @NotNull Modality modality,
043                @NotNull Visibility visibility,
044                @NotNull PropertyDescriptor correspondingProperty,
045                @NotNull Annotations annotations,
046                @NotNull Name name,
047                boolean isDefault,
048                boolean isExternal,
049                Kind kind,
050                @NotNull SourceElement source
051        ) {
052            super(correspondingProperty.getContainingDeclaration(), annotations, name, source);
053            this.modality = modality;
054            this.visibility = visibility;
055            this.correspondingProperty = correspondingProperty;
056            this.isDefault = isDefault;
057            this.isExternal = isExternal;
058            this.kind = kind;
059        }
060    
061        @Override
062        public boolean isDefault() {
063            return isDefault;
064        }
065    
066        @NotNull
067        @Override
068        public Kind getKind() {
069            return kind;
070        }
071    
072        @Override
073        public boolean isOperator() {
074            return false;
075        }
076    
077        @Override
078        public boolean isInfix() {
079            return false;
080        }
081    
082        @Override
083        public boolean isExternal() {
084            return isExternal;
085        }
086    
087        @Override
088        public boolean isInline() {
089            return false;
090        }
091    
092        @Override
093        public boolean isTailrec() {
094            return false;
095        }
096    
097        @NotNull
098        @Override
099        public FunctionDescriptor substitute(@NotNull TypeSubstitutor substitutor) {
100            throw new UnsupportedOperationException(); // TODO
101        }
102    
103        @NotNull
104        @Override
105        public List<TypeParameterDescriptor> getTypeParameters() {
106            return Collections.emptyList();
107        }
108    
109        @Override
110        public boolean hasStableParameterNames() {
111            return false;
112        }
113    
114        @Override
115        public boolean hasSynthesizedParameterNames() {
116            return false;
117        }
118    
119        @NotNull
120        @Override
121        public Modality getModality() {
122            return modality;
123        }
124    
125        @NotNull
126        @Override
127        public Visibility getVisibility() {
128            return visibility;
129        }
130    
131        public void setVisibility(Visibility visibility) {
132            this.visibility = visibility;
133        }
134    
135        @Override
136        @NotNull
137        public PropertyDescriptor getCorrespondingProperty() {
138            return correspondingProperty;
139        }
140    
141        @Nullable
142        @Override
143        public ReceiverParameterDescriptor getExtensionReceiverParameter() {
144            return getCorrespondingProperty().getExtensionReceiverParameter();
145        }
146    
147        @Nullable
148        @Override
149        public ReceiverParameterDescriptor getDispatchReceiverParameter() {
150            return getCorrespondingProperty().getDispatchReceiverParameter();
151        }
152    
153        @NotNull
154        @Override
155        public CopyBuilder<? extends FunctionDescriptor> newCopyBuilder() {
156            throw new UnsupportedOperationException("Accessors must be copied by the corresponding property");
157        }
158    
159        @NotNull
160        @Override
161        public PropertyAccessorDescriptor copy(
162                DeclarationDescriptor newOwner,
163                Modality modality,
164                Visibility visibility,
165                Kind kind,
166                boolean copyOverrides
167        ) {
168            throw new UnsupportedOperationException("Accessors must be copied by the corresponding property");
169        }
170    
171        @NotNull
172        protected Collection<PropertyAccessorDescriptor> getOverriddenDescriptors(boolean isGetter) {
173            Collection<PropertyAccessorDescriptor> result = new ArrayList<PropertyAccessorDescriptor>(0);
174            for (PropertyDescriptor overriddenProperty : getCorrespondingProperty().getOverriddenDescriptors()) {
175                PropertyAccessorDescriptor accessorDescriptor = isGetter ? overriddenProperty.getGetter() : overriddenProperty.getSetter();
176                if (accessorDescriptor != null) {
177                    result.add(accessorDescriptor);
178                }
179            }
180            return result;
181        }
182    
183        @Override
184        public void setOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> overriddenDescriptors) {
185            assert overriddenDescriptors.isEmpty() : "Overridden accessors should be empty";
186        }
187    
188        @NotNull
189        @Override
190        public abstract PropertyAccessorDescriptor getOriginal();
191    
192        @Override
193        @Nullable
194        public FunctionDescriptor getInitialSignatureDescriptor() {
195            return initialSignatureDescriptor;
196        }
197    
198        public void setInitialSignatureDescriptor(@Nullable FunctionDescriptor initialSignatureDescriptor) {
199            this.initialSignatureDescriptor = initialSignatureDescriptor;
200        }
201    
202        @Override
203        public boolean isHiddenToOvercomeSignatureClash() {
204            return false;
205        }
206    }