make rationalize static import to cleanup inspection (IDEA-187319)

This commit is contained in:
Anna Kozlova
2018-03-07 08:02:40 +01:00
parent 89662e6090
commit 75a7ae68e3
6 changed files with 62 additions and 18 deletions
@@ -117,7 +117,8 @@ public class PsiReplacementUtil {
final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project);
final PsiElementFactory factory = psiFacade.getElementFactory();
final PsiReferenceExpression newExpression = (PsiReferenceExpression)factory.createExpressionFromText("xxx", expression);
final PsiReferenceExpression replacementExpression = (PsiReferenceExpression)expression.replace(newExpression);
CommentTracker tracker = new CommentTracker();
final PsiReferenceExpression replacementExpression = (PsiReferenceExpression)tracker.replaceAndRestoreComments(expression, newExpression);
final PsiElement element = replacementExpression.bindToElement(target);
final JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(project);
styleManager.shortenClassReferences(element);
@@ -15,9 +15,11 @@
*/
package com.siyeh.ig.bugs;
import com.intellij.codeInspection.CleanupLocalInspectionTool;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.util.ObjectUtils;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
@@ -25,7 +27,7 @@ import com.siyeh.ig.InspectionGadgetsFix;
import com.siyeh.ig.PsiReplacementUtil;
import org.jetbrains.annotations.NotNull;
public class StaticFieldReferenceOnSubclassInspection extends BaseInspection {
public class StaticFieldReferenceOnSubclassInspection extends BaseInspection implements CleanupLocalInspectionTool {
@Override
@NotNull
@@ -67,11 +69,12 @@ public class StaticFieldReferenceOnSubclassInspection extends BaseInspection {
@Override
public void doFix(Project project, ProblemDescriptor descriptor) {
final PsiIdentifier name = (PsiIdentifier)descriptor.getPsiElement();
final PsiReferenceExpression expression = (PsiReferenceExpression)name.getParent();
assert expression != null;
final PsiField field = (PsiField)expression.resolve();
assert field != null;
final PsiIdentifier name = ObjectUtils.tryCast(descriptor.getPsiElement(), PsiIdentifier.class);
if (name == null) return;
final PsiReferenceExpression expression = ObjectUtils.tryCast(name.getParent(), PsiReferenceExpression.class);
if (expression == null) return;
final PsiField field = ObjectUtils.tryCast(expression.resolve(), PsiField.class);
if (field == null) return;
PsiReplacementUtil.replaceExpressionWithReferenceTo(expression, field);
}
}
@@ -81,12 +84,10 @@ public class StaticFieldReferenceOnSubclassInspection extends BaseInspection {
return new StaticFieldOnSubclassVisitor();
}
private static class StaticFieldOnSubclassVisitor
extends BaseInspectionVisitor {
private static class StaticFieldOnSubclassVisitor extends BaseInspectionVisitor {
@Override
public void visitReferenceExpression(
PsiReferenceExpression expression) {
public void visitReferenceExpression(PsiReferenceExpression expression) {
super.visitReferenceExpression(expression);
final PsiElement qualifier = expression.getQualifier();
if (!(qualifier instanceof PsiReferenceExpression)) {
@@ -100,17 +101,13 @@ public class StaticFieldReferenceOnSubclassInspection extends BaseInspection {
if (!field.hasModifierProperty(PsiModifier.STATIC)) {
return;
}
final PsiElement qualifierReferent =
((PsiReference)qualifier).resolve();
final PsiElement qualifierReferent = ((PsiReferenceExpression)qualifier).resolve();
if (!(qualifierReferent instanceof PsiClass)) {
return;
}
final PsiClass referencedClass = (PsiClass)qualifierReferent;
final PsiClass declaringClass = field.getContainingClass();
if (declaringClass == null) {
return;
}
if (declaringClass.equals(referencedClass)) {
if (declaringClass == null || declaringClass.equals(referencedClass)) {
return;
}
final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(expression.getProject()).getResolveHelper();
@@ -367,7 +367,7 @@
<localInspection groupPath="Java" language="JAVA" suppressId="StaticFieldReferencedViaSubclass" shortName="StaticFieldReferenceOnSubclass"
bundle="com.siyeh.InspectionGadgetsBundle" key="static.field.via.subclass.display.name"
groupBundle="messages.InspectionsBundle" groupKey="group.names.probable.bugs" enabledByDefault="false" level="WARNING"
implementationClass="com.siyeh.ig.bugs.StaticFieldReferenceOnSubclassInspection"/>
implementationClass="com.siyeh.ig.bugs.StaticFieldReferenceOnSubclassInspection" cleanupTool="true"/>
<localInspection groupPath="Java" language="JAVA" shortName="StringEquality" bundle="com.siyeh.InspectionGadgetsBundle" key="string.comparison.display.name"
groupBundle="messages.InspectionsBundle" groupKey="group.names.probable.bugs" enabledByDefault="true" level="WARNING"
implementationClass="com.siyeh.ig.bugs.StringEqualityInspection"/>
@@ -0,0 +1,12 @@
interface Super {
String FOO = "";
}
class Child implements Super {}
class Bar {
{
/*some comment*/
String s = Super.FOO;
}
}
@@ -0,0 +1,11 @@
interface Super {
String FOO = "";
}
class Child implements Super {}
class Bar {
{
String s = Child./*some comment*/FO<caret>O;
}
}
@@ -0,0 +1,23 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.siyeh.ig.fixes.bugs;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.IGQuickFixesTestCase;
import com.siyeh.ig.bugs.StaticFieldReferenceOnSubclassInspection;
public class StaticFieldReferenceOnSubclassTest extends IGQuickFixesTestCase {
@Override
public void setUp() throws Exception {
super.setUp();
myFixture.enableInspections(new StaticFieldReferenceOnSubclassInspection());
}
public void testPreserveTypeArgs() {
doTest("preserveComments", InspectionGadgetsBundle.message("static.field.via.subclass.rationalize.quickfix"));
}
@Override
protected String getRelativePath() {
return "bugs/staticFieldRefOnSubclass";
}
}