0%

【文章翻譯】Bulk application of fixes

【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】

一步修復多個分析問題

快速修復分析問題中,我們探討了在編輯時自動修復個別診斷的支持。有時即使這樣也太慢了,您真的希望一次修復多個診斷。幸運的是,也有支持這樣做的,我們將在本文中介紹。

修復多個診斷的方法有幾種,取決於您要修復多少診斷,我們將分別研究每一種方法。

修復同一個診斷的多個出現位置

您是否曾經透過將類別移動到不同的檔案來重構程式碼?如果是這樣,很可能某些 import 僅僅是因為移動的類別中的引用才需要的,這會導致您留下未使用的 import:

Visual Studio Code
IntelliJ IDEA

對於任何可以在同一個檔案中多次應用的修復,工具都提供了一個選項,可以在檔案中的任何位置應用它。

這些修復會顯示在與其他修復相同的位置,並且標籤通常與單個位置修復相似,但會添加一些短語,例如「在檔案中」。例如,以下是此修復在 IDE 中的顯示方式:

Visual Studio Code
IntelliJ IDEA

選擇「在檔案中」修復會完全按照您的預期執行 - 它會移除檔案中所有未使用的 import:

Visual Studio Code
IntelliJ IDEA

修復檔案中的所有診斷

這很棒,但它只修復一種診斷,並且需要您找到報告診斷的位置(在編輯器中或在問題視圖中)才能調用修復。看起來工具還可以做得更多。

在 Visual Studio Code 中,它可以。您可以將修復應用於單個檔案中的所有診斷。為了了解如何操作,我們將使用與上面相同的示例:

如果您按一下滑鼠右鍵打開上下文選單,您將看到以下內容:

如果您選擇**原始碼動作…**,它會打開第二個選單:

選擇全部修復會將修復應用於編輯器中的所有診斷,產生以下結果:

您也可以從命令面板調用全部修復命令,您可以透過從檢視選單中選擇**命令面板…**或使用鍵盤快捷鍵(任何平台上的 F1,Windows 和 Linux 上的 Control+Shift+P 或 macOS 上的 Command+Shift+P)來打開命令面板。您可以透過輸入命令的名稱來篩選列表。命令面板看起來像這樣:

修復目錄中的所有診斷

我們用於修復診斷的最完整的工具是命令列工具 dart fix。它可以修復給定目錄中的所有診斷,這意味著您可以使用它來修復套件或應用程式中的所有內容。

當然,有一些注意事項。它並不能修復每個診斷,因為它應用與 IDE 中可用的快速修復相同的快速修復,並且並非每個診斷都有快速修復。當有多個同樣有效的方法來修復問題時,它也不會應用快速修復診斷,因為它不知道您更喜歡應用哪個修復。這些注意事項也適用於上一節中描述的全部修復命令。

雖然不需要經常使用此工具(這也是您可能不知道它的原因之一),但在某些情況下它特別有用。

首先,考慮您想要啟用新的 lint,甚至是 lints 集的情況,例如核心建議flutter規則集之一。您的套件中很可能至少有一些違反 lint 規則的情況。如果存在與 lint 相關聯的修復,那麼一步應用該修復到所有位置會比單獨應用修復到每個違規位置更方便。

其次,考慮您從一個 Flutter 版本更新到另一個版本的情況。如果兩個版本之間有 API 變更,則很有可能存在修復以升級您的程式碼以符合最新版本。同樣,如果所有這些變更都在單個操作中應用,則會很方便。

這就是 dart fix 命令的用武之地。它可以在多個檔案中應用針對多個診斷的快速修復。

該命令有兩種模式。「空運行」模式會告訴您可以應用多少變更以及可以修復哪些診斷,但不會修改任何檔案。「應用」模式會應用變更。

您可以提供包含要修復的檔案的目錄的路徑,但如果您省略目錄,它會遞迴地修復目前目錄及其子目錄中的所有檔案。

假設您已啟用 prefer_single_quotes lint,並且您有一個包含以下內容的檔案:

1
2
3
4
5
6
7
8
import "package:logging/logging.dart";

void main() {
var logger = Logger("myApp");
logger.info("Entering myApp");
// Do stuff.
logger.info("Exiting myApp");
}

從包含此檔案的目錄中使用 --dry-run 選項運行 dart fix 命令會產生以下輸出:

1
2
3
4
5
6
7
$ dart fix --dry-run
Computing fixes in __bin__ (dry run)... 4.3s

3 proposed fixes in 1 file.

demo.dart
prefer_single_quotes • 3 fixes

該工具已找到三個違反 lint 的地方,並報告它能夠修復所有三個,但它不會修改檔案。

再次運行 dart fix 工具,但這次使用 --apply 選項,會產生幾乎相同的輸出:

1
2
3
4
5
6
7
8
9
10
$ dart fix --apply
Computing fixes in __bin__... 5.3s
Applying fixes... 0.0s

3 proposed fixes in 1 file.

demo.dart
prefer_single_quotes • 3 fixes

3 fixes made in 1 file.

但這次檔案會更新為包含以下內容:

1
2
3
4
5
6
7
8
import 'package:logging/logging.dart';

void main() {
var logger = Logger('myApp');
logger.info('Entering myApp');
// Do stuff.
logger.info('Exiting myApp');
}

由於空運行模式不會產生任何允許您查看所建議的實際變更的 diff 輸出,請考慮在使用 --apply 選項運行工具之前提交您的變更。這樣,更容易查看工具實際進行了哪些變更,並還原您不喜歡的任何變更。

如果您不想在運行工具之前提交,並且您正在使用 IntelliJ IDEA,則可以使用檔案->本地歷史記錄功能來比較應用修復前後的狀態。(如需更多資訊,請參閱將標籤添加到特定狀態的本地歷史記錄。)

dart fix 命令無法修復所有問題,但如果可以的話,它比手動應用修復到所有位置要容易得多。

總結

能夠在單個操作中應用多個修復不僅提高了快速修復的功能,還可能更容易進行更大規模的變更,例如啟用新的 lint 規則或升級到最新版本的 Flutter。

與往常一樣,如果您對如何改進這些工具有任何想法,請透過建立 dart-lang/sdk 問題告知我們。