From 99a028b295299c73568ee3f2e37422a5f5df30b0 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Wed, 19 Apr 2017 13:32:15 +0300 Subject: [PATCH] `MetaAnnotationUtil.findMetaAnnotations` now is lazy. --- .../codeInsight/MetaAnnotationUtil.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/java/openapi/src/com/intellij/codeInsight/MetaAnnotationUtil.java b/java/openapi/src/com/intellij/codeInsight/MetaAnnotationUtil.java index 5b2e63bca38c..911a7d2695be 100644 --- a/java/openapi/src/com/intellij/codeInsight/MetaAnnotationUtil.java +++ b/java/openapi/src/com/intellij/codeInsight/MetaAnnotationUtil.java @@ -26,7 +26,6 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.AnnotatedElementsSearch; import com.intellij.psi.search.searches.DirectClassInheritorsSearch; import com.intellij.psi.util.*; -import com.intellij.util.SmartList; import com.intellij.util.containers.ConcurrentFactoryMap; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; @@ -35,6 +34,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.stream.Stream; /** * @since 2016.3 @@ -196,20 +196,19 @@ public class MetaAnnotationUtil { @NotNull - public static PsiAnnotation[] findMetaAnnotations(@NotNull PsiModifierListOwner listOwner, - @NotNull final Collection annotations) { + public static Stream findMetaAnnotations(@NotNull PsiModifierListOwner listOwner, + @NotNull final Collection annotations) { - List result = new SmartList<>(AnnotationUtil.findAnnotations(listOwner, annotations)); - final List resolvedAnnotations = getResolvedClassesInAnnotationsList(listOwner); - for (String annotationFQN : annotations) { - for (PsiClass psiClass : resolvedAnnotations) { - PsiAnnotation annotation = metaAnnotationCached(annotationFQN, psiClass); - if (annotation != null) - result.add(annotation); - } - } + Stream directAnnotations = Stream.of(AnnotationUtil.findAnnotations(listOwner, annotations)); - return result.isEmpty() ? PsiAnnotation.EMPTY_ARRAY : result.toArray(new PsiAnnotation[result.size()]); + Stream metannotations = + Stream.generate(() -> getResolvedClassesInAnnotationsList(listOwner)).limit(1) + .flatMap(e -> e.stream()) + .flatMap(psiClass -> annotations.stream() + .map(annotationFQN -> metaAnnotationCached(annotationFQN, psiClass))) + .filter(Objects::nonNull); + + return Stream.concat(directAnnotations, metannotations); }