SwiftLint の inclusive_language ルールで特定の単語だけ許可したいときのやり方

概要

swiftlint:disable: でも SwiftLint は部分的に無視できます。

しかし、「特定の単語」を例外として許可したいときは:

inclusive_language:
  override_allowed_terms:
    - master

のようにして、 rule に対して override_allowed_terms を設定することでプロジェクト全体で許可することが可能になります。

…っていう話をします。

モチベーション

とあるプロジェクトで、 HogeMasterRepository というクラスがあり、 “master” という単語が差別的であるとして SwiftLint のルールに引っかかっていました。

参考: SwiftLint Docs, Inclusive Language

GitHub のデフォルトブランチが master から main になったように、根本的には master という単語を避けた命名をするべきなのですが、
影響範囲が大きかったので、一度以下のようにして無視することとしました。

// SwiftLint では以下のようにして部分的に無効化することができる

// swiftlint:disable:next inclusive_language
class HogeMasterRepository { }

これで修正したところ PR レビューで「inclusive_language の許可リストに master を加えたほうが良いです。」と教えてもらい、調べた結果を自分用にまとめました。

特定の単語を許可する方法

SwiftLint Docs, Inclusive Language のページを見てみてください。
“Default configuration:” という欄があります。

Inclusive Language のページ

そこにはデフォルト設定が書いてあるのですが、 override_allowed_terms の項目があります。
ここに冒頭のように設定してやればいいのです。

inclusive_language:
  override_allowed_terms:
    - ${無効化したい単語}

って感じになります。

最初は identifier_name:excluded: の所に書いてたのですが、反映されずハマりました。。。

逆に特定の単語を有効にしたい場合

先程の Doc を注意深く見ればわかるのですが、 additional_termsoverride_terms ってのがあります。
これはそれぞれ、

  • additional_terms:
    • デフォルトに追加で警告を出したい単語を登録する
  • override_terms:
    • デフォルトの単語は破棄して、新しい単語リストを定義する

という違いがあります。

例えば、それぞれに daichi を追加した場合を考えると、

  • additional_terms:
    • “whitelist”, “blacklist”, “master”, “slave” に追加して “daichi” にも警告を出す
  • override_terms:
    • “daichi” だけに警告を出す

という動作になります。

これに関しては SwiftLint のソースコードを読むと確実に理解できると思いますが、以下のように処理されているので、このような動作になります。

allTerms = overrideTerms ?? defaultTerms
    // override_terms が与えられていればそれを allTerm として、無ければ default を使用する
allTerms.formUnion(additionalTerms ?? [])
    // additional_terms があれば追加する
allAllowedTerms = overrideAllowedTerms ?? defaultAllowedTerms
    // override_allowed_terms が与えられていればそれを allAllowedTerms として、無ければ default を使用する

参考: GitHub, InclusiveLanguageConfiguration.swift

おわり

PR のし的からまさか SwiftLint のソースコードを読むことになるとは思いませんでしたが、 inclusive_language の設定については詳しくなれました。

参考文献

  1. SwiftLint Docs, Inclusive Language
  2. GitHub, InclusiveLanguageConfiguration.swift
Built with Hugo
テーマ StackJimmy によって設計されています。