IG: highlight the indent problem of the body of the control statement, not the next statement (IDEA-246303)

GitOrigin-RevId: 1ffd2b1bb5fe576d09bdc9c9fe72f9f182c98bbe
This commit is contained in:
Bas Leijdekkers
2020-07-22 15:01:18 +00:00
committed by intellij-monorepo-bot
parent 17f3a788fd
commit 81887dd8d0
2 changed files with 37 additions and 43 deletions
@@ -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;
}
@@ -85,4 +85,10 @@ public class SuspiciousIndentAfterControlStatement {
return "";
}
}
public void x(int i) {
if (i == 3)
<warning descr="'System.out.println(\"-->\")' statement has suspicious indentation">System.out.println("-->")</warning>;
System.out.println(i);
}
}