highlighting: nested anonymous implicit class parameter (IDEA-212466)

GitOrigin-RevId: 049e1970703735975e8b98d0588fd47f9a7ea93e
This commit is contained in:
Anna Kozlova
2019-05-13 23:08:31 +03:00
committed by intellij-monorepo-bot
parent b6e3ff604a
commit 50895e6bba
2 changed files with 14 additions and 8 deletions
@@ -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)) {
@@ -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(<symbolName type=\"IMPLICIT_ANONYMOUS_CLASS_PARAMETER\">xxx</symbolName>);\n" +
" new T(<symbolName type=\"IMPLICIT_ANONYMOUS_CLASS_PARAMETER\">xxx</symbolName>){};" +
" };" +
" }\n" +
" public void check(int a) {}\n" +