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.psi;
018    
019    import com.intellij.lang.ASTNode;
020    import com.intellij.psi.PsiElement;
021    import com.intellij.psi.util.PsiTreeUtil;
022    import org.jetbrains.annotations.NotNull;
023    import org.jetbrains.annotations.Nullable;
024    import org.jetbrains.kotlin.psi.stubs.KotlinPropertyAccessorStub;
025    import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes;
026    import org.jetbrains.kotlin.lexer.JetTokens;
027    
028    import java.util.Collections;
029    import java.util.List;
030    
031    public class JetPropertyAccessor extends JetDeclarationStub<KotlinPropertyAccessorStub>
032            implements JetDeclarationWithBody, JetModifierListOwner, JetWithExpressionInitializer {
033        public JetPropertyAccessor(@NotNull ASTNode node) {
034            super(node);
035        }
036    
037        public JetPropertyAccessor(@NotNull KotlinPropertyAccessorStub stub) {
038            super(stub, JetStubElementTypes.PROPERTY_ACCESSOR);
039        }
040    
041        @Override
042        public <R, D> R accept(@NotNull JetVisitor<R, D> visitor, D data) {
043            return visitor.visitPropertyAccessor(this, data);
044        }
045    
046        public boolean isSetter() {
047            KotlinPropertyAccessorStub stub = getStub();
048            if (stub != null) {
049                return !stub.isGetter();
050            }
051            return findChildByType(JetTokens.SET_KEYWORD) != null;
052        }
053    
054        public boolean isGetter() {
055            KotlinPropertyAccessorStub stub = getStub();
056            if (stub != null) {
057                return stub.isGetter();
058            }
059            return findChildByType(JetTokens.GET_KEYWORD) != null;
060        }
061    
062        @Nullable
063        public JetParameterList getParameterList() {
064            return getStubOrPsiChild(JetStubElementTypes.VALUE_PARAMETER_LIST);
065        }
066    
067        @Nullable
068        public JetParameter getParameter() {
069            JetParameterList parameterList = getParameterList();
070            if (parameterList == null) return null;
071            List<JetParameter> parameters = parameterList.getParameters();
072            if (parameters.isEmpty()) return null;
073            return parameters.get(0);
074        }
075    
076        @NotNull
077        @Override
078        public List<JetParameter> getValueParameters() {
079            JetParameter parameter = getParameter();
080            if (parameter == null) {
081                return Collections.emptyList();
082            }
083            return Collections.singletonList(parameter);
084        }
085    
086        @Nullable
087        @Override
088        public JetExpression getBodyExpression() {
089            return findChildByClass(JetExpression.class);
090        }
091    
092        @Override
093        public boolean hasBlockBody() {
094            return getEqualsToken() == null;
095        }
096    
097        @Override
098        public boolean hasBody() {
099            KotlinPropertyAccessorStub stub = getStub();
100            if (stub != null) {
101                return stub.hasBody();
102            }
103            return getBodyExpression() != null;
104        }
105    
106        @Override
107        @Nullable
108        public PsiElement getEqualsToken() {
109            return findChildByType(JetTokens.EQ);
110        }
111    
112        @Override
113        public boolean hasDeclaredReturnType() {
114            return true;
115        }
116    
117        @Nullable
118        public JetTypeReference getReturnTypeReference() {
119            return getStubOrPsiChild(JetStubElementTypes.TYPE_REFERENCE);
120        }
121    
122        @NotNull
123        public PsiElement getNamePlaceholder() {
124            PsiElement get = findChildByType(JetTokens.GET_KEYWORD);
125            if (get != null) {
126                return get;
127            }
128            return findChildByType(JetTokens.SET_KEYWORD);
129        }
130    
131        @Nullable
132        public ASTNode getRightParenthesis() {
133            return getNode().findChildByType(JetTokens.RPAR);
134        }
135    
136        @Nullable
137        @Override
138        public JetExpression getInitializer() {
139            return PsiTreeUtil.getNextSiblingOfType(getEqualsToken(), JetExpression.class);
140        }
141    
142        @Override
143        public boolean hasInitializer() {
144            return getInitializer() != null;
145        }
146    }