From 6d7d152e4830feb9f606e63d8f424b6730159a5e Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 13 Oct 2020 16:41:49 +0200 Subject: [PATCH] IG: recognize commented out else branch after if statement GitOrigin-RevId: bd9aba9697230eebfac151a279b8988897f1bd50 --- .../maturity/CommentedOutCodeInspection.java | 18 ++++++++++++++---- .../CommentedOutCode.after.java | 13 +++++++++++++ .../commented_out_code/CommentedOutCode.java | 17 +++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/CommentedOutCodeInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/CommentedOutCodeInspection.java index d9bedcce539c..538caa866afe 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/CommentedOutCodeInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/CommentedOutCodeInspection.java @@ -4,6 +4,7 @@ package com.siyeh.ig.maturity; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ui.SingleIntegerFieldOptionsPanel; import com.intellij.codeInspection.util.InspectionMessage; +import com.intellij.core.JavaPsiBundle; import com.intellij.ide.highlighter.JavaFileType; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; @@ -190,6 +191,9 @@ public class CommentedOutCodeInspection extends BaseInspection { parent = method.getParent(); } } + else if (parent instanceof PsiField) { + parent = parent.getParent(); + } else if (parent instanceof PsiClass) { final PsiClass aClass = (PsiClass)parent; if (!ClassUtils.isInsideClassBody(context, aClass)) { @@ -205,7 +209,8 @@ public class CommentedOutCodeInspection extends BaseInspection { else { fragment = factory.createCodeBlockCodeFragment(text, context, false); } - return !isInvalidCode(fragment); + final boolean allowDanglingElse = PsiTreeUtil.getPrevSiblingOfType(context, PsiStatement.class) instanceof PsiIfStatement; + return !isInvalidCode(fragment, allowDanglingElse); } static String getCommentText(PsiComment comment) { @@ -232,7 +237,7 @@ public class CommentedOutCodeInspection extends BaseInspection { return (comment.getTokenType() == JavaTokenType.END_OF_LINE_COMMENT) ? StringUtil.trimStart(comment.getText(), "//") : null; } - static boolean isInvalidCode(PsiElement element) { + static boolean isInvalidCode(PsiElement element, boolean allowDanglingElse) { final PsiElement firstChild = element.getFirstChild(); final PsiElement lastChild = element.getLastChild(); final boolean strict = firstChild == lastChild && firstChild instanceof PsiExpressionStatement; @@ -245,18 +250,20 @@ public class CommentedOutCodeInspection extends BaseInspection { return true; } } - final CodeVisitor visitor = new CodeVisitor(strict); + final CodeVisitor visitor = new CodeVisitor(strict, allowDanglingElse); element.accept(visitor); return visitor.isInvalidCode(); } private static class CodeVisitor extends JavaRecursiveElementWalkingVisitor { private final boolean myStrict; + private final boolean myAllowDanglingElse; private boolean invalidCode = false; private boolean codeFound = false; - private CodeVisitor(boolean strict) { + private CodeVisitor(boolean strict, boolean allowDanglingElse) { myStrict = strict; + myAllowDanglingElse = allowDanglingElse; } @Override @@ -275,6 +282,9 @@ public class CommentedOutCodeInspection extends BaseInspection { @Override public void visitErrorElement(@NotNull PsiErrorElement element) { + if (myAllowDanglingElse && !codeFound && JavaPsiBundle.message("else.without.if").equals(element.getErrorDescription())) { + return; + } invalidCode = true; stopWalking(); } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/maturity/commented_out_code/CommentedOutCode.after.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/maturity/commented_out_code/CommentedOutCode.after.java index aa299cedeb2a..898d0c1577b3 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/maturity/commented_out_code/CommentedOutCode.after.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/maturity/commented_out_code/CommentedOutCode.after.java @@ -8,6 +8,19 @@ class CommentedOutCode /* extends Object */ { //// VARIABLE STATE \\\\ private String s; + private String field; + + + private static int danglingElse(int i) { + if (i == 3) { + System.out.println(i); + } + return i; + //else if (i == 4) { + // System.exit(-1); + //} + } + int x(int i) { new Object() { diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/maturity/commented_out_code/CommentedOutCode.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/maturity/commented_out_code/CommentedOutCode.java index 58d68a98a531..935cc391b411 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/maturity/commented_out_code/CommentedOutCode.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/maturity/commented_out_code/CommentedOutCode.java @@ -9,6 +9,23 @@ class CommentedOutCode /* extends Object */ { //// VARIABLE STATE \\\\ private String s; + // void x() {} + private String field; + + + private static int danglingElse(int i) { + if (i == 3) { + System.out.println(i); + } + //else if (i == 4) { + // System.exit(-1); + //} + return i; + //else if (i == 4) { + // System.exit(-1); + //} + } + int x(int i) { new Object() {