| RFC-0231:FIDL 版本替換語法 | |
|---|---|
| 狀態 | 已接受 |
| 區域 |
|
| 說明 | 在 @available 屬性中新增 replaced=N 引數 |
| 問題 | |
| Gerrit 變更 | |
| 作者 | |
| 審查人員 | |
| 提交日期 (年-月-日) | 2023-09-26 |
| 審查日期 (年-月-日) | 2023 年 10 月 24 日 |
摘要
變更 FIDL 的 @available 屬性,以支援 replaced 引數。它與 removed 類似,但會驗證替換項目是否為相同版本的 added。
背景
RFC-0083:FIDL 版本管理引入了 @available 屬性,用於管理 FIDL API 的版本。該設計的一項要求,是允許為所有可能的變更建立版本。換句話說,在單一 versioned.fidl 檔案中,應可表示 v1.fidl 轉換為任意不同的 v2.fidl。這項設計滿足這項需求,只要版本範圍不重疊,就允許多個元素使用相同的名稱。
舉例來說,您可以考慮在第 5 版中,將 @discoverable 屬性新增至通訊協定 P。我們無法直接使用 @available 表示這項資訊,因為屬性無法放置在其他屬性上。不過,我們可以改用以下做法:
@available(added=1, removed=5)
protocol P {};
@available(added=5)
@discoverable
protocol P {};
提振精神
新增、淘汰和移除 API 的一般生命週期語法相當直覺。另一方面,交換模式則不會。這項功能在解釋後就會變得合理,但它是需要解釋的隱藏功能。在上述範例中,您可能會認為 removed=5 確實表示該通訊協定在 5 版中已不復存在,尤其是當對應的 added=5 不在原始碼中相鄰時。
區分取代與移除的差異,也能讓您移除舊版功能,並以更通用的解決方案取代。這是另一項提案:RFC-0232:適用於多個 API 級別的 FIDL 繫結。
相關人員
協助人員:abarth@google.com
審查者:hjfreyer@google.com、ianloic@google.com、ddorwin@google.com
諮詢對象:wez@google.com、sethladd@google.com、wilkinsonclay@google.com
社會化:在撰寫 RFC 之前,我已與 FIDL 團隊和平台版本工作小組討論過這個想法。
設計
引入名為
replaced的新@available引數。它的運作方式與removed相同,但驗證方式不同,請參閱下文。除了library宣告外,您可以在任何元素上使用removed。如果元素標示為
removed=N,請驗證「沒有」其他同名元素標示為added=N。如果元素標示為
replaced=N,請驗證是否IS其他同名元素標示為added=N。這項驗證僅適用於直接標示為
removed或replaced的元素,不適用於繼承引數的子元素。
範例
背景一節中,在第 5 版的通訊協定中加入 @discoverable 的範例,在新設計中會如下所示:
@available(added=1, replaced=5)
protocol P {};
@available(added=5)
@discoverable
protocol P {};
舉例來說,您可以考慮將包含成員的結構體取代為匿名類型:
@available(added=1, replaced=2)
struct Foo {
bar @generated_name("Bar") table {};
};
@available(added=2)
struct Foo {
baz string;
};
由於第一個 Foo 已標示為 replaced=2,因此 fidlc 會驗證是否有另一個標示為 added=2 的 Foo。不過,它「不會」針對子元素 bar 或其匿名類型 Bar 執行類似的驗證。
實作
實作
replaced引數,包括驗證。將所有 FIDL 檔案變更為使用
replaced而非removed(如適用)。實作新的
removed驗證。如果 (2) 遺漏任何內容,CQ 就會失敗。
成效
這項提案不會影響成效。
人體工學
這項提案會直接在語言中支援切換模式,讓模式更符合人體工學。
回溯相容性
這項提案不會影響回溯相容性。
安全性考量
這項提案不會影響安全性。
隱私權注意事項
這項提案不會影響隱私權。
測試
您必須更新下列檔案,才能測試新行為:
- tools/fidl/fidlc/tests/availability_interleaving_tests.cc
- tools/fidl/fidlc/tests/decomposition_tests.cc
- tools/fidl/fidlc/tests/versioning_tests.cc
- tools/fidl/fidlc/tests/versioning_types_tests.cc
說明文件
以下頁面必須更新為 replaced 文件:
您也應移除「swapping」一詞,改用「replaced」。
fidldoc 工具目前會針對單一 API 級別運作 JSON IR,因此不會看到 removed 引數,也不會看到 replaced (https://fxbug.dev/42084086)。修正後,fidldoc 應更新,以便清楚指出何時會取代而非移除某些項目。
缺點、替代方案和未知事項
替代方案:重新加入的引數
此提案引入 replaced 引數,可清楚指出元素何時會取代而非移除。這可避免發生以下情況:「我以為我無法使用這個 API,因為它顯示 removed=5,而我們指定的是 6。」
我們也可以以類似的方式引入 re_added 引數,以便說明何時新增元素做為替換,而非首次新增。這麼做可避免發生「我以為我還不能使用這個 API,因為它顯示 added=6,而我們指定的目標是 5」的情況。
我拒絕這個替代方案的原因如下:
我認為第一種情況比第二種情況更重要。
re_added這個名稱不太理想,但我找不到更好的名稱。即使沒有這項資訊,我們還是可以讓 fidldoc 推斷元素是否是第一次
added。
既有技術與參考資料
我在 2021 年開發 FIDL 版本時,曾在標題為「FIDL 版本:交換元素」的內部文件中討論過類似的想法。
這個提案非常明確地針對 FIDL 版本設計,因此就我所知,這個問題並沒有先前技術。