From b5bda1d28f9707d4d888477423fe5622ade2283b Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 27 May 2022 16:05:52 +0200 Subject: [PATCH] [java-inspections] IDEA-294920 "Standard charset can be used" breaks code when UEE is thrown from resource list GitOrigin-RevId: 5959d27181c8a5b7e7f87b3da8001b8ba397a0b5 --- .../CharsetObjectCanBeUsedInspection.java | 17 ++++++++--------- .../afterUEEInResource.java | 15 +++++++++++++++ .../beforeUEEInResource.java | 16 ++++++++++++++++ 3 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/inspection/charsetObjectCanBeUsed/afterUEEInResource.java create mode 100644 java/java-tests/testData/inspection/charsetObjectCanBeUsed/beforeUEEInResource.java diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/CharsetObjectCanBeUsedInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/CharsetObjectCanBeUsedInspection.java index 8afd08fbf155..5793527e4d97 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/CharsetObjectCanBeUsedInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/CharsetObjectCanBeUsedInspection.java @@ -25,10 +25,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.function.Function; +import java.util.Set; import static com.intellij.psi.CommonClassNames.*; import static java.util.Map.entry; @@ -298,19 +297,19 @@ public class CharsetObjectCanBeUsedInspection extends AbstractBaseJavaLocalInspe PsiTreeUtil.getParentOfType(anchor, PsiTryStatement.class, true, PsiMember.class, PsiLambdaExpression.class); if (tryStatement == null) break; PsiCodeBlock tryBlock = tryStatement.getTryBlock(); - if (PsiTreeUtil.isAncestor(tryBlock, anchor, true)) { + boolean inTry = PsiTreeUtil.isAncestor(tryBlock, anchor, true); + PsiResourceList resourceList = tryStatement.getResourceList(); + boolean inResource = PsiTreeUtil.isAncestor(resourceList, anchor, true); + if (inTry || inResource) { for (PsiParameter parameter : tryStatement.getCatchBlockParameters()) { List typeElements = PsiUtil.getParameterTypeElements(parameter); for (PsiTypeElement element : typeElements) { PsiType type = element.getType(); if (type.equalsToText("java.io.UnsupportedEncodingException") || type.equalsToText("java.io.IOException")) { - Collection unhandledExceptions = ExceptionUtil.collectUnhandledExceptions(tryBlock, tryBlock); - PsiResourceList resourceList = tryStatement.getResourceList(); - if (resourceList != null) { - Collection resourceExceptions = ExceptionUtil.collectUnhandledExceptions(resourceList, resourceList); - unhandledExceptions = StreamEx.of(unhandledExceptions, resourceExceptions).toFlatList(Function.identity()); - } + Set unhandledExceptions = StreamEx.of(tryBlock, resourceList).nonNull() + .flatCollection(block -> ExceptionUtil.collectUnhandledExceptions(block, block)) + .toSet(); if (!ContainerUtil.exists(unhandledExceptions, ue -> ue.isAssignableFrom(type) || type.isAssignableFrom(ue))) { if (parameter.getType() instanceof PsiDisjunctionType) { DeleteMultiCatchFix.deleteCaughtExceptionType(element); diff --git a/java/java-tests/testData/inspection/charsetObjectCanBeUsed/afterUEEInResource.java b/java/java-tests/testData/inspection/charsetObjectCanBeUsed/afterUEEInResource.java new file mode 100644 index 000000000000..948c0b9b9a21 --- /dev/null +++ b/java/java-tests/testData/inspection/charsetObjectCanBeUsed/afterUEEInResource.java @@ -0,0 +1,15 @@ +// "Replace with 'StandardCharsets.UTF_8'" "true" +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; +import java.util.stream.Stream; + +public class Demo { + private static void test(InputStream is) { + try (Stream stream = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)).lines()) { + stream.forEach(System.out::println); + } + } +} diff --git a/java/java-tests/testData/inspection/charsetObjectCanBeUsed/beforeUEEInResource.java b/java/java-tests/testData/inspection/charsetObjectCanBeUsed/beforeUEEInResource.java new file mode 100644 index 000000000000..a38e37b1025e --- /dev/null +++ b/java/java-tests/testData/inspection/charsetObjectCanBeUsed/beforeUEEInResource.java @@ -0,0 +1,16 @@ +// "Replace with 'StandardCharsets.UTF_8'" "true" +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.util.stream.Stream; + +public class Demo { + private static void test(InputStream is) { + try (Stream stream = new BufferedReader(new InputStreamReader(is, "UTF-8")).lines()) { + stream.forEach(System.out::println); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } +}