Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SwiftLint にコントリビュートする

swiftty
February 07, 2024

SwiftLint にコントリビュートする

2024/02/07
potatotips #86 iOS/Android開発Tips共有会
https://potatotips.connpass.com/event/307311/

で発表した資料です

swiftty

February 07, 2024
Tweet

More Decks by swiftty

Other Decks in Technology

Transcript

  1. © 2024 Wantedly, Inc. SwiftLint は Swift Macros の勉強に良い また

    SwiftLint にコントリビュートするきっかけになれたら 今日伝えたいこと
  2. © 2024 Wantedly, Inc. きっかけ • Swift Macros を少し触ったが理解が大変だった ◦

    syntax の種類 ◦ syntax のネスト構造 ◦ … • 「Swift Macros の理解に SwiftLint は分かりやすい」 ◦ iOSDC Japan 2023: Mastering SwiftSyntax / kishikawa katsumi ▪ https://speakerdeck.com/kishikawakatsumi/mastering-swiftsyntax
  3. © 2024 Wantedly, Inc. きっかけ • Swift Macros を少し触ったが理解が大変だった ◦

    syntax の種類 ◦ syntax のネスト構造 ◦ … • 「Swift Macros の理解に SwiftLint は分かりやすい」 ◦ iOSDC Japan 2023: Mastering SwiftSyntax / kishikawa katsumi ▪ https://speakerdeck.com/kishikawakatsumi/mastering-swiftsyntax → 年末年始に取り組んでみた
  4. © 2024 Wantedly, Inc. SwiftLint の Rule • description に全て

    まとまっている • Examples にあるコードが テストとしても実行され チェックされる
  5. © 2024 Wantedly, Inc. SwiftSyntax ベースへの書き換え • @SwiftSyntaxRule マクロ ◦

    Visitor は SwiftSyntax の SyntaxVisitor を継承したクラス ▪ violations に違反位置を append するとそこにワーニング・エラーが表示される仕組み
  6. © 2024 Wantedly, Inc. SwiftSyntax ベースへの書き換え • @SwiftSyntaxRule マクロ ◦

    Visitor は SwiftSyntax の SyntaxVisitor を継承したクラス ▪ violations に違反位置を append するとそこにワーニング・エラーが表示される仕組み
  7. © 2024 Wantedly, Inc. SyntaxVisitor • Syntax の種類ごとに visit メソッドが用意されている

    ◦ lint したい要素の visit/visitPost を実装して node から必要な情報を取り出す
  8. © 2024 Wantedly, Inc. はじめに • SwiftLint を clone してルールを一通り

    SwiftSyntax の勉 強を兼ねて眺める ◦ 大多数は既に SwiftSyntax ベースに移行済み 😮 • SwiftSyntax に変更できそうなルールをさがす ◦ SourceKittenFramework を import しているルール ◦ @SwiftSyntaxRule のないルール
  9. © 2024 Wantedly, Inc. mark • // MARK: comment 形式になっていないものを検出する

    ◦ /// MARK comment ◦ // MARK:comment • Trivia のコメント文字列が適正か正規表現でチェック
  10. © 2024 Wantedly, Inc. nesting • ネストした型定義が指定階層以上のものを検出する ◦ enum Foo

    { enum Bar { enum Baz {} } } • DeclSyntax の階層を Stack 構造で記録する ◦ Enum, Class, Struct, … , Protocol
  11. © 2024 Wantedly, Inc. nesting • ネストした型定義が指定階層以上のものを検出する ◦ enum Foo

    { enum Bar { enum Baz {} } } • DeclSyntax の階層を Stack 構造で記録する ◦ Enum, Class, Struct, … , Protocol
  12. © 2024 Wantedly, Inc. nesting • Swift 5.10 から Protocol

    を型や関数内に定義できるように なった [SE-0404] ◦ レビュー時にコメントをもらい対応することに • やることは ProtocolDeclSyntax を追加で見るだけ 🎉 機能追加
  13. © 2024 Wantedly, Inc. まとめ • SwiftSyntax の理解が深まった ◦ 単純に書き換えることだけでなく

    他のルールがどういう風に Visitor を実装しているかも参考になる ◦ ルールに対してテストを兼ねた Example が設置されているのでミニマルな検証が簡単 に行える • ルールによっては書き換えだけでパフォーマンスが向上 ◦ もとの実装と比べてデータの探索が単純化できる場合がある • Swift 言語のアップデートで構文が追加されるためルールの アップデートも必要 ◦ 既存ルールもコントリビュートチャンス