Существует ли правило CheckStyle, которое заставляет ключевые слова if находиться в одной строке в лестнице if / else? - PullRequest
2 голосов
/ 22 декабря 2008

Исходя из этого вопроса представляется, что шаблон по умолчанию для CheckStyle позволит, если еще лестницам разделить if и else с разрывом строки.

То есть я бы хотел, чтобы этот код был помечен как нарушение:

if (true)
{
    System.out.println("20");   
}
else
    if (true)
    {
        System.out.println("30");
    }

Существует ли правило CheckStyle, чтобы предотвратить это? Просматривая документы, я не вижу ни одного, и я бы предпочел не использовать общее правило регулярных выражений, если мне это не нужно.

Кроме того, если я использую модуль GenericIllegalRegexp , многострочное регулярное выражение не работает. Есть ли какое-нибудь средство от этого?

1 Ответ

2 голосов
/ 23 декабря 2008

Я не уверен, что вы легко можете написать расширение Checkstyle, поскольку AST-код просмотра Checkstyle SDK Gui не делает различий между:

else if

и

else
  if

В каждом случае else - это LITERAL_ELSE с if ...

Таким образом, обобщенное регулярное выражение else[ \t]*[\r\n]+[ \t]*if действительно является быстрым способом обнаружения такого рода кода.


Исправьте регулярное выражение, чтобы включить случаи:

  • нет пробела без табуляции до / после новой строки
  • - это несколько новых строк.

Конечно, вы не хотите использовать выражение регулярного выражения \s, так как оно включает в себя символы новой строки. Проще отделить пробелы от возвращаемых символов.


Примечание: в Checkstyle 5.0beta не используйте «Generic Illegal Regexp», а вместо этого модуль « Regexp» :
вы можете настроить этот модуль RegExp как «invalidPattern» (со связанной серьезностью «Warning»), и вам не нужно использовать какой-либо тип флага «multi-line»: достаточно регулярного выражения.

Regexp
Описание

Проверка, которая удостоверяется, что указанный шаблон существует, существует меньше установленного числа раз или не существует в файле.

Эта проверка объединяет все функции, предоставляемые RegexpHeader, GenericIllegalRegexp и RequiredRegexp, за исключением предоставления регулярного выражения из файла.

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


Томас упоминает в комментариях :

Контрольный стиль AST содержит информацию о номере строки.

См. " Есть ли какое-либо правило Checkstyle / PMD / Findbugs, чтобы заставить" else if "находиться в одной строке? "
(в котором нужно использовать пользовательскую проверку , а не совпадение с регулярным выражением ).

...