From 3ab008193aa150da0d4a03c5d860031914d31335 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 5 Feb 2020 13:58:07 +0700 Subject: [PATCH] ControlFlowAnalyzer: pass the control from expression statements to multi-catch exceptions Fixes IDEA-232103 "Field may be 'final'" false positive for fields initialized in try-catch block with multi-catch GitOrigin-RevId: b286eb0ac347350490d3aaa35768fc4e0404db28 --- .../psi/controlFlow/ControlFlowAnalyzer.java | 8 ++++++-- .../advHighlighting7/MultiCatch.java | 17 +++++++++++++++++ .../style/field_final/FieldMayBeFinal.java | 17 +++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java index b7df025fe7fe..ab2778fe701d 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java @@ -609,8 +609,12 @@ class ControlFlowAnalyzer extends JavaElementVisitor { for (PsiParameter catchParameter : myCatchParameters) { ProgressManager.checkCanceled(); PsiType type = catchParameter.getType(); - if (type instanceof PsiClassType) { - generateThrow((PsiClassType)type, statement); + List types = + type instanceof PsiDisjunctionType ? ((PsiDisjunctionType)type).getDisjunctions() : Collections.singletonList(type); + for (PsiType subType : types) { + if (subType instanceof PsiClassType) { + generateThrow((PsiClassType)subType, statement); + } } } finishElement(statement); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java index 315b276ae4d7..355613de2400 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java @@ -85,4 +85,21 @@ class D { System.out.println(e); } } +} +class AssignFinal { + private final String value; + + public AssignFinal() { + try { + value = create(); + } catch (ClassNotFoundException | IllegalAccessException e) { + value = ""; + } + } + + public String getValue() { + return value; + } + + public static native T create() throws ClassNotFoundException, IllegalAccessException; } \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/field_final/FieldMayBeFinal.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/field_final/FieldMayBeFinal.java index 1f6e1935dc72..f00ccb04be96 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/field_final/FieldMayBeFinal.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/field_final/FieldMayBeFinal.java @@ -1133,4 +1133,21 @@ class Implicit { public void update(String newValue) { triggeringPolicyUpdater.set(this, newValue); } +} +class TryCatchFinal { + private String value; + + public TryCatchFinal() { + try { + value = create(); + } catch (ClassNotFoundException | IllegalAccessException e) { + value = ""; + } + } + + public String getValue() { + return value; + } + + public static native T create() throws ClassNotFoundException, IllegalAccessException; } \ No newline at end of file