From 81887dd8d032f6c16d7703a37cd161e24aba5c5c Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 21 Jul 2020 17:56:07 +0200 Subject: [PATCH] IG: highlight the indent problem of the body of the control statement, not the next statement (IDEA-246303) GitOrigin-RevId: 1ffd2b1bb5fe576d09bdc9c9fe72f9f182c98bbe --- ...IndentAfterControlStatementInspection.java | 74 ++++++++----------- ...SuspiciousIndentAfterControlStatement.java | 6 ++ 2 files changed, 37 insertions(+), 43 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/SuspiciousIndentAfterControlStatementInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/SuspiciousIndentAfterControlStatementInspection.java index 213f5968daa3..f3222f7e6511 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/SuspiciousIndentAfterControlStatementInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/SuspiciousIndentAfterControlStatementInspection.java @@ -33,25 +33,25 @@ public class SuspiciousIndentAfterControlStatementInspection extends BaseInspect @Override public void visitWhileStatement(PsiWhileStatement statement) { super.visitWhileStatement(statement); - checkLoopStatement(statement); + checkWhitespaceSuspiciousness(statement, statement.getBody()); } @Override public void visitDoWhileStatement(PsiDoWhileStatement statement) { super.visitDoWhileStatement(statement); - checkLoopStatement(statement); + checkWhitespaceSuspiciousness(statement, statement.getBody()); } @Override public void visitForeachStatement(PsiForeachStatement statement) { super.visitForeachStatement(statement); - checkLoopStatement(statement); + checkWhitespaceSuspiciousness(statement, statement.getBody()); } @Override public void visitForStatement(PsiForStatement statement) { super.visitForStatement(statement); - checkLoopStatement(statement); + checkWhitespaceSuspiciousness(statement, statement.getBody()); } @Override @@ -61,47 +61,20 @@ public class SuspiciousIndentAfterControlStatementInspection extends BaseInspect if (elseStatement instanceof PsiBlockStatement || elseStatement instanceof PsiIfStatement) { return; } - else if (elseStatement == null) { - final PsiStatement thenStatement = statement.getThenBranch(); - if (thenStatement instanceof PsiBlockStatement || thenStatement == null || !isWhitespaceSuspicious(statement, thenStatement)) { - return; - } - } - else { - if (!isWhitespaceSuspicious(statement, elseStatement)) { - return; - } - } - final PsiStatement nextStatement = PsiTreeUtil.getNextSiblingOfType(statement, PsiStatement.class); - if (nextStatement == null) { - return; - } - registerStatementError(nextStatement); + checkWhitespaceSuspiciousness(statement, (elseStatement == null) ? statement.getThenBranch() : elseStatement); } - private void checkLoopStatement(PsiLoopStatement statement) { - final PsiStatement body = statement.getBody(); + private void checkWhitespaceSuspiciousness(PsiStatement statement, PsiStatement body) { if (body instanceof PsiBlockStatement || body == null) { return; } - if (!isWhitespaceSuspicious(statement, body)) { - return; - } - final PsiStatement nextStatement = PsiTreeUtil.getNextSiblingOfType(statement, PsiStatement.class); - if (nextStatement == null) { - return; - } - registerStatementError(nextStatement); - } - - private boolean isWhitespaceSuspicious(PsiStatement statement, PsiStatement body) { final boolean lineBreakBeforeBody; PsiElement prevSibling = body.getPrevSibling(); if (!(prevSibling instanceof PsiWhiteSpace)) { lineBreakBeforeBody = false; prevSibling = statement.getPrevSibling(); if (!(prevSibling instanceof PsiWhiteSpace)) { - return false; + return; } } else { @@ -111,38 +84,53 @@ public class SuspiciousIndentAfterControlStatementInspection extends BaseInspect lineBreakBeforeBody = false; prevSibling = statement.getPrevSibling(); if (!(prevSibling instanceof PsiWhiteSpace)) { - return false; + return; } } else { lineBreakBeforeBody = true; + final PsiElement sibling = statement.getPrevSibling(); + if (sibling instanceof PsiWhiteSpace) { + final String siblingText = sibling.getText(); + final int index = siblingText.lastIndexOf('\n'); + if (index >= 0) { + final int statementIndent = getIndent(siblingText.substring(index + 1)); + final int bodyIndent = getIndent(text.substring(lineBreakIndex + 1)); + if (statementIndent == bodyIndent) { + registerStatementError(body); + return; + } + } + } } } final PsiStatement nextStatement = PsiTreeUtil.getNextSiblingOfType(statement, PsiStatement.class); if (nextStatement == null) { - return false; + return; } final String text = prevSibling.getText(); final int index = text.lastIndexOf('\n'); if (index < 0) { - return false; + return; } final PsiElement nextSibling = nextStatement.getPrevSibling(); if (!(nextSibling instanceof PsiWhiteSpace)) { - return false; + return; } final String nextText = nextSibling.getText(); final int nextIndex = nextText.lastIndexOf('\n'); if (nextIndex < 0) { - return false; + return; } final int nextIndentValue = getIndent(nextText.substring(nextIndex + 1)); final int indentValue = getIndent(text.substring(index + 1)); if (lineBreakBeforeBody) { - return nextIndentValue == indentValue; + if (nextIndentValue == indentValue) { + registerStatementError(nextStatement); + } } - else { - return nextIndentValue > indentValue; + else if (nextIndentValue > indentValue) { + registerStatementError(nextStatement); } } @@ -152,7 +140,7 @@ public class SuspiciousIndentAfterControlStatementInspection extends BaseInspect final char c = indent.charAt(i); if (c == ' ') result++; else if (c == '\t') result += getTabSize(); - else throw new AssertionError(); + else throw new AssertionError(indent); } return result; } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/suspicious_indent_after_control_statement/SuspiciousIndentAfterControlStatement.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/suspicious_indent_after_control_statement/SuspiciousIndentAfterControlStatement.java index 23eb8c02b225..e431fa4a35f5 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/suspicious_indent_after_control_statement/SuspiciousIndentAfterControlStatement.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/suspicious_indent_after_control_statement/SuspiciousIndentAfterControlStatement.java @@ -85,4 +85,10 @@ public class SuspiciousIndentAfterControlStatement { return ""; } } + + public void x(int i) { + if (i == 3) + \")' statement has suspicious indentation">System.out.println("-->"); + System.out.println(i); + } } \ No newline at end of file