diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/PsiReplacementUtil.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/PsiReplacementUtil.java index a1e5765cf580..a23ba7756f66 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/PsiReplacementUtil.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/PsiReplacementUtil.java @@ -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); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/StaticFieldReferenceOnSubclassInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/StaticFieldReferenceOnSubclassInspection.java index 2af4af531e0d..f60858e5cec6 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/StaticFieldReferenceOnSubclassInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/StaticFieldReferenceOnSubclassInspection.java @@ -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(); diff --git a/plugins/InspectionGadgets/src/META-INF/InspectionGadgets.xml b/plugins/InspectionGadgets/src/META-INF/InspectionGadgets.xml index 382c547986df..6f3bd7aba5ba 100644 --- a/plugins/InspectionGadgets/src/META-INF/InspectionGadgets.xml +++ b/plugins/InspectionGadgets/src/META-INF/InspectionGadgets.xml @@ -367,7 +367,7 @@ + implementationClass="com.siyeh.ig.bugs.StaticFieldReferenceOnSubclassInspection" cleanupTool="true"/> diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/bugs/staticFieldRefOnSubclass/preserveComments.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/bugs/staticFieldRefOnSubclass/preserveComments.after.java new file mode 100644 index 000000000000..34733be94a45 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/bugs/staticFieldRefOnSubclass/preserveComments.after.java @@ -0,0 +1,12 @@ +interface Super { + String FOO = ""; +} + +class Child implements Super {} + +class Bar { + { + /*some comment*/ + String s = Super.FOO; + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/bugs/staticFieldRefOnSubclass/preserveComments.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/bugs/staticFieldRefOnSubclass/preserveComments.java new file mode 100644 index 000000000000..61a2b321c461 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/bugs/staticFieldRefOnSubclass/preserveComments.java @@ -0,0 +1,11 @@ +interface Super { + String FOO = ""; +} + +class Child implements Super {} + +class Bar { + { + String s = Child./*some comment*/FOO; + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/bugs/StaticFieldReferenceOnSubclassTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/bugs/StaticFieldReferenceOnSubclassTest.java new file mode 100644 index 000000000000..bb987ef636e8 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/bugs/StaticFieldReferenceOnSubclassTest.java @@ -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"; + } +}