From cda259d2552a167ccf3b113c3301c515d7464c95 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Sat, 9 Jun 2018 16:18:54 +0700 Subject: [PATCH] CharsetObjectCanBeUsedInspection: remove qualifier in static import Fixes IDEA-193573 IDEA doesn't recornize static import on replacing by StandardCharsets --- .../CharsetObjectCanBeUsedInspection.java | 15 +++++++++++++-- .../afterStringRemoveQualifier.java | 10 ++++++++++ .../afterStringRemoveQualifierConflict.java | 13 +++++++++++++ .../beforeStringRemoveQualifier.java | 10 ++++++++++ .../beforeStringRemoveQualifierConflict.java | 11 +++++++++++ 5 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/inspection/charsetObjectCanBeUsed/afterStringRemoveQualifier.java create mode 100644 java/java-tests/testData/inspection/charsetObjectCanBeUsed/afterStringRemoveQualifierConflict.java create mode 100644 java/java-tests/testData/inspection/charsetObjectCanBeUsed/beforeStringRemoveQualifier.java create mode 100644 java/java-tests/testData/inspection/charsetObjectCanBeUsed/beforeStringRemoveQualifierConflict.java diff --git a/java/java-impl/src/com/intellij/codeInspection/CharsetObjectCanBeUsedInspection.java b/java/java-impl/src/com/intellij/codeInspection/CharsetObjectCanBeUsedInspection.java index 7b05acace03e..a1d991700f1d 100644 --- a/java/java-impl/src/com/intellij/codeInspection/CharsetObjectCanBeUsedInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/CharsetObjectCanBeUsedInspection.java @@ -5,6 +5,7 @@ import com.intellij.codeInsight.ExceptionUtil; import com.intellij.codeInsight.daemon.impl.quickfix.DeleteCatchFix; import com.intellij.codeInsight.daemon.impl.quickfix.DeleteMultiCatchFix; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.util.PsiTreeUtil; @@ -13,6 +14,7 @@ import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; import com.siyeh.ig.psiutils.CommentTracker; import com.siyeh.ig.psiutils.ExpressionUtils; +import com.siyeh.ig.psiutils.ImportUtils; import one.util.streamex.StreamEx; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nls; @@ -230,8 +232,17 @@ public class CharsetObjectCanBeUsedInspection extends AbstractBaseJavaLocalInspe PsiElement anchor = PsiTreeUtil.getParentOfType(expression, PsiCallExpression.class); if (anchor == null) return; CommentTracker ct = new CommentTracker(); - JavaCodeStyleManager.getInstance(project) - .shortenClassReferences(ct.replaceAndRestoreComments(expression, "java.nio.charset." + myConstantName)); + String replacement = "java.nio.charset." + myConstantName; + PsiReferenceExpression ref = (PsiReferenceExpression)ct.replaceAndRestoreComments(expression, replacement); + PsiField field = ObjectUtils.tryCast(ref.resolve(), PsiField.class); + PsiExpression qualifier = ref.getQualifierExpression(); + if (field != null && qualifier != null && ImportUtils.isStaticallyImported(field, ref)) { + PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(project).getResolveHelper(); + if (field.equals(resolveHelper.resolveAccessibleReferencedVariable(StringUtil.getShortName(myConstantName), ref))) { + qualifier.delete(); + } + } + JavaCodeStyleManager.getInstance(project).shortenClassReferences(ref); while (true) { PsiTryStatement tryStatement = PsiTreeUtil.getParentOfType(anchor, PsiTryStatement.class, true, PsiMember.class, PsiLambdaExpression.class); diff --git a/java/java-tests/testData/inspection/charsetObjectCanBeUsed/afterStringRemoveQualifier.java b/java/java-tests/testData/inspection/charsetObjectCanBeUsed/afterStringRemoveQualifier.java new file mode 100644 index 000000000000..ec1c77b72ddd --- /dev/null +++ b/java/java-tests/testData/inspection/charsetObjectCanBeUsed/afterStringRemoveQualifier.java @@ -0,0 +1,10 @@ +// "Replace with 'StandardCharsets.UTF_8'" "true" +import static java.nio.charset.StandardCharsets.*; + +class Test { + void test(byte[] bytes) throws Exception { + String string = new String(bytes, UTF_8); + System.out.println(string); + string.getBytes(UTF_8); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/charsetObjectCanBeUsed/afterStringRemoveQualifierConflict.java b/java/java-tests/testData/inspection/charsetObjectCanBeUsed/afterStringRemoveQualifierConflict.java new file mode 100644 index 000000000000..fdad81164179 --- /dev/null +++ b/java/java-tests/testData/inspection/charsetObjectCanBeUsed/afterStringRemoveQualifierConflict.java @@ -0,0 +1,13 @@ +// "Replace with 'StandardCharsets.UTF_8'" "true" +import java.nio.charset.StandardCharsets; + +import static java.nio.charset.StandardCharsets.*; + +class Test { + void test(byte[] bytes) throws Exception { + int UTF_8 = 1; + String string = new String(bytes, StandardCharsets.UTF_8); + System.out.println(string); + string.getBytes(UTF_16); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/charsetObjectCanBeUsed/beforeStringRemoveQualifier.java b/java/java-tests/testData/inspection/charsetObjectCanBeUsed/beforeStringRemoveQualifier.java new file mode 100644 index 000000000000..a7236aca03c6 --- /dev/null +++ b/java/java-tests/testData/inspection/charsetObjectCanBeUsed/beforeStringRemoveQualifier.java @@ -0,0 +1,10 @@ +// "Replace with 'StandardCharsets.UTF_8'" "true" +import static java.nio.charset.StandardCharsets.*; + +class Test { + void test(byte[] bytes) throws Exception { + String string = new String(bytes, "UTF-8"); + System.out.println(string); + string.getBytes(UTF_8); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/charsetObjectCanBeUsed/beforeStringRemoveQualifierConflict.java b/java/java-tests/testData/inspection/charsetObjectCanBeUsed/beforeStringRemoveQualifierConflict.java new file mode 100644 index 000000000000..b6fc304cb092 --- /dev/null +++ b/java/java-tests/testData/inspection/charsetObjectCanBeUsed/beforeStringRemoveQualifierConflict.java @@ -0,0 +1,11 @@ +// "Replace with 'StandardCharsets.UTF_8'" "true" +import static java.nio.charset.StandardCharsets.*; + +class Test { + void test(byte[] bytes) throws Exception { + int UTF_8 = 1; + String string = new String(bytes, "UTF-8"); + System.out.println(string); + string.getBytes(UTF_16); + } +} \ No newline at end of file