don't use ejb super methods for injection annotation searching (IDEA-136292) rubymine/140.2408
authorpeter <peter@jetbrains.com>
Wed, 11 Feb 2015 18:44:45 +0000 (19:44 +0100)
committerpeter <peter@jetbrains.com>
Wed, 11 Feb 2015 18:46:42 +0000 (19:46 +0100)
plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/AnnotationUtilEx.java

index fa8e1ce4bd7ad0b5de5bfdca603caf4c1fd62089..c73b52880c78d8c43900fad9ec2b0a5cd1277204 100644 (file)
@@ -19,9 +19,10 @@ import com.intellij.codeInsight.AnnotationUtil;
 import com.intellij.openapi.util.Pair;
 import com.intellij.psi.*;
 import com.intellij.psi.impl.PsiConstantEvaluationHelperImpl;
-import com.intellij.psi.search.searches.SuperMethodsSearch;
-import com.intellij.psi.util.*;
-import com.intellij.util.Processor;
+import com.intellij.psi.util.CachedValueProvider;
+import com.intellij.psi.util.CachedValuesManager;
+import com.intellij.psi.util.PsiModificationTracker;
+import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.util.containers.ContainerUtil;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
@@ -284,49 +285,23 @@ public class AnnotationUtilEx {
   }
 
   private static PsiAnnotation[] getHierarchyAnnotations(PsiModifierListOwner listOwner) {
-    PsiModifierList modifierList = listOwner.getModifierList();
-
     final Set<PsiAnnotation> all = new HashSet<PsiAnnotation>() {
       public boolean add(PsiAnnotation o) {
         // don't overwrite "higher level" annotations
         return !contains(o) && super.add(o);
       }
     };
-    if (listOwner instanceof PsiMethod) {
+
+    PsiModifierList modifierList = listOwner.getModifierList();
+    if (modifierList != null) {
+      ContainerUtil.addAll(all, modifierList.getAnnotations());
+    }
+    for (PsiModifierListOwner superOwner : AnnotationUtil.getSuperAnnotationOwners(listOwner)) {
+      modifierList = superOwner.getModifierList();
       if (modifierList != null) {
         ContainerUtil.addAll(all, modifierList.getAnnotations());
       }
-      SuperMethodsSearch.search((PsiMethod)listOwner, null, true, true).forEach(new Processor<MethodSignatureBackedByPsiMethod>() {
-        public boolean process(final MethodSignatureBackedByPsiMethod superMethod) {
-          ContainerUtil.addAll(all, superMethod.getMethod().getModifierList().getAnnotations());
-          return true;
-        }
-      });
-      return all.toArray(new PsiAnnotation[all.size()]);
-    }
-    if (listOwner instanceof PsiParameter) {
-      PsiParameter parameter = (PsiParameter)listOwner;
-      PsiElement declarationScope = parameter.getDeclarationScope();
-      PsiParameterList parameterList;
-      if (declarationScope instanceof PsiMethod && parameter.getParent() == (parameterList = ((PsiMethod)declarationScope).getParameterList())) {
-        PsiMethod method = (PsiMethod)declarationScope;
-        final int parameterIndex = parameterList.getParameterIndex(parameter);
-        if (modifierList != null) {
-          ContainerUtil.addAll(all, modifierList.getAnnotations());
-        }
-        SuperMethodsSearch.search(method, null, true, true).forEach(new Processor<MethodSignatureBackedByPsiMethod>() {
-          public boolean process(final MethodSignatureBackedByPsiMethod superMethod) {
-            PsiParameter superParameter = superMethod.getMethod().getParameterList().getParameters()[parameterIndex];
-            PsiModifierList modifierList = superParameter.getModifierList();
-            if (modifierList != null) {
-              ContainerUtil.addAll(all, modifierList.getAnnotations());
-            }
-            return true;
-          }
-        });
-        return all.toArray(new PsiAnnotation[all.size()]);
-      }
     }
-    return modifierList == null ? PsiAnnotation.EMPTY_ARRAY : modifierList.getAnnotations();
+    return all.isEmpty() ? PsiAnnotation.EMPTY_ARRAY : all.toArray(new PsiAnnotation[all.size()]);
   }
 }