tolerate INRE in java element renderers (EA-91963 - INRE: FileBasedIndexImpl.handleDu...
[idea/community.git] / java / java-psi-impl / src / com / intellij / psi / presentation / java / JavaPresentationUtil.java
1 /*
2  * Copyright 2000-2014 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.psi.presentation.java;
17
18 import com.intellij.navigation.ColoredItemPresentation;
19 import com.intellij.navigation.ItemPresentation;
20 import com.intellij.openapi.editor.colors.CodeInsightColors;
21 import com.intellij.openapi.editor.colors.TextAttributesKey;
22 import com.intellij.openapi.project.IndexNotReadyException;
23 import com.intellij.openapi.util.Iconable;
24 import com.intellij.psi.*;
25 import com.intellij.psi.util.PsiFormatUtil;
26 import com.intellij.psi.util.PsiFormatUtilBase;
27 import com.intellij.psi.util.PsiTreeUtil;
28 import org.jetbrains.annotations.NotNull;
29 import org.jetbrains.annotations.Nullable;
30
31 import javax.swing.*;
32
33 public class JavaPresentationUtil {
34   private JavaPresentationUtil() {
35   }
36
37   @NotNull
38   public static ColoredItemPresentation getMethodPresentation(@NotNull final PsiMethod psiMethod) {
39     return new ColoredItemPresentation() {
40       @Override
41       public String getPresentableText() {
42         return PsiFormatUtil.formatMethod(
43           psiMethod,
44           PsiSubstitutor.EMPTY, PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS,
45           PsiFormatUtilBase.SHOW_TYPE
46         );
47       }
48
49       @Override
50       public TextAttributesKey getTextAttributesKey() {
51         try {
52           if (psiMethod.isDeprecated()) {
53             return CodeInsightColors.DEPRECATED_ATTRIBUTES;
54           }
55         }
56         catch (IndexNotReadyException ignore) {
57         }
58         return null;
59       }
60
61       @Override
62       public String getLocationString() {
63         return getJavaSymbolContainerText(psiMethod);
64       }
65
66       @Override
67       public Icon getIcon(boolean open) {
68         return psiMethod.getIcon(Iconable.ICON_FLAG_VISIBILITY);
69       }
70     };
71   }
72
73   @NotNull
74   public static ItemPresentation getFieldPresentation(@NotNull final PsiField psiField) {
75     return new ColoredItemPresentation() {
76       @Override
77       public String getPresentableText() {
78         return psiField.getName();
79       }
80
81       @Override
82       public TextAttributesKey getTextAttributesKey() {
83         try {
84           if (psiField.isDeprecated()) {
85             return CodeInsightColors.DEPRECATED_ATTRIBUTES;
86           }
87         }
88         catch (IndexNotReadyException ignore) {
89         }
90         return null;
91       }
92
93       @Override
94       public String getLocationString() {
95         return getJavaSymbolContainerText(psiField);
96       }
97
98       @Override
99       public Icon getIcon(boolean open) {
100         return psiField.getIcon(Iconable.ICON_FLAG_VISIBILITY);
101       }
102     };
103   }
104
105   @Nullable
106   private static String getJavaSymbolContainerText(@NotNull final PsiElement element) {
107     final String result;
108     PsiElement container = PsiTreeUtil.getParentOfType(element, PsiMember.class, PsiFile.class);
109
110     if (container instanceof PsiClass) {
111       String qName = ((PsiClass)container).getQualifiedName();
112       if (qName != null) {
113         result = qName;
114       }
115       else {
116         result = ((PsiClass)container).getName();
117       }
118     }
119     else if (container instanceof PsiJavaFile) {
120       result = ((PsiJavaFile)container).getPackageName();
121     }
122     else {//TODO: local classes
123       result = null;
124     }
125     if (result != null) {
126       return PsiBundle.message("aux.context.display", result);
127     }
128     return null;
129   }
130 }