From 403d526645e5a52fc206db1cab865e2851ac749f Mon Sep 17 00:00:00 2001 From: Roman Ivanov Date: Tue, 26 Dec 2017 11:26:07 +0700 Subject: [PATCH] AutoCloseableResourceInspection: ignore immediately closed : IDEA-171866 --- .../resources/AutoCloseableResourceInspectionBase.java | 5 +++++ .../resources/AutoCloseableResourceInspectionTest.java | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/resources/AutoCloseableResourceInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/resources/AutoCloseableResourceInspectionBase.java index 92296cc495f8..98130431f953 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/resources/AutoCloseableResourceInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/resources/AutoCloseableResourceInspectionBase.java @@ -27,6 +27,8 @@ import com.intellij.psi.util.PsiUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; +import com.siyeh.ig.callMatcher.CallMatcher; +import com.siyeh.ig.psiutils.ExpressionUtils; import com.siyeh.ig.psiutils.MethodMatcher; import com.siyeh.ig.psiutils.TypeUtils; import one.util.streamex.StreamEx; @@ -44,6 +46,8 @@ import java.util.List; */ public class AutoCloseableResourceInspectionBase extends ResourceInspection { + private static final CallMatcher CLOSE = CallMatcher.instanceCall(CommonClassNames.JAVA_LANG_AUTO_CLOSEABLE, "close"); + private static final List DEFAULT_IGNORED_TYPES = Arrays.asList("java.util.stream.Stream", "java.util.stream.IntStream", "java.util.stream.LongStream", "java.util.stream.DoubleStream"); @SuppressWarnings("PublicField") @@ -198,6 +202,7 @@ public class AutoCloseableResourceInspectionBase extends ResourceInspection { if (!isResourceCreation(expression)) { return false; } + if (CLOSE.test(ExpressionUtils.getCallForQualifier(expression))) return false; final PsiVariable variable = ResourceInspection.getVariable(expression); if(variable instanceof PsiResourceVariable || isResourceEscapingFromMethod(variable, expression)) return false; if (variable == null) return true; diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/resources/AutoCloseableResourceInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/resources/AutoCloseableResourceInspectionTest.java index 1c19993c5797..618e10092a98 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/resources/AutoCloseableResourceInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/resources/AutoCloseableResourceInspectionTest.java @@ -163,6 +163,16 @@ public class AutoCloseableResourceInspectionTest extends LightInspectionTestCase "}"); } + public void testClosedResource() { + doTest("import java.io.*;\n" + + "\n" + + "class X {\n" + + " private static void example(int a) throws IOException {\n" + + " new FileOutputStream(\"\").close();\n" + + " }\n" + + "}"); + } + @Override protected LocalInspectionTool getInspection() { return new AutoCloseableResourceInspection();