From 7d30d532c6b3dcea0ead641665282332a4a15840 Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Tue, 18 Jul 2017 13:20:30 +0300 Subject: [PATCH] Java: Don't report the catch section as unreachable where a subclass of declared exception can be thrown (IDEA-175863) --- .../daemon/impl/analysis/HighlightUtil.java | 3 ++- .../CatchSubclassOfThrownException.java | 23 +++++++++++++++++++ .../daemon/LightAdvHighlightingJdk7Test.java | 1 + 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/CatchSubclassOfThrownException.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 336077d79125..7cfe2cb889d4 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -1387,7 +1387,8 @@ public class HighlightUtil extends HighlightUtilBase { if (ExceptionUtil.isGeneralExceptionType(catchType)) continue; // collect exceptions which are caught by this type - Collection caught = ContainerUtil.findAll(thrownTypes, catchType::isAssignableFrom); + final Collection caught = + ContainerUtil.findAll(thrownTypes, type -> catchType.isAssignableFrom(type) || type.isAssignableFrom(catchType)); if (caught.isEmpty()) continue; final Collection caughtCopy = ContainerUtil.newHashSet(caught); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/CatchSubclassOfThrownException.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/CatchSubclassOfThrownException.java new file mode 100644 index 000000000000..76775d6508b2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/CatchSubclassOfThrownException.java @@ -0,0 +1,23 @@ +class C { + void foo(boolean b) throws Exception { + try { + if (b) { + throw new ChildException(); + } else { + method(); + } + } catch (ChildException e) { + System.out.println("child"); + } catch (ParentException e) { + System.out.println("parent"); + } + } + + private static void method() throws Exception { + throw new ParentException(); + } + + static class ParentException extends Exception { } + + static class ChildException extends ParentException { } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk7Test.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk7Test.java index 39a11cde6e6c..3aa128dd35d9 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk7Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk7Test.java @@ -186,6 +186,7 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase { public void testIDEA138978() { doTest(false, false); } public void testIntersectionTypeCast() { doTest(false, false); } public void testUsedMethodCalledViaReflectionInTheSameFile() { doTest(true, false); } + public void testCatchSubclassOfThrownException() { doTest(true, false); } public void testArrayInitializerTypeCheckVariableType() { doTest(false, false);}