Uncrustifyのセッティング (7) コード変形編

さらに続けて
------------
空白以外のコードの変形に関するオプションについて解説します。

これらのオプションは、言語仕様上あってもなくてもよい、どちらにするか迷うようなトークンの追加や削除に関する調整してくれます。例えば、単文での'if'文などでは、'{'や'}'を付けても付けなくても、どちらでもOKですよね。こういう場合に、もしあなたが決してやってほしくない記法があるのであれば、それをやらせないようなルールにしてしまうことも可能です。

僕のプロジェクトでは、基本的に「ぶら下がり構文」は禁止です。複数文からなる関数マクロなどによって、インセキュアになるからです。関数マクロを書く人も、'do'/'while(0)'で囲えという基本ルールもありますが。こういう場合には、'if'文には必ず'{'を入れてもらいましょう。

コード変形オプション一覧
------------------------
ここで解説もしてませんが、mod_sort_xxxは使わない方がいいと思います。なので、解説もしてません。

| 項目                                     | 説明                                                                                                                                                                                                 |
|:-----------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| mod_full_brace_do                        | 単文の'do'/'while'文に'{}'を追加/削除する { ignore, add, remove, force }                                                                                                                             |
| mod_full_brace_for                       | 単文の'for'文に'{}'を追加/削除する { ignore, add, remove, force }                                                                                                                                    |
| mod_full_brace_function                  | 単文の関数定義に'{}'を追加/削除する (Pawn) { ignore, add, remove, force }                                                                                                                            |
| mod_full_brace_if                        | 単文の'if'文に'{}'を追加/削除する 'else'を含む場合、'{}'は削除されない。 { ignore, add, remove, force }                                                                                              |
| mod_full_brace_if_chain                  | 全ての'if'/'elseif'/'else'文のブロックを'{}'で囲うかどうか (1つでも'{}'で囲う必要があれば、全て'{}'で囲われ、全てが囲う必要がなければ、'{}'は削除される) { false, true } (mod_full_brace_ifを上書き) |
| mod_full_brace_nl                        | mod_full_brace_xxxのボディがN行より長い場合、'{}'は削除しない { number }                                                                                                                             |
| mod_full_brace_while                     | 単文の'while'文に'{}'を追加/削除する { ignore, add, remove, force }                                                                                                                                  |
| mod_full_brace_using                     | 単文の'using'文に'{}'を追加/削除する (C#言語) { ignore, add, remove, force }                                                                                                                         |
| mod_paren_on_return                      | 'return'文の不要な'()'を追加/削除する { ignore, add, remove, force }                                                                                                                                 |
| mod_pawn_semicolon                       | オプショナルなセミコロンをリアルなセミコロンに修正するかどうか (Pawn) { false, true }                                                                                                                |
| mod_full_paren_if_bool                   | 'while'と'if'文のブール値の前後に括弧を追加する { false, true }                                                                                                                                      |
| mod_remove_extra_semicolon               | 余分なセミコロンを削除する { false, true }                                                                                                                                                           |
| mod_add_long_function_closebrace_comment | 関数ボディの行数が指定数を超えるような長い関数の場合、'}'の後にコメントが付く { number }                                                                                                             |
| mod_add_long_switch_closebrace_comment   | 'switch'文のボディの行数が指定数を超えるような長いボディの場合、'}'の後にコメントが付く { number }                                                                                                   |
| mod_add_long_ifdef_endif_comment         | #ifdefのボディの行数が指定数を超えるような長いボディの場合、#endifの後にコメントが付く { number }                                                                                                    |
| mod_add_long_ifdef_else_comment          | #ifdefもしくは#elseのボディが指定数を超えるような長いボディの場合、#elseの後にコメントが付く { number }                                                                                              |
| mod_sort_import                          | 連続する1行の'import'文をソートするかどうか (Java言語、D言語) { false, true }                                                                                                                        |
| mod_sort_using                           | 連続する1行の'using'文をソートするかどうか (C#言語) { false, true }                                                                                                                                  |
| mod_sort_include                         | 連続する1行の'#include'文もしくは'#import'文をソートするかどうか (Objective-C言語) コードを破壊する可能性があるので、一般的にソートしなおすのは良くない { false, true }                              |
| mod_move_case_break                      | '{}'で囲われた'case'の後にある'break'文を'}'の内側に移動する { false, true }                                                                                                                         |
| mod_case_brace                           | '{}'で囲われた'case'文の前後に'{}'を追加/削除する もし、ブロック内に変数宣言がない場合に限り、'{}'を削除できる { ignore, add, remove, force }                                                        |
| mod_remove_empty_return                  | 関数の最後の文に現れる、'return;'を削除するかどうか { false, true }                                                                                                                                  |

僕の設定
--------

```bash:mod.cfg
mod_full_brace_do                           = add
mod_full_brace_for                          = add
mod_full_brace_function                     = ignore
mod_full_brace_if                           = add
mod_full_brace_if_chain                     = false
mod_full_brace_nl                           = 0
mod_full_brace_while                        = add
mod_full_brace_using                        = ignore
mod_paren_on_return                         = remove
mod_pawn_semicolon                          = false
mod_full_paren_if_bool                      = false
mod_remove_extra_semicolon                  = true
mod_add_long_function_closebrace_comment    = 0
mod_add_long_switch_closebrace_comment      = 0
mod_add_long_ifdef_endif_comment            = 0
mod_add_long_ifdef_else_comment             = 0
mod_sort_import                             = false
mod_sort_using                              = false
mod_sort_include                            = false
mod_move_case_break                         = true
mod_case_brace                              = ignore
mod_remove_empty_return                     = true
```

MOD_FULL_BRACE_DO
-----------------
```cpp:mod_full_brace_do.cpp
// mod_full_brace_do = add
// 一行'do'/'while'文の間に{}'が挿入される。
/* 整形前 */   do func(); while (0);
/* 整形後 */   do { func(); } while (0);

// mod_full_brace_do = remove
// 'do'/'while'文から{}'が削除される。
/* 整形前 */   do { func(); } while (0);
/* 整形後 */   do func(); while (0);
```

MOD_FULL_BRACE_FOR
------------------
```cpp:mod_full_brace_for.cpp
// 'for'文の間に'{}'が挿入される。
/* 整形前 */ for (;;) func();
/* 整形後 */ for (;;) { func(); }

// 'for'文から'{}'が挿入される。
/* 整形前 */ for (;;) { func(); }
/* 整形後 */ for (;;) func();
```

MOD_FULL_BRACE_IF
-----------------
```cpp:mod_full_brace_if
// 'if'文の間に'{}'が挿入される。
/* 整形前 */ if (true) func();
/* 整形後 */ if (true) { func(); }

// 'if'文から'{}'が削除される。
/* 整形前 */ if (true) { func(); }
/* 整形後 */ if (true) func();
```

MOD_FULL_BRACE_IF_CHAIN
-----------------------
```cpp:mod_full_brace_if_chain.cpp
// mod_full_brace_if_chain = false
// 'if'/'else-if'/'else'文に'{}'が挿入される。
if (foo) { func1(); }
else if (bar) { func2(); }
else { func3(); }

// 'if'/'else-if'/'else'文から'{}'が削除される。
if (foo) func1();
else if (bar) func2();
else func3();
```

MOD_FULL_BRACE_NL
-----------------
```cpp:mod_full_brace_nl.cpp
// mod_full_brace_nl = 1
// 以下のコードは'{}'が削除される。
if (foo) func();


// 以下のコードは'{}'が削除されない。
if (foo) {
    func();
}
```

MOD_FULL_BRACE_WHILE
--------------------
```cpp:mod_full_brace_while.cpp
// 'while'文の間に'{}'が挿入される。
/* 整形前 */ while (true) func();
/* 整形後 */ while (true) { func(); }

// 'while'文から'{}'が挿入される。
/* 整形前 */ while (true) { func(); }
/* 整形後 */ while (true) func();

```

MOD_PAREN_ON_RETURN
-------------------
```cpp:mod_paren_on_return.cpp
// 'return'の'()'を取り除く。
/* 整形前 */ return (foo);
/* 整形後 */ return foo;
```

MOD_REMOVE_EXTRA_SEMICOLON
--------------------------
```cpp:mod_remove_extra_semicolon.cpp
// mod_remove_extra_semicolon = true
// 余計な':'が削除される。
{
    if (foo) {
        ; // この';'は削除される。
    }
}
```

MOD_ADD_LONG_FUNCTION_CLOSEBRACE_COMMENT
----------------------------------------
```cpp:mod_add_long_function_closebrace_comment.cpp
// mod_add_long_function_closebrace_comment = 5
// こんな感じで、関数ボディが5行以上の場合、'}'の後にコメントが付く。
// 行数は、'{'から'}'の間の改行文字でカウントしているようだ。
void comment_at_the_end_of_long_function(void)
{
    /* line 1 */
    /* line 2 */
    /* ...... */
    /* Looong */
} // comment_at_the_end_of_long_function
```

MOD_ADD_LONG_SWITCH_CLOSEBRACE_COMMENT
--------------------------------------
```cpp:mod_add_long_switch_closebrace_comment.cpp
// mod_add_long_switch_closebrace_comment = 5
// こんな感じで、'switch'分のボディが5行以上の場合、'}'の後にコメントが付く。
// 行数は、'{'から'}'の間の改行文字でカウントしているようだ。
{
    switch (foo) {
        /* line 1 */
        /* line 2 */
        /* ...... */
        /* Looong */
    }
}
```

MOD_ADD_LONG_IFDEF_ENDIF_COMMENT
--------------------------------
```cpp:mod_add_long_ifdef_endif_comment.cpp
// mod_add_long_ifdef_endif_comment = 4
// こんな感じで、'#ifdef'と'#endif'の間が4行以上の場合、'#endif'の後にコメントが付く。
#ifdef DEBUG
    /* line 1 */
    /* line 2 */
    /* ...... */
    /* Looong */
#endif // ifdef DEBUG
```

MOD_ADD_LONG_IFDEF_ELSE_COMMENT
--------------------------------
```cpp:mod_add_long_ifdef_else_comment.cpp
// mod_add_long_ifdef_else_comment = 4
// こんな感じで、'#ifdef'と'#else'の間が4行以上の場合、'#else'の後にコメントが付く。
#ifdef DEBUG
    /* line 1 */
    /* line 2 */
    /* ...... */
    /* Looong */
#else // ifdef DEBUG
#endif
```

MOD_MOVE_CASE_BREAK
-------------------
```cpp:mod_move_case_break.cpp
// 以下のようなコードを変形します。
    switch (foo) {
        case AAA:
        {
            /* ... */
        }
        break;
    }

// 整形後
    switch (foo) {
        case AAA:
        {
            /* ... */
            break;
        }
    }
```

MOD_REMOVE_EMPTY_RETURN
-----------------------
```cpp:mod_remove_empty_return.cpp
// mod_remove_empty_return = true
// 文字通りだが、'return;'が取り除かれる。
    do_something();

    return; // <- 削除される。
}
```