IDEA-223821 Catch block may ignore exception inspection does not check for existence of local variable with ignored name

GitOrigin-RevId: 719b50764c9988a499497d6f2d597b1e45c41e4a
This commit is contained in:
Tagir Valeev
2019-10-02 05:31:15 +00:00
committed by intellij-monorepo-bot
parent e4d785b33b
commit b178153d32
2 changed files with 26 additions and 6 deletions
@@ -1595,7 +1595,7 @@ loop.with.implicit.termination.condition.display.name=Loop with implicit termina
loop.with.implicit.termination.condition.dowhile.problem.descriptor=<code>#ref-while</code> loop with implicit termination condition #loc
loop.with.implicit.termination.condition.problem.descriptor=<code>#ref</code> loop with implicit termination condition #loc
loop.with.implicit.termination.condition.quickfix=Make condition explicit
rename.catch.parameter.to.ignored=Rename 'catch' parameter to 'ignored'
rename.catch.parameter.to.ignored=Rename ''catch'' parameter to ''{0}''
unnecessary.super.qualifier.display.name=Unnecessary 'super' qualifier
unnecessary.super.qualifier.problem.descriptor=Qualifier <code>#ref</code> is unnecessary in this context #loc
unnecessary.super.qualifier.quickfix=Remove unnecessary 'super' qualifier
@@ -15,6 +15,7 @@ import com.intellij.codeInspection.dataFlow.value.DfaVariableValue;
import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.VariableKind;
import com.intellij.psi.impl.light.LightParameter;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
@@ -24,7 +25,9 @@ import com.siyeh.ig.fixes.SuppressForTestsScopeFix;
import com.siyeh.ig.psiutils.ControlFlowUtils;
import com.siyeh.ig.psiutils.TestUtils;
import com.siyeh.ig.psiutils.VariableAccessUtils;
import com.siyeh.ig.psiutils.VariableNameGenerator;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -56,7 +59,7 @@ public class CatchMayIgnoreExceptionInspection extends AbstractBaseJavaLocalInsp
public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
return new JavaElementVisitor() {
@Override
public void visitTryStatement(@NotNull PsiTryStatement statement) {
public void visitTryStatement(PsiTryStatement statement) {
super.visitTryStatement(statement);
final PsiCatchSection[] catchSections = statement.getCatchSections();
for (final PsiCatchSection section : catchSections) {
@@ -88,13 +91,13 @@ public class CatchMayIgnoreExceptionInspection extends AbstractBaseJavaLocalInsp
SuppressForTestsScopeFix fix = SuppressForTestsScopeFix.build(CatchMayIgnoreExceptionInspection.this, section);
if (ControlFlowUtils.isEmpty(block, m_ignoreCatchBlocksWithComments, true)) {
holder.registerProblem(catchToken, InspectionGadgetsBundle.message("inspection.catch.ignores.exception.empty.message"),
new EmptyCatchBlockFix(), fix);
new EmptyCatchBlockFix(generateName(block)), fix);
}
else if (!VariableAccessUtils.variableIsUsed(parameter, section)) {
if (!m_ignoreNonEmptyCatchBlock &&
(!m_ignoreCatchBlocksWithComments || PsiTreeUtil.getChildOfType(block, PsiComment.class) == null)) {
holder.registerProblem(identifier, InspectionGadgetsBundle.message("inspection.catch.ignores.exception.unused.message"),
new RenameFix("ignored", false, false), fix);
new RenameFix(generateName(block), false, false), fix);
}
}
else if (mayIgnoreVMException(parameter, block)) {
@@ -142,6 +145,11 @@ public class CatchMayIgnoreExceptionInspection extends AbstractBaseJavaLocalInsp
};
}
@NotNull
private static String generateName(PsiCodeBlock block) {
return new VariableNameGenerator(block, VariableKind.LOCAL_VARIABLE).byName(IGNORED_PARAMETER_NAME).generate(true);
}
static class IgnoredExceptionVisitor extends SideEffectVisitor {
private final @NotNull PsiParameter myParameter;
private final @NotNull PsiCodeBlock myBlock;
@@ -183,11 +191,23 @@ public class CatchMayIgnoreExceptionInspection extends AbstractBaseJavaLocalInsp
}
private static class EmptyCatchBlockFix implements LocalQuickFix {
private final String myName;
private EmptyCatchBlockFix(String name) {
myName = name;
}
@Nls(capitalization = Nls.Capitalization.Sentence)
@NotNull
@Override
public String getName() {
return InspectionGadgetsBundle.message("rename.catch.parameter.to.ignored", myName);
}
@Override
@NotNull
public String getFamilyName() {
return InspectionGadgetsBundle.message("rename.catch.parameter.to.ignored");
return InspectionGadgetsBundle.message("rename.catch.parameter.to.ignored", IGNORED_PARAMETER_NAME);
}
@Override
@@ -201,7 +221,7 @@ public class CatchMayIgnoreExceptionInspection extends AbstractBaseJavaLocalInsp
final PsiIdentifier identifier = parameter.getNameIdentifier();
if (identifier == null) return;
final PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory();
final PsiIdentifier newIdentifier = factory.createIdentifier(IGNORED_PARAMETER_NAME);
final PsiIdentifier newIdentifier = factory.createIdentifier(myName);
identifier.replace(newIdentifier);
}
}