From 48459f04cc5d71eba45d14ce91a22f1dba27061e Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Wed, 6 Feb 2019 15:28:36 +0300 Subject: [PATCH] [groovy] use tree walk-up to find enclosing member is @CS check (IDEA-206662) The bug appeared because anonymous classes don't have containing class. --- .../groovy/lang/psi/impl/GroovyPsiManager.java | 12 ++++-------- .../lang/highlighting/GroovyHighlightingTest.groovy | 5 +++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiManager.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiManager.java index 2615fe71a613..0f19484cbf20 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiManager.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiManager.java @@ -10,6 +10,7 @@ import com.intellij.openapi.util.RecursionManager; import com.intellij.psi.*; import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ConcurrencyUtil; import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; @@ -81,19 +82,14 @@ public class GroovyPsiManager { } public boolean isCompileStatic(@NotNull PsiMember member) { - Boolean aBoolean = myCompileStatic.get(member); - if (aBoolean == null) { - aBoolean = ConcurrencyUtil.cacheOrGet(myCompileStatic, member, isCompileStaticInner(member)); - } - return aBoolean; + return myCompileStatic.computeIfAbsent(member, this::isCompileStaticInner); } private boolean isCompileStaticInner(@NotNull PsiMember member) { PsiAnnotation annotation = getCompileStaticAnnotation(member); if (annotation != null) return checkForPass(annotation); - PsiClass aClass = member.getContainingClass(); - if (aClass != null) return isCompileStatic(aClass); - return false; + PsiMember enclosingMember = PsiTreeUtil.getParentOfType(member, PsiMember.class, true); + return enclosingMember != null && isCompileStatic(enclosingMember); } @Nullable diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy index e2863c2d1469..72410012303d 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy @@ -577,6 +577,11 @@ print abc @CompileStatic def bar() { print abc + new Object() { + def baz() { + print(unknown) + } + } } } ''', true, false, false, GrUnresolvedAccessInspection)