From b175ba126e7334d3806b35a116bf0e018fda9d7b Mon Sep 17 00:00:00 2001 From: "alexey.afanasiev" Date: Wed, 30 Oct 2019 10:16:39 +0300 Subject: [PATCH] [groovy] IDEA-224641 Wrong resolve of 'this' and 'super' in anonymous classes definition GitOrigin-RevId: f1818e1bee67c70d89a7dd1d937a31781d808052 --- .../plugins/groovy/lang/psi/util/PsiUtil.java | 9 ++++++- .../lang/resolve/ExpressionTypeTest.groovy | 27 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java index 82bf8ca9160f..b980d8ffc924 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java @@ -443,8 +443,15 @@ public class PsiUtil { } @Nullable - public static PsiClass getContextClass(@Nullable PsiElement context) { + public static PsiClass getContextClass(@Nullable PsiElement element) { + PsiElement context = element; while (context != null) { + if (context instanceof GrAnonymousClassDefinition + && PsiTreeUtil.isAncestor(((GrAnonymousClassDefinition)context).getArgumentListGroovy(), element, false)) { + context = context.getContext(); + continue; + } + if (context instanceof PsiClass && !isInDummyFile(context)) { return (PsiClass)context; } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ExpressionTypeTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ExpressionTypeTest.groovy index 26973d78c442..c8067aa043ba 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ExpressionTypeTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ExpressionTypeTest.groovy @@ -36,4 +36,31 @@ class B {} expressionTypeTest 'new A()++', 'A' expressionTypeTest '++new A()', 'B' } + + @Test + void 'this inside anonymous definition'() { + typingTest ''' +class Test { + void main2() { + new A(this){} + } +} + +class A{} +''', "Test" + } + + @Test + void 'super inside anonymous definition'() { + typingTest ''' +class Test extends C { + void main2() { + new A(super.equals("")){} + } +} +class C {} +class B {} +class A extends B {} +''', "C" + } }