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 }