Подтвердить что ты не робот

Разрешить простой оператор if без необходимости иметь никаких скобок в codestyle

Я использую checkstyle, чтобы проверить, соответствует ли мой код Java рекомендациям нашего проекта.

Однако у нас есть одно руководство, которое я не могу понять, как проверить этот инструмент. Мы хотим разрешить простой, если (понимаем, если в нем нет ни одной другой условной структуры), чтобы не иметь скобки, как в этом примере:

// valid
if(condition) callFunction();

// invalid
if(condition) for(int i = 0; i < someValue; i++) callFunction(i);

// valid
if(condition) {
    for(int i = 0; i < someValue; i++) {
        callFunction(i);
    }
}

// invalid
if(condition) callFunction();
else callOtherFunction();

Это соглашение можно обсудить, но это тот, который мы выбрали. Он позволяет уменьшить, если синтаксис для очень тривиальных случаев, но гарантирует, что у нас есть хороший отступ и разделение блоков для более сложных структур.

Любая помощь с этим будет действительно оценена.

Я также готов сделать некоторый код для выполнения этой проверки, если ничего не доступно, но на самом деле не знаю, с чего начать. В последнем выступлении некоторые советы об этом также будут оценены.

4b9b3361

Ответ 1

В конце концов, я выполнил специальную проверку для checkstyle. Вот исходный код, если кто-то заинтересован в нем:

import com.puppycrawl.tools.checkstyle.api.Check;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.TokenTypes;

public class IfBracesCheck extends Check {

    @Override
    public int[] getDefaultTokens() {
        return new int[] {
            TokenTypes.LITERAL_ELSE,
            TokenTypes.LITERAL_IF,
        };
    }

    @Override
    public void visitToken(DetailAST aAST) {
        final DetailAST slistAST = aAST.findFirstToken(TokenTypes.SLIST);

        if(aAST.getType() == TokenTypes.LITERAL_ELSE) {
            // If we have an else, it must have braces, except it is an "else if" (then the if must have braces).
            DetailAST ifToken = aAST.findFirstToken(TokenTypes.LITERAL_IF);

            if(ifToken == null) {
                // This is an simple else, it must have brace.
                if(slistAST == null) {
                    log(aAST.getLineNo(), "ifBracesElse", aAST.getText());
                }
            } else {
                // This is an "else if", the if must have braces.
                if(ifToken.findFirstToken(TokenTypes.SLIST) == null) {
                    log(aAST.getLineNo(), "ifBracesConditional", ifToken.getText(), aAST.getText() + " " + ifToken.getText());
                }
            }
        } else if(aAST.getType() == TokenTypes.LITERAL_IF) {
            // If the if uses braces, nothing as to be checked.
            if (slistAST != null) {
                return;
            }

            // We have an if, we need to check if it has no conditionnal structure as direct child.
            final int[] conditionals = {
                TokenTypes.LITERAL_DO,
                TokenTypes.LITERAL_ELSE,
                TokenTypes.LITERAL_FOR,
                TokenTypes.LITERAL_IF,
                TokenTypes.LITERAL_WHILE,
                TokenTypes.LITERAL_SWITCH,
            };

            for(int conditional : conditionals) {
                DetailAST conditionalAST = aAST.findFirstToken(conditional);

                if (conditionalAST != null) {
                    log(aAST.getLineNo(), "ifBracesConditional", aAST.getText(), conditionalAST.getText());

                    // Let trigger this only once.
                    return;
                }
            }
        }
    }
}

Ответ 2

Просто хочу добавить, что теперь checkstyle поддерживает свойство allowSingleLineIf, которое охватывает некоторые случаи.

    <module name="NeedBraces">
        <property name="allowSingleLineIf" value="true"/>
    </module>

Ответ 3

Хотя я согласен с комментариями, что это плохая идея, вы, возможно, не сможете изменить рекомендации. Поэтому вы можете попробовать следующее:

  • В модуле checkstyle Blocks → Need braces, отключите ключевое слово if
  • Создайте новый экземпляр модуля Regexp → RegexpSingleLineJava и попытайтесь найти регулярное выражение, соответствующее вашим недействительным случаям, но не действительным.

(Имена модулей из Eclipse Checkstyle Plugin 5.3.0)

Ответ 4

CheckStyle 6.14 NeedBracesCheck поддержка ролей позволяет использовать параметр SingleLineStatement

allowSingleLineStatement, который позволяет однострочные операторы без фигурных скобок, например:

if (obj.isValid()) возвращает true,

while (obj.isValid()) возвращает true;

сделать this.notify(); while (o!= null);

for (int я = 0;;) this.notify();

документация