VSCodeでApexのフォーマッターを使う（Windows版）

VSCodeの拡張機能にApexのフォーマッターが無いため、外部ツールと組み合わせて実現させます。
# 参考にした記事
https://qiita.com/hrk623/items/921a0e9b6498c7f500b6

# Uncrustify インストール
Uncrustify という外部ツールをインストールします。
下記サイトから Uncrustify の最新版バイナリをダウンロードします。（投稿時点の最新は 0.76.0）

https://sourceforge.net/projects/uncrustify/files/

ダウンロードした zip ファイルを解凍し、任意のフォルダに配置します。
ここでは `C:\dev\uncrustify-0.76.0_f-win64` とします。
```
C:\dev
　　└ uncrustify-0.76.0_f-win64
　　　　├ bin
　　　　│　└ uncrustify.exe　　← 必要なのはこのファイルです
　　　　└ share
　　　　　　├ doc
　　　　　　└ man
```
`uncrustify.exe` のあるフォルダ `C:\dev\uncrustify-0.76.0_f-win64\bin` を環境変数PATHに通します。
ユーザー環境変数かシステム環境変数かは都合に合わせて設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/3e0c4794-c500-f059-573e-dd05dde54a86.png)

# VSCode の Uncrustify 拡張機能セットアップ
VSCode の拡張機能の検索窓から `uncrustify` と入力し、Uncrustify の拡張機能が表示されたらインストールボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/16ccdf7c-3955-b794-aaa8-1c04f3af1813.png)
インストールが完了したら、拡張機能の歯車マークから設定画面を開きます。（ウィンドウ左下の大きな歯車から設定を開き、検索窓から uncrustify と入力しても表示されます）
`Uncrustify: Lang Override` の `settings.json で編集` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/5067d8ec-de0d-5204-0de0-f57baccde787.png)
apex のコードを Java のルールでフォーマットするために下記のように記載します。
```
    "uncrustify.langOverrides": {
        "apex": "JAVA",
        "apex-anon": "JAVA"
    },
```
追記した様子。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/ce670daa-d2f4-a9ed-84e6-bde6be2efa7b.png)
設定が反映されるよう、念のため VSCode を再起動します。
以上で設定は完了です。

# Uncrustify の設定ファイル作成
:::note info
設定ファイルが用意されている場合はこの作業は不要です
:::
[表示] - [コマンドパレット] を開き、`SFDX` と入力して候補に表示される `SFDX: プロジェクトを作成` から指示に従ってプロジェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/edea1fb2-3451-cbf5-a0da-c01bec64ccaf.png)
次に [表示] - [コマンドパレット] を開き、`uncrustify` と入力して候補に表示される `Uncrustify: Create default config file` を選択します。そうするとプロジェクト直下に `uncrustify.cfg` というファイルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/9704b150-2f44-7d10-e4c7-cb724a382819.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/ab32e965-2249-a200-db4a-1d1c94daeadd.png)
ただ、デフォルトの設定のままだときれいにフォーマットされない場合があるので、下記のコードを上書きします。
（設定ファイルの項目一つ一つを把握しきれていないため、どなたかが Apex用に作成してくださったものを拝借しています）

https://gist.github.com/gbutt/23710a249c7d18fcdf9f6249cbe8915a

# フォーマット操作
## 手動フォーマット
Apex のコードを開いた状態で `Alt＋Shift+F` でフォーマットされます。
【例】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/237ecb0f-740d-17e0-6934-81dd28269068.png)
`Alt＋Shift+F` を押すと、、、こうなります↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/b02f8189-6cd7-5c71-a8b2-b751070e1886.png)

## 自動フォーマット設定
自動フォーマット設定をすることで、ファイル保存時に自動フォーマットしてくれるため、上記手動フォーマットは不要になるのでおススメです。
設定画面から `Editor: Format On Save` のチェックボックスを付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/fd92c310-471e-de08-f3ca-f1bab18390ba.png)
（注）`Files: Auto Save` 設定が `afterDelay` になっていると自動フォーマットが効かないので注意してください。

# （補足）フォーマットされない表現
## switch ステートメント
Apex の switch 文が含まれているコードはフォーマットされないことを確認しています。
if 文に置き換えることをおススメします。
``` apex
switch on i {
    when 2 {
        System.debug('i is 2');
    }
    when -3 {
        System.debug('i is -3');
    }
    when else {
        System.debug('default');
    }
}
```

``` apex
if (i == 2) {
    System.debug('i is 2');
} else if (i == -3) {
    System.debug('i is -3');
} else {
    System.debug('default');
}
```