根据this question,CheckStyle的默认模板似乎允许其他梯子将if
和else
与换行符分开。
意思是我希望将此代码标记为违规行为:
if (true)
{
System.out.println("20");
}
else
if (true)
{
System.out.println("30");
}
是否有CheckStyle规则来阻止这种情况?查看文档,我没有看到一个,如果我不需要,我宁愿不使用通用正则表达式规则。
另外,如果我使用 GenericIllegalRegexp 模块,多行正则表达式似乎不起作用。这有什么补救措施吗?
答案 0 :(得分:2)
我不确定您是否可以轻松编写Checkstyle扩展,因为Checkstyle SDK Gui的AST浏览代码之间没有任何区别:
else if
和
else
if
在每种情况下,else
都是LITERAL_ELSE
,其中if
...
因此,通用正则表达式else[ \t]*[\r\n]+[ \t]*if
确实是检测这种代码的快速方法。
修复regexp以包含案例:
当然,您不想使用\s
空白regexp表达式,因为它包含自己的换行符。将空格与返回字符分开会更清楚。
注意:在Checkstyle 5.0beta中,不要使用“Generic Illegal Regexp”,而应使用“Regexp" module :
你可以将RegExp模块配置为'illegalPattern'(关联严重性为'Warning'),并且你不必使用任何类型af'多行'标志:正则表达式就足够了。
<强>正则表达式强>
描述确保指定模式存在的检查,存在的次数少于设定次数,或者文件中不存在。
此检查结合了RegexpHeader,GenericIllegalRegexp和RequiredRegexp提供的所有功能,但从文件中提供正则表达式除外。
它与它们的不同之处在于它适用于多线模式。它的正则表达式可以跨越多行,并且它会立即对整个文件进行检查。其他人在单线模式下工作。它们的单个或多个正则表达式只能跨越一行。他们依次针对文件中的每一行检查每一行。
checkstyle AST确实有行号信息。
请参阅“Is there any Checkstyle/PMD/Findbugs rule to force “else if
” to be on the same line?”
(其中一个必须使用custom check,而不是regex match)。