From b64b3812e6f02d2a8569802c0da21184386a35d2 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 13 Apr 2018 16:05:12 +0700 Subject: [PATCH] AnnotationUtil: do not cache own annotations results for local variables --- .../intellij/codeInsight/AnnotationUtil.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java b/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java index 45e4913fdc62..6ed3843aa0c1 100644 --- a/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java +++ b/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java @@ -77,25 +77,30 @@ public class AnnotationUtil { } private static PsiAnnotation findOwnAnnotation(final PsiModifierListOwner listOwner, Collection annotationNames) { + if (listOwner instanceof PsiLocalVariable) { + return findAnnotationDirectly(listOwner, annotationNames); + } Map, PsiAnnotation> map = CachedValuesManager.getCachedValue( listOwner, () -> { - Map, PsiAnnotation> value = ConcurrentFactoryMap.createMap(annotationNames1-> { - final PsiModifierList list = listOwner.getModifierList(); - if (list == null) return null; - for (PsiAnnotation annotation : list.getAnnotations()) { - if (annotationNames1.contains(annotation.getQualifiedName())) { - return annotation; - } - } - return null; - } - ); + Map, PsiAnnotation> value = ConcurrentFactoryMap.createMap(names -> findAnnotationDirectly(listOwner, names)); return CachedValueProvider.Result.create(value, PsiModificationTracker.MODIFICATION_COUNT); }); return map.get(annotationNames); } + @Nullable + private static PsiAnnotation findAnnotationDirectly(PsiModifierListOwner listOwner, Collection annotationNames) { + final PsiModifierList list = listOwner.getModifierList(); + if (list == null) return null; + for (PsiAnnotation annotation : list.getAnnotations()) { + if (annotationNames.contains(annotation.getQualifiedName())) { + return annotation; + } + } + return null; + } + private static PsiAnnotation findNonCodeAnnotation(final PsiModifierListOwner listOwner, Collection annotationNames) { if (listOwner instanceof PsiLocalVariable) { // Non-code annotations for local variables are not supported: don't bother to search them