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";
+ }
+}