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.navigation.ItemPresentation; 021 import com.intellij.navigation.ItemPresentationProviders; 022 import com.intellij.psi.PsiElement; 023 import com.intellij.psi.tree.TokenSet; 024 import com.intellij.psi.util.PsiTreeUtil; 025 import org.jetbrains.annotations.NotNull; 026 import org.jetbrains.annotations.Nullable; 027 import org.jetbrains.kotlin.lexer.KtTokens; 028 import org.jetbrains.kotlin.psi.stubs.KotlinParameterStub; 029 import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes; 030 import org.jetbrains.kotlin.psi.typeRefHelpers.TypeRefHelpersKt; 031 032 import java.util.Collections; 033 import java.util.List; 034 035 public class KtParameter extends KtNamedDeclarationStub<KotlinParameterStub> implements KtCallableDeclaration, KtValVarKeywordOwner { 036 037 public KtParameter(@NotNull ASTNode node) { 038 super(node); 039 } 040 041 public KtParameter(@NotNull KotlinParameterStub stub) { 042 super(stub, KtStubElementTypes.VALUE_PARAMETER); 043 } 044 045 @Override 046 public <R, D> R accept(@NotNull KtVisitor<R, D> visitor, D data) { 047 return visitor.visitParameter(this, data); 048 } 049 050 @Override 051 @Nullable 052 public KtTypeReference getTypeReference() { 053 return getStubOrPsiChild(KtStubElementTypes.TYPE_REFERENCE); 054 } 055 056 @Override 057 @Nullable 058 public KtTypeReference setTypeReference(@Nullable KtTypeReference typeRef) { 059 return TypeRefHelpersKt.setTypeReference(this, getNameIdentifier(), typeRef); 060 } 061 062 @Nullable 063 @Override 064 public PsiElement getColon() { 065 return findChildByType(KtTokens.COLON); 066 } 067 068 @Nullable 069 public PsiElement getEqualsToken() { 070 return findChildByType(KtTokens.EQ); 071 } 072 073 public boolean hasDefaultValue() { 074 KotlinParameterStub stub = getStub(); 075 if (stub != null) { 076 return stub.hasDefaultValue(); 077 } 078 return getDefaultValue() != null; 079 } 080 081 @Nullable 082 public KtExpression getDefaultValue() { 083 KotlinParameterStub stub = getStub(); 084 if (stub != null && !stub.hasDefaultValue()) return null; 085 086 PsiElement equalsToken = getEqualsToken(); 087 return equalsToken != null ? PsiTreeUtil.getNextSiblingOfType(equalsToken, KtExpression.class) : null; 088 } 089 090 public boolean isMutable() { 091 KotlinParameterStub stub = getStub(); 092 if (stub != null) { 093 return stub.isMutable(); 094 } 095 096 return findChildByType(KtTokens.VAR_KEYWORD) != null; 097 } 098 099 public boolean isVarArg() { 100 KtModifierList modifierList = getModifierList(); 101 return modifierList != null && modifierList.hasModifier(KtTokens.VARARG_KEYWORD); 102 } 103 104 public boolean hasValOrVar() { 105 KotlinParameterStub stub = getStub(); 106 if (stub != null) { 107 return stub.hasValOrVar(); 108 } 109 return getValOrVarKeyword() != null; 110 } 111 112 @Nullable 113 public PsiElement getValOrVarKeyword() { 114 KotlinParameterStub stub = getStub(); 115 if (stub != null && !stub.hasValOrVar()) { 116 return null; 117 } 118 return findChildByType(VAL_VAR_TOKEN_SET); 119 } 120 121 private static final TokenSet VAL_VAR_TOKEN_SET = TokenSet.create(KtTokens.VAL_KEYWORD, KtTokens.VAR_KEYWORD); 122 123 @Override 124 public ItemPresentation getPresentation() { 125 return ItemPresentationProviders.getItemPresentation(this); 126 } 127 128 public boolean isLoopParameter() { 129 return getParent() instanceof KtForExpression; 130 } 131 132 @Nullable 133 @Override 134 public KtParameterList getValueParameterList() { 135 return null; 136 } 137 138 @NotNull 139 @Override 140 public List<KtParameter> getValueParameters() { 141 return Collections.emptyList(); 142 } 143 144 @Nullable 145 @Override 146 public KtTypeReference getReceiverTypeReference() { 147 return null; 148 } 149 150 @Nullable 151 @Override 152 public KtTypeParameterList getTypeParameterList() { 153 return null; 154 } 155 156 @Nullable 157 @Override 158 public KtTypeConstraintList getTypeConstraintList() { 159 return null; 160 } 161 162 @NotNull 163 @Override 164 public List<KtTypeConstraint> getTypeConstraints() { 165 return Collections.emptyList(); 166 } 167 168 @NotNull 169 @Override 170 public List<KtTypeParameter> getTypeParameters() { 171 return Collections.emptyList(); 172 } 173 174 @Nullable 175 public KtFunction getOwnerFunction() { 176 PsiElement parent = getParent(); 177 if (parent == null) return null; 178 PsiElement grandparent = parent.getParent(); 179 if (!(grandparent instanceof KtFunction)) return null; 180 return (KtFunction) grandparent; 181 } 182 }