mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IG: warn but no fix on unqualified access where this qualifier is impossible (IDEA-178225)
This commit is contained in:
+35
-1
@@ -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() {
|
||||
|
||||
+5
-16
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+15
-31
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user