在我们的链接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
}
}
}
上面列出的静态代码分析工具中是否有一些预定义规则强制使用此代码样式?如果不是 - 我知道有能力在所有这些工具中编写自定义规则,您建议实施这样的规则(不熟悉在其中任何一个中编写自定义规则)?
答案 0 :(得分:4)
可以使用CheckStyle完成,但您必须code a custom check。
使用自定义检查可以完全忽略评论。可以通过调用DetailAST上的getLineNo()
来确定令牌所在的行号。这是AST的样子,包含行号信息(红色圆圈):
自定义支票的代码可能很短。您基本上注册了LITERAL_ELSE
令牌,看看LITERAL_IF
是否是他们唯一的孩子。还要记得处理SLIST
。在这些情况下,LITERAL_IF
和RCURLY
应该是唯一的孩子。两种情况都在上图中说明。
为了记录,我原本以为还可以使用else[ \t{]*[\r\n]+[ \t{]*if\b
为format
属性(基于regex match)配置this post。
以下是铁路图中提到的正则表达式:
结果证明这是不可行的,因为当else
和if
之间存在评论时,它会产生漏报。更糟糕的是,当嵌套的if
后跟不相关的代码(如else { if() {...} <block of code>}
)时,它也会产生误报。感谢@Anatoliy指出这一点!由于注释和匹配的注释与注释混合无法可靠地掌握通过正则表达式,这些问题已经过时了RegExp方法。
答案 1 :(得分:2)
This post说你不能在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表达式来编写规则。