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

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

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

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

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

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

 VonC23 дек. 2008 г., 21:48
Только что добавлен правильный модуль Checkstyle для использования.

Ответы на вопрос(1)

Решение Вопроса

Я не уверен, что вы можете легко написать расширение 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 как «invalidPattern» (со связанной серьезностью «Warning»), и вам не нужно использовать какой-либо тип флага «multi-line»: достаточно регулярного выражения.

Regexp
Описание

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

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

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

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

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

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

 VonC27 дек. 2013 г., 21:55
@ Томас Хорошо, я отредактировал ответ и упомянул о необходимости специальной проверки.
 barfuin27 дек. 2013 г., 12:11
К вашему сведению, контрольный стиль АСТделает иметь информацию о номере строки. Увидетьаналогичный ответ на другой вопрос здесь.
 VonC23 дек. 2008 г., 21:48
Вы правы: не используйте Generic Illegal Regexp, а скорее "Regexp". Смотрите мой ответ, который я только что закончил
 Justin Standard23 дек. 2008 г., 19:33
Кроме того, я добавлю, что могу изменить регулярное выражение, используемое для однострочного совпадения, и это работает, поэтому я твердо убежден, что есть что-то смешное, связанное с многострочными совпадениями.
 Justin Standard23 дек. 2008 г., 03:30
Обновить. Это, похоже, не работает, так как checkstyle, похоже, игнорирует регулярные выражения, основанные на флаге MULTILINE, даже если вы используете встроенный флаг в своем выражении.
 Justin Standard23 дек. 2008 г., 02:54
Конечно, если вы используете + вместо * в качестве квантификатора, он будет игнорировать плохо сформированный код, у которого нет лишних пробелов в обеих строках.
 VonC23 дек. 2008 г., 14:24
Я подтверждаю, что регулярное выражение правильно определяется в многострочной конфигурации в Checkstyle: для работы не требуется (? M) многострочный флаг
 Justin Standard23 дек. 2008 г., 19:16
Может ли это быть проблемой с версией CheckStyle? (Я на бета-версии 5.0) Использование предоставленного вами регулярного выражения не помечает код в моем примере. (Кстати, я согласен с вашей версией регулярного выражения, если только это сработало. Похоже, что должно, но я не получаю ошибку стиля)
 Justin Standard23 дек. 2008 г., 22:58
Это делает это. Большое спасибо за помощь. Похоже, что вопросы CheckStyle не получают много трафика ...
 VonC27 дек. 2013 г., 12:19
@ Томас приятно знать: я включил ваш комментарий в ответ для большей наглядности.

Ваш ответ на вопрос