From 50895e6bba12ea409e8b69b4106be28249d3f4ba Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 13 May 2019 20:57:37 +0200 Subject: [PATCH] highlighting: nested anonymous implicit class parameter (IDEA-212466) GitOrigin-RevId: 049e1970703735975e8b98d0588fd47f9a7ea93e --- .../impl/analysis/HighlightVisitorImpl.java | 18 +++++++++++------- .../daemon/JavaSymbolHighlightingTest.java | 4 +++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 43b1406122d4..5d633783a1d9 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -1126,13 +1126,17 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh if (resolved instanceof PsiVariable) { PsiVariable variable = (PsiVariable)resolved; - PsiElement containingClass = PsiTreeUtil.getNonStrictParentOfType(ref, PsiClass.class, PsiLambdaExpression.class); - if ((containingClass instanceof PsiAnonymousClass || containingClass instanceof PsiLambdaExpression) && - !PsiTreeUtil.isAncestor(containingClass, variable, false) && - !(variable instanceof PsiField) && - (containingClass instanceof PsiLambdaExpression || - !PsiTreeUtil.isAncestor(((PsiAnonymousClass)containingClass).getArgumentList(), ref, false))) { - myHolder.add(HighlightInfo.newHighlightInfo(JavaHighlightInfoTypes.IMPLICIT_ANONYMOUS_CLASS_PARAMETER).range(ref).create()); + if (!(variable instanceof PsiField)) { + PsiElement containingClass = PsiTreeUtil.getNonStrictParentOfType(ref, PsiClass.class, PsiLambdaExpression.class); + while ((containingClass instanceof PsiAnonymousClass || containingClass instanceof PsiLambdaExpression) && + !PsiTreeUtil.isAncestor(containingClass, variable, false)) { + if (containingClass instanceof PsiLambdaExpression || + !PsiTreeUtil.isAncestor(((PsiAnonymousClass)containingClass).getArgumentList(), ref, false)) { + myHolder.add(HighlightInfo.newHighlightInfo(JavaHighlightInfoTypes.IMPLICIT_ANONYMOUS_CLASS_PARAMETER).range(ref).create()); + break; + } + containingClass = PsiTreeUtil.getParentOfType(containingClass, PsiClass.class, PsiLambdaExpression.class); + } } if (variable instanceof PsiParameter && ref instanceof PsiExpression && PsiUtil.isAccessedForWriting((PsiExpression)ref)) { diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/JavaSymbolHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/JavaSymbolHighlightingTest.java index f05b3049b81a..b3165fa2f2c1 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/JavaSymbolHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/JavaSymbolHighlightingTest.java @@ -23,11 +23,13 @@ public class JavaSymbolHighlightingTest extends LightDaemonAnalyzerTestCase { public void testImplicitAnonymousClassParameterHighlighting_InsideLambda() { configureFromFileText("Test.java", - "class T {\n" + + "class T {" + + " private T(int i){}\n" + " public void test() {\n" + " int xxx = 12;\n" + " Runnable r = () -> {\n" + " check(xxx);\n" + + " new T(xxx){};" + " };" + " }\n" + " public void check(int a) {}\n" +