From 98cd93ea0e971743c82aeb1fefa4bc3eb71735fd Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 31 Aug 2017 14:26:04 +0200 Subject: [PATCH] IG: warn but no fix on unqualified access where this qualifier is impossible (IDEA-178225) --- .../siyeh/ig/fixes/AddThisQualifierFix.java | 36 ++++++++++++++- .../UnqualifiedFieldAccessInspection.java | 21 ++------- .../UnqualifiedMethodAccessInspection.java | 46 ++++++------------- 3 files changed, 55 insertions(+), 48 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/AddThisQualifierFix.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/AddThisQualifierFix.java index e55dfc3afaac..86ec987b3a0d 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/AddThisQualifierFix.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/AddThisQualifierFix.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2016 Bas Leijdekkers + * Copyright 2011-2017 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,18 +17,52 @@ package com.siyeh.ig.fixes; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiClass; import com.intellij.psi.PsiExpression; +import com.intellij.psi.PsiMember; import com.intellij.psi.PsiReferenceExpression; +import com.intellij.psi.util.InheritanceUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.PsiReplacementUtil; +import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.ExpressionUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class AddThisQualifierFix extends InspectionGadgetsFix { + private AddThisQualifierFix() {} + + @Nullable + public static AddThisQualifierFix buildFix(PsiExpression expressionToQualify, PsiMember memberAccessed) { + if (!isThisQualifierPossible(expressionToQualify, memberAccessed)) { + return null; + } + return new AddThisQualifierFix(); + } + + private static boolean isThisQualifierPossible(PsiExpression memberAccessExpression, @NotNull PsiMember member) { + final PsiClass memberClass = member.getContainingClass(); + if (memberClass == null) { + return false; + } + PsiClass containingClass = ClassUtils.getContainingClass(memberAccessExpression); + if (InheritanceUtil.isInheritorOrSelf(containingClass, memberClass, true)) { + // unqualified this. + return true; + } + do { + containingClass = ClassUtils.getContainingClass(containingClass); + } + while (containingClass != null && !InheritanceUtil.isInheritorOrSelf(containingClass, memberClass, true)); + // qualified this needed, which is not possible on local or anonymous class. + return containingClass != null && !PsiUtil.isLocalOrAnonymousClass(containingClass); + } + @Override @NotNull public String getFamilyName() { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnqualifiedFieldAccessInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnqualifiedFieldAccessInspection.java index 4746a0aa1448..54d6317011be 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnqualifiedFieldAccessInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnqualifiedFieldAccessInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2016 Bas Leijdekkers + * Copyright 2006-2017 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,6 @@ package com.siyeh.ig.style; import com.intellij.codeInspection.CleanupLocalInspectionTool; import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -47,7 +45,9 @@ public class UnqualifiedFieldAccessInspection extends BaseInspection implements @Override public InspectionGadgetsFix buildFix(Object... infos) { - return new AddThisQualifierFix(); + final PsiReferenceExpression expressionToQualify = (PsiReferenceExpression)infos[0]; + final PsiField fieldAccessed = (PsiField)infos[1]; + return AddThisQualifierFix.buildFix(expressionToQualify, fieldAccessed); } private static class UnqualifiedFieldAccessVisitor extends BaseInspectionVisitor { @@ -71,18 +71,7 @@ public class UnqualifiedFieldAccessInspection extends BaseInspection implements if (field.hasModifierProperty(PsiModifier.STATIC)) { return; } - final PsiClass fieldClass = field.getContainingClass(); - if (fieldClass == null) { - return; - } - if (PsiUtil.isLocalOrAnonymousClass(fieldClass)) { - final PsiClass expressionClass = PsiTreeUtil.getParentOfType(expression, PsiClass.class); - if (expressionClass != null && !expressionClass.equals(fieldClass)) { - // qualified this expression not possible for anonymous or local class - return; - } - } - registerError(expression); + registerError(expression, expression, field); } } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnqualifiedMethodAccessInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnqualifiedMethodAccessInspection.java index f7086af1cd76..23c16bb3e8ea 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnqualifiedMethodAccessInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnqualifiedMethodAccessInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2016 Bas Leijdekkers + * Copyright 2006-2017 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,10 @@ package com.siyeh.ig.style; import com.intellij.codeInspection.CleanupLocalInspectionTool; -import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiMethodCallExpression; +import com.intellij.psi.PsiModifier; +import com.intellij.psi.PsiReferenceExpression; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -47,42 +48,25 @@ public class UnqualifiedMethodAccessInspection extends BaseInspection implements @Override public InspectionGadgetsFix buildFix(Object... infos) { - return new AddThisQualifierFix(); + final PsiReferenceExpression expressionToQualify = (PsiReferenceExpression)infos[0]; + final PsiMethod methodAccessed = (PsiMethod)infos[1]; + return AddThisQualifierFix.buildFix(expressionToQualify, methodAccessed); } private static class UnqualifiedMethodAccessVisitor extends BaseInspectionVisitor { @Override - public void visitReferenceExpression(@NotNull PsiReferenceExpression expression) { - super.visitReferenceExpression(expression); - final PsiExpression qualifierExpression = expression.getQualifierExpression(); - if (qualifierExpression != null) { + public void visitMethodCallExpression(PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + if (methodExpression.getQualifierExpression() != null) { return; } - final PsiReferenceParameterList parameterList = expression.getParameterList(); - if (parameterList == null) { + final PsiMethod method = expression.resolveMethod(); + if (method == null || method.isConstructor() || method.hasModifierProperty(PsiModifier.STATIC)) { return; } - final PsiElement element = expression.resolve(); - if (!(element instanceof PsiMethod)) { - return; - } - final PsiMethod method = (PsiMethod)element; - if (method.isConstructor() || method.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return; - } - if (PsiUtil.isLocalOrAnonymousClass(containingClass)) { - final PsiClass expressionClass = PsiTreeUtil.getParentOfType(expression, PsiClass.class); - if (expressionClass == null || !expressionClass.equals(containingClass)) { - // qualified this expression not possible for anonymous or local class - return; - } - } - registerError(expression); + registerError(methodExpression, methodExpression, method); } } } \ No newline at end of file