diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/resources/ResourceInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/resources/ResourceInspection.java index 18a67c4b9af3..b19549c04f7e 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/resources/ResourceInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/resources/ResourceInspection.java @@ -138,6 +138,9 @@ public abstract class ResourceInspection extends BaseInspection { } } } + while (isInsignificant(nextStatement)) { + nextStatement = PsiTreeUtil.getNextSiblingOfType(nextStatement, PsiStatement.class); + } while (nextStatement == null) { statement = PsiTreeUtil.getParentOfType(statement, PsiStatement.class, true); if (statement == null) { @@ -160,6 +163,27 @@ public abstract class ResourceInspection extends BaseInspection { return isResourceClose(nextStatement, variable); } + private static boolean isInsignificant(PsiStatement statement) { + if (statement == null) { + return false; + } + final boolean[] result = {true}; + statement.accept(new JavaRecursiveElementWalkingVisitor() { + @Override + public void visitExpression(PsiExpression expression) { + super.visitExpression(expression); + result[0] = false; + } + + @Override + public void visitElement(PsiElement element) { + super.visitElement(element); + if (!result[0]) stopWalking(); + } + }); + return result[0]; + } + protected static boolean isResourceClosedInFinally(@NotNull PsiTryStatement tryStatement, @NotNull PsiVariable variable) { final PsiCodeBlock finallyBlock = tryStatement.getFinallyBlock(); if (finallyBlock == null) { diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/resources/ioresource/IOResource.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/resources/ioresource/IOResource.java index 2bc024b6fdf6..5326fc063284 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/resources/ioresource/IOResource.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/resources/ioresource/IOResource.java @@ -178,4 +178,16 @@ public class IOResource { InputStream in = new FileInputStream(""); escaper(in); } + + void insignificant() throws IOException { + InputStream in = new FileInputStream("file"); + Object o; + {;;}; + try { + o = in.read(); + } + finally { + in.close(); + } + } }