簡體   English   中英

是否有任何Checkstyle / PMD / Findbugs規則強制“else if”在同一條線上?

[英]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_IFRCURLY應該是唯一的孩子。 兩種情況都在上圖中說明。


使用RegExp檢查的替代方案

為了記錄,我原本以為還可以使用else[ \\t{]*[\\r\\n]+[ \\t{]*if\\b配置正則表達式匹配, else[ \\t{]*[\\r\\n]+[ \\t{]*if\\bformat屬性(基於此帖子 )。

這是所提到的正則表達式作為鐵路圖: 正則表達式可視化

事實證明這是不可行的,因為當elseif之間存在注釋時,它會產生錯誤否定。 更糟糕的是,當嵌套的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM