From 63ab4f06f7bb28413a1a883ca7212132ae8ca9fd Mon Sep 17 00:00:00 2001 From: "Andrey.Cherkasov" Date: Fri, 6 May 2022 18:04:09 +0300 Subject: [PATCH] ExpressionUtils#getEffectiveQualifier return null if non-static member is referenced from a static field initializer IJ-CR-21030 GitOrigin-RevId: a91e78151cab5c78fe3576c61b71db6cf7b46403 --- .../beforeNonStaticMethodFromStaticContext4.java | 16 ++++++++++++++++ .../beforeNonStaticMethodFromStaticContext5.java | 14 ++++++++++++++ .../com/siyeh/ig/psiutils/ExpressionUtils.java | 9 ++++----- 3 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyMethodCall/beforeNonStaticMethodFromStaticContext4.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyMethodCall/beforeNonStaticMethodFromStaticContext5.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyMethodCall/beforeNonStaticMethodFromStaticContext4.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyMethodCall/beforeNonStaticMethodFromStaticContext4.java new file mode 100644 index 000000000000..3e15ed94fcb2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyMethodCall/beforeNonStaticMethodFromStaticContext4.java @@ -0,0 +1,16 @@ +// "Qualify the call with 'A.this'" "false" +class A { + class B { + static String name(String key) { + return ""; + } + + static { + String s = name(); + } + } + + String name(){ + return ""; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyMethodCall/beforeNonStaticMethodFromStaticContext5.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyMethodCall/beforeNonStaticMethodFromStaticContext5.java new file mode 100644 index 000000000000..7dfd6a51d077 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyMethodCall/beforeNonStaticMethodFromStaticContext5.java @@ -0,0 +1,14 @@ +// "Qualify the call with 'A.this'" "false" +class A { + class B { + static String name(String key) { + return ""; + } + + static String s = name(); + } + + String name(){ + return ""; + } +} diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java index 1c6dd4a3ed03..c2ba3cd8e130 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java @@ -971,13 +971,12 @@ public final class ExpressionUtils { * or if reference points to non-static member of class from static context */ public static PsiExpression getEffectiveQualifier(@NotNull PsiReferenceExpression ref, @NotNull PsiMember member) { - PsiElementFactory factory = JavaPsiFacade.getElementFactory(ref.getProject()); - PsiClass memberClass = member.getContainingClass(); - PsiMethod containingMethod = PsiTreeUtil.getParentOfType(ref, PsiMethod.class); - PsiClassInitializer classInitializer = PsiTreeUtil.getParentOfType(ref, PsiClassInitializer.class); - if (!member.hasModifierProperty(PsiModifier.STATIC) && (isStaticMember(containingMethod) || isStaticMember(classInitializer))) { + PsiMember containingMember = PsiTreeUtil.getParentOfType(ref, PsiMethod.class, PsiClassInitializer.class, PsiField.class); + if (!member.hasModifierProperty(PsiModifier.STATIC) && isStaticMember(containingMember)) { return null; } + PsiElementFactory factory = JavaPsiFacade.getElementFactory(ref.getProject()); + PsiClass memberClass = member.getContainingClass(); if (memberClass != null) { if (member.hasModifierProperty(PsiModifier.STATIC)) { return factory.createReferenceExpression(memberClass);