| /* |
| * Copyright 2000-2012 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.intellij.psi.impl.compiled; |
| |
| import com.intellij.psi.*; |
| import com.intellij.psi.impl.PsiImplUtil; |
| import com.intellij.psi.impl.cache.ModifierFlags; |
| import com.intellij.psi.impl.java.stubs.JavaStubElementTypes; |
| import com.intellij.psi.impl.java.stubs.PsiModifierListStub; |
| import com.intellij.psi.impl.source.SourceTreeToPsiMap; |
| import com.intellij.psi.impl.source.tree.JavaElementType; |
| import com.intellij.psi.impl.source.tree.TreeElement; |
| import com.intellij.util.IncorrectOperationException; |
| import org.jetbrains.annotations.NonNls; |
| import org.jetbrains.annotations.NotNull; |
| |
| @SuppressWarnings("ForLoopReplaceableByForEach") |
| public class ClsModifierListImpl extends ClsRepositoryPsiElement<PsiModifierListStub> implements PsiModifierList { |
| public ClsModifierListImpl(final PsiModifierListStub stub) { |
| super(stub); |
| } |
| |
| @Override |
| @NotNull |
| public PsiElement[] getChildren() { |
| return getAnnotations(); |
| } |
| |
| @Override |
| public boolean hasModifierProperty(@NotNull String name) { |
| return ModifierFlags.hasModifierProperty(name, getStub().getModifiersMask()); |
| } |
| |
| @Override |
| public boolean hasExplicitModifier(@NotNull String name) { |
| return hasModifierProperty(name); |
| } |
| |
| @Override |
| public void setModifierProperty(@NotNull String name, boolean value) throws IncorrectOperationException { |
| throw new IncorrectOperationException(CAN_NOT_MODIFY_MESSAGE); |
| } |
| |
| @Override |
| public void checkSetModifierProperty(@NotNull String name, boolean value) throws IncorrectOperationException { |
| throw new IncorrectOperationException(CAN_NOT_MODIFY_MESSAGE); |
| } |
| |
| @Override |
| @NotNull |
| public PsiAnnotation[] getAnnotations() { |
| return getStub().getChildrenByType(JavaStubElementTypes.ANNOTATION, PsiAnnotation.ARRAY_FACTORY); |
| } |
| |
| @Override |
| @NotNull |
| public PsiAnnotation[] getApplicableAnnotations() { |
| return getAnnotations(); |
| } |
| |
| @Override |
| public PsiAnnotation findAnnotation(@NotNull String qualifiedName) { |
| return PsiImplUtil.findAnnotation(this, qualifiedName); |
| } |
| |
| @Override |
| @NotNull |
| public PsiAnnotation addAnnotation(@NotNull @NonNls String qualifiedName) { |
| throw new IncorrectOperationException(CAN_NOT_MODIFY_MESSAGE); |
| } |
| |
| @Override |
| public void appendMirrorText(int indentLevel, @NotNull StringBuilder buffer) { |
| final PsiElement parent = getParent(); |
| final PsiAnnotation[] annotations = getAnnotations(); |
| final boolean separateAnnotations = parent instanceof PsiClass || parent instanceof PsiMethod || parent instanceof PsiField; |
| |
| for (int i = 0; i < annotations.length; i++) { |
| appendText(annotations[i], indentLevel, buffer, separateAnnotations ? NEXT_LINE : " "); |
| } |
| |
| final boolean isClass = parent instanceof PsiClass; |
| final boolean isInterface = isClass && ((PsiClass)parent).isInterface(); |
| final boolean isEnum = isClass && ((PsiClass)parent).isEnum(); |
| final boolean isInterfaceClass = isClass && parent.getParent() instanceof PsiClass && ((PsiClass)parent.getParent()).isInterface(); |
| final boolean isMethod = parent instanceof PsiMethod; |
| final boolean isInterfaceMethod = isMethod && parent.getParent() instanceof PsiClass && ((PsiClass)parent.getParent()).isInterface(); |
| final boolean isField = parent instanceof PsiField; |
| final boolean isInterfaceField = isField && parent.getParent() instanceof PsiClass && ((PsiClass)parent.getParent()).isInterface(); |
| final boolean isEnumConstant = parent instanceof PsiEnumConstant; |
| |
| if (hasModifierProperty(PsiModifier.PUBLIC) && !isInterfaceMethod && !isInterfaceField && !isInterfaceClass && !isEnumConstant) { |
| buffer.append(PsiModifier.PUBLIC).append(' '); |
| } |
| if (hasModifierProperty(PsiModifier.PROTECTED)) { |
| buffer.append(PsiModifier.PROTECTED).append(' '); |
| } |
| if (hasModifierProperty(PsiModifier.PRIVATE)) { |
| buffer.append(PsiModifier.PRIVATE).append(' '); |
| } |
| if (hasModifierProperty(PsiModifier.STATIC) && !isInterfaceField && !isEnumConstant) { |
| buffer.append(PsiModifier.STATIC).append(' '); |
| } |
| if (hasModifierProperty(PsiModifier.ABSTRACT) && !isInterface && !isInterfaceMethod) { |
| buffer.append(PsiModifier.ABSTRACT).append(' '); |
| } |
| if (hasModifierProperty(PsiModifier.FINAL) && !isEnum && !isInterfaceField && !isEnumConstant) { |
| buffer.append(PsiModifier.FINAL).append(' '); |
| } |
| if (hasModifierProperty(PsiModifier.NATIVE)) { |
| buffer.append(PsiModifier.NATIVE).append(' '); |
| } |
| if (hasModifierProperty(PsiModifier.SYNCHRONIZED)) { |
| buffer.append(PsiModifier.SYNCHRONIZED).append(' '); |
| } |
| if (hasModifierProperty(PsiModifier.TRANSIENT)) { |
| buffer.append(PsiModifier.TRANSIENT).append(' '); |
| } |
| if (hasModifierProperty(PsiModifier.VOLATILE)) { |
| buffer.append(PsiModifier.VOLATILE).append(' '); |
| } |
| if (hasModifierProperty(PsiModifier.STRICTFP)) { |
| buffer.append(PsiModifier.STRICTFP).append(' '); |
| } |
| if (hasModifierProperty(PsiModifier.DEFAULT)) { |
| buffer.append(PsiModifier.DEFAULT).append(' '); |
| } |
| } |
| |
| @Override |
| public void setMirror(@NotNull TreeElement element) throws InvalidMirrorException { |
| setMirrorCheckingType(element, JavaElementType.MODIFIER_LIST); |
| setMirrors(getAnnotations(), SourceTreeToPsiMap.<PsiModifierList>treeToPsiNotNull(element).getAnnotations()); |
| } |
| |
| @Override |
| public void accept(@NotNull PsiElementVisitor visitor) { |
| if (visitor instanceof JavaElementVisitor) { |
| ((JavaElementVisitor)visitor).visitModifierList(this); |
| } |
| else { |
| visitor.visitElement(this); |
| } |
| } |
| |
| @Override |
| public String toString() { |
| return "PsiModifierList"; |
| } |
| } |