[英]Is there any Checkstyle/PMD/Findbugs rule to force “else if” to be on the same line?
在我们的链接if / else /项目中,如果我们想要进行以下格式化:
if (flag1) {
// Do something 1
} else if (flag2) {
// Do something 2
} else if (flag3) {
// Do something 3
}
并禁止以下一个:
if (flag1) {
// Do something 1
} else {
if (flag2) {
// Do something 2
} else {
if (flag3) {
// Do something 3
}
}
}
上面列出的静态代码分析工具中是否有一些预定义规则来强制执行此代码样式? 如果不是 - 我知道有能力在所有这些工具中编写自定义规则,您建议实施这样的规则(不熟悉在其中任何一个中编写自定义规则)?
它可以使用CheckStyle完成,但您必须编写自定义检查代码 。
使用自定义检查可以完全忽略注释。 可以通过在DetailAST上调用getLineNo()
来确定令牌所在的行号。 以下是AST的样子,包含行号信息(红色圆圈):
自定义检查的代码可能很短。 您基本上注册了LITERAL_ELSE
标记,看看LITERAL_IF
是否是他们唯一的孩子。 还要记得处理SLIST
。 在这些情况下, LITERAL_IF
和RCURLY
应该是唯一的孩子。 两种情况都在上图中说明。
为了记录,我原本以为还可以使用else[ \\t{]*[\\r\\n]+[ \\t{]*if\\b
配置正则表达式匹配, else[ \\t{]*[\\r\\n]+[ \\t{]*if\\b
为format
属性(基于此帖子 )。
这是所提到的正则表达式作为铁路图:
事实证明这是不可行的,因为当else
和if
之间存在注释时,它会产生错误否定。 更糟糕的是,当嵌套的if
后面跟着不相关的代码时,它也会产生误报(就像else { if() {...} <block of code>}
。感谢@Anatoliy指出这一点!因为评论和匹配的括号是混合评论不能被正则表达式可靠地掌握,这些问题已经过时了RegExp方法。
这篇文章说你不能在Checkstyle中做到这一点。
在PMD你绝对可以。 AST(抽象语法树)是不同的。
对于你不想要的模式
if (true) {
String a;
} else {
if (true) {
String b;
}
}
树看起来像:
<IfStatement>
<Expression>...</Expression>
<Statement>...</Statement>
<Statement>
<Block>
<BlockStatement>
<IfStatement>...
对于你想要的模式
if (true) {
String a;
} else if (true) {
String b;
}
树看起来像:
<IfStatement>
<Expression>...</Expression>
<Statement>...</Statement>
<Statement>
<IfStatement>...
在PMD 4(我曾经创建这些树)中,您通过编写与您不希望发生的模式匹配的XPath表达式来编写规则。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.