RectorでLaravelアプリケーションの自動リファクタリングを行う


# 概要

下記記事を読んでRector素敵！かっこいい！ってなったので実際に使ってみました！

https://zenn.dev/y_ahiru/articles/auto-refactor-with-rector

# 導入

## 前提環境
```
Composer version 2.5.1
Laravel Framework 9.48.0
```

https://getrector.com/documentation

公式のDocs通りコマンド実行する。

```
composer require rector/rector --dev
```

rector.phpを生成

```
vendor/bin/rector
```

rector.phpにディレクトリパスとルールを指定する
```rector.php
<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\LevelSetList;
use Rector\Set\ValueObject\SetList;

return static function (RectorConfig $rectorConfig): void {
    // ルールを適用したいディレクトリを指定する
    $rectorConfig->paths([
        __DIR__ . '/app',
    ]);

// ここに適用したいルールを記述する
    $rectorConfig->sets([
        
        LevelSetList::UP_TO_PHP_82,
        SetList::CODE_QUALITY
    ]);
};
```



実行コマンドを打つと、指定したルール通りに、該当ディレクトリ以下のソースコードを変更してくれる！
```
vendor/bin/rector process
```


# ざっくりどんなことができるのか？
[公式ドキュメント](https://getrector.com/documentation/set-lists)読むとわかりやすいので詳しくはそっちを読んでほしい。

私がすごいと思ったのはこの辺りだ。

 - DEAD CODEの削除([参考箇所](https://github.com/rectorphp/rector/blob/69a95d55f95014cb2ffe6b4b0987e5b337b6635a/packages/Set/ValueObject/SetList.php#L23C1-L23C1))
 - PHPバージョンに応じたコード修正([参考箇所](https://github.com/rectorphp/rector/blob/69a95d55f95014cb2ffe6b4b0987e5b337b6635a/packages/Set/ValueObject/SetList.php#L92))
 - PHPバージョンアップデート対応([参考箇所](https://github.com/rectorphp/rector/blob/69a95d55f95014cb2ffe6b4b0987e5b337b6635a/packages/Set/ValueObject/LevelSetList.php#L15))
 - 自作ルールを作れる([参考箇所](https://getrector.com/documentation/configured-rules))


# Tips
### Tips1

- RuleSetの一部ルールのみ適用することも可能

例えば[DEAD_CODEルールのソースコード](https://github.com/rectorphp/rector/blob/69a95d55f95014cb2ffe6b4b0987e5b337b6635a/config/set/dead-code.php#L49-L92)を読んでいると、たくさんのRectorクラスが適用されていることがわかる


このRectorクラスの中から一部のルールのみを適用することもできるので、かなりカスタマイズできる！
```rector.php
<?php

declare(strict_types=1);


// use 宣言は省略

return static function (RectorConfig $rectorConfig): void {
    // ルールを適用したいディレクトリを指定する
    $rectorConfig->paths([
        __DIR__ . '/app',
    ]);

// ここに適用したいルールを記述する
 $rectorConfig->rules([
        UnwrapFutureCompatibleIfPhpVersionRector::class,
        RecastingRemovalRector::class,
        RemoveDeadStmtRector::class,
        RemoveDuplicatedArrayKeyRector::class,
        RemoveUnusedForeachKeyRector::class,
        RemoveParentCallWithoutParentRector::class,
        RemoveEmptyClassMethodRector::class,
        RemoveDoubleAssignRector::class,
        SimplifyMirrorAssignRector::class,
        RemoveUnusedPrivatePropertyRector::class,
        RemoveUnusedPrivateClassConstantRector::class,
        RemoveUnusedPrivateMethodRector::class,
        RemoveDeadReturnRector::class,
        RemoveDeadContinueRector::class,
        RemoveDeadIfForeachForRector::class,
        RemoveAndTrueRector::class,
        RemoveConcatAutocastRector::class,
        SimplifyUselessVariableRector::class,
        RemoveDuplicatedCaseInSwitchRector::class,
        RemoveNullPropertyInitializationRector::class,
        RemoveUnreachableStatementRector::class,
        SimplifyIfElseWithSameContentRector::class,
        TernaryToBooleanOrFalseToBooleanAndRector::class,
        RemoveDeadTryCatchRector::class,
        RemoveUnusedVariableAssignRector::class,
        RemoveUnusedNonEmptyArrayBeforeForeachRector::class,
        RemoveDeadConditionAboveReturnRector::class,
        RemoveUnusedConstructorParamRector::class,
        RemoveDeadInstanceOfRector::class,
        RemoveTypedPropertyDeadInstanceOfRector::class,
        RemoveDeadLoopRector::class,
        RemoveUnusedPrivateMethodParameterRector::class,
        // docblock
        RemoveUselessParamTagRector::class,
        RemoveUselessReturnTagRector::class,
        RemoveNonExistingVarAnnotationRector::class,
        RemoveUselessVarTagRector::class,
        RemoveUnusedPromotedPropertyRector::class,
        RemoveJustPropertyFetchForAssignRector::class,
        RemoveAlwaysTrueIfConditionRector::class,
        RemoveDeadZeroAndOneOperationRector::class,
        RemovePhpVersionIdCheckRector::class,
    ]);
};
```


### Tips2

細かいルールどこで確認すれば良いのよ！って思うかもしれないがソースコード読むとわかりやすくSAMPLEが書いてある！


RemoveDoubleAssignRectorクラスを見てみる。

[参考コード](https://github.com/rectorphp/rector/blob/69a95d55f95014cb2ffe6b4b0987e5b337b6635a/rules/DeadCode/Rector/Assign/RemoveDoubleAssignRector.php#L40-L44)
![スクリーンショット 2023-08-20 12.52.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/68aa40f9-59ca-d78b-d36b-4df6788e2026.png)

SAMPLE見る限り、重複している変数宣言があった場合に、重複を取り除いてくれるんだなとわかる。

# まとめ

Rectorとても便利なライブラリで、夢中で調べてしまった！
CIに組み込むなどすることで、自動でコード整形してくれるようになるなど[応用的な使い方](https://getrector.com/documentation/how-rector-works)も紹介されているので、有効利用していきたいところだ！