precise rethrow: runtime exception special case for generic declared type only (IDEA-180035)

This commit is contained in:
Anna.Kozlova
2017-10-10 18:17:29 +02:00
parent 6866131d04
commit 79b362e643
3 changed files with 26 additions and 1 deletions
@@ -128,7 +128,12 @@ public class PsiCatchSectionImpl extends CompositePsiElement implements PsiCatch
// ... and T is assignable to Ej ...
List<PsiType> types = new ArrayList<>();
for (PsiType type : uncaughtTypes) {
if (declaredType.isAssignableFrom(type) || type instanceof PsiClassType && ExceptionUtil.isUncheckedException((PsiClassType)type)) {
if (declaredType.isAssignableFrom(type) ||
// from 11.2.3 exception checking
// It is a compile-time error if a catch clause can catch checked exception class E1 and it is not the case that the try block corresponding to the catch clause can
// throw a checked exception class that is a subclass or superclass of E1, unless E1 is Exception or a superclass of Exception.
// so here unchecked exception can sneak throw Exception or Throwable catch type only
ExceptionUtil.isGeneralExceptionType(declaredType) && type instanceof PsiClassType && ExceptionUtil.isUncheckedException((PsiClassType)type)) {
types.add(type);
}
}
@@ -0,0 +1,19 @@
import java.io.FileNotFoundException;
import java.io.IOException;
class MyTest {
public void foo() {
try {
bar();
}
catch (FileNotFoundException e) {
<error descr="Unhandled exception: java.io.FileNotFoundException">throw e;</error>
}
catch (IOException ignored) { }
}
private void bar() throws IOException, RuntimeException { }
}
@@ -143,6 +143,7 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase {
public void testPreciseRethrow() { doTest(false, false); }
public void testPreciseRethrowNonAssignableToException() { doTest(false, false); }
public void testPreciseRethrowOfOneExceptionInTheBlock() { doTest(false, false); }
public void testPreciseRethrowWithRuntimeExceptionDeclared() { doTest(false, false); }
public void testImprovedCatchAnalysis() { doTest(true, false); }
public void testPolymorphicTypeCast() { doTest(true, false); }
public void testTypeCastInInstanceof() { doTest(true, false); }