java i18n: don't produce illegal forward references in duplicate string literal inspection

This commit is contained in:
Dmitry Batkovich
2017-01-30 10:31:30 +03:00
parent 619fd2605b
commit dd1b298337
6 changed files with 43 additions and 6 deletions
@@ -43,6 +43,7 @@ import com.intellij.util.Processor;
import com.intellij.util.Processors;
import com.intellij.util.SmartList;
import com.intellij.util.text.StringSearcher;
import com.siyeh.ig.style.UnnecessarilyQualifiedStaticUsageInspection;
import gnu.trove.THashMap;
import gnu.trove.THashSet;
import gnu.trove.TIntProcedure;
@@ -239,11 +240,9 @@ public class DuplicateStringLiteralInspection extends BaseLocalInspectionTool {
}
@Nullable
private static PsiReferenceExpression createReferenceTo(final PsiField constant, final PsiLiteralExpression context) throws IncorrectOperationException {
private static PsiReferenceExpression createReferenceTo(final PsiField constant) throws IncorrectOperationException {
PsiElementFactory factory = JavaPsiFacade.getInstance(constant.getProject()).getElementFactory();
PsiReferenceExpression reference = (PsiReferenceExpression)factory.createExpressionFromText(constant.getName(), context);
if (reference.isReferenceTo(constant)) return reference;
reference = (PsiReferenceExpression)factory.createExpressionFromText("XXX." + constant.getName(), null);
PsiReferenceExpression reference = (PsiReferenceExpression)factory.createExpressionFromText("XXX." + constant.getName(), null);
final PsiReferenceExpression classQualifier = (PsiReferenceExpression)reference.getQualifierExpression();
PsiClass containingClass = constant.getContainingClass();
if (containingClass.getQualifiedName() == null) return null;
@@ -380,9 +379,13 @@ public class DuplicateStringLiteralInspection extends BaseLocalInspectionTool {
return;
}
try {
final PsiReferenceExpression reference = createReferenceTo(myConstant, myOriginalExpression);
final PsiReferenceExpression reference = createReferenceTo(myConstant);
if (reference != null) {
myOriginalExpression.replace(reference);
final PsiReferenceExpression newReference = (PsiReferenceExpression)myOriginalExpression.replace(reference);
if (UnnecessarilyQualifiedStaticUsageInspection.isUnnecessarilyQualifiedAccess(newReference, false, false, true)) {
//remove qualifier
newReference.getChildren()[0].delete();
}
}
}
catch (IncorrectOperationException e) {
@@ -0,0 +1,5 @@
class Test {
public static final String S = "qw<caret>erty";
public static final String S1 = "qwerty";
}
@@ -0,0 +1,5 @@
class Test {
public static final String S = Test.S1;
public static final String S1 = "qwerty";
}
@@ -0,0 +1,4 @@
class Test {
public static final String S = "qwerty";
public static final String S1 = "qwe<caret>rty";
}
@@ -0,0 +1,4 @@
class Test {
public static final String S = "qwerty";
public static final String S1 = S;
}
@@ -34,8 +34,24 @@ public class DuplicateStringLiteralInspectionTest extends JavaCodeInsightFixture
myFixture.checkResultByFile("ApplyRenameForWholeFileAfter.java");
}
public void testInvalidForwardReference() {
doTestFix();
}
public void testRemoveRedundantQualifier() {
doTestFix();
}
@Override
protected String getTestDataPath() {
return PluginPathManager.getPluginHomePath("java-i18n") + "/testData/inspections/duplicateStringLiteral/";
}
private void doTestFix() {
myFixture.configureByFile(getTestName(false) + ".java");
final IntentionAction fix = myFixture.findSingleIntention("Replace");
assertNotNull(fix);
myFixture.launchAction(fix);
myFixture.checkResultByFile(getTestName(false) + "After.java");
}
}