SwiftLint にコントリビュートする
by
swiftty
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
© 2024 Wantedly, Inc. SwiftLint に コントリビュートする potatotips #86 iOS/Android開発Tips共有会 Feb. 7 2024 - 林達也
Slide 2
Slide 2 text
© 2024 Wantedly, Inc. 自己紹介
Slide 3
Slide 3 text
© 2024 Wantedly, Inc. SwiftLint は Swift Macros の勉強に良い また SwiftLint にコントリビュートするきっかけになれたら 今日伝えたいこと
Slide 4
Slide 4 text
© 2024 Wantedly, Inc. きっかけ ● Swift Macros を少し触ったが理解が大変だった ○ syntax の種類 ○ syntax のネスト構造 ○ … ● 「Swift Macros の理解に SwiftLint は分かりやすい」 ○ iOSDC Japan 2023: Mastering SwiftSyntax / kishikawa katsumi ■ https://speakerdeck.com/kishikawakatsumi/mastering-swiftsyntax
Slide 5
Slide 5 text
© 2024 Wantedly, Inc. きっかけ ● Swift Macros を少し触ったが理解が大変だった ○ syntax の種類 ○ syntax のネスト構造 ○ … ● 「Swift Macros の理解に SwiftLint は分かりやすい」 ○ iOSDC Japan 2023: Mastering SwiftSyntax / kishikawa katsumi ■ https://speakerdeck.com/kishikawakatsumi/mastering-swiftsyntax → 年末年始に取り組んでみた
Slide 6
Slide 6 text
© 2024 Wantedly, Inc. SwiftLint Rule の構造
Slide 7
Slide 7 text
© 2024 Wantedly, Inc. SwiftLint の Rule ● description に全て まとまっている ● Examples にあるコードが テストとしても実行され チェックされる
Slide 8
Slide 8 text
© 2024 Wantedly, Inc. SwiftSyntax ベースへの書き換え ● @SwiftSyntaxRule マクロ
Slide 9
Slide 9 text
© 2024 Wantedly, Inc. SwiftSyntax ベースへの書き換え ● @SwiftSyntaxRule マクロ ○ Visitor は SwiftSyntax の SyntaxVisitor を継承したクラス ■ violations に違反位置を append するとそこにワーニング・エラーが表示される仕組み
Slide 10
Slide 10 text
© 2024 Wantedly, Inc. SwiftSyntax ベースへの書き換え ● @SwiftSyntaxRule マクロ ○ Visitor は SwiftSyntax の SyntaxVisitor を継承したクラス ■ violations に違反位置を append するとそこにワーニング・エラーが表示される仕組み
Slide 11
Slide 11 text
© 2024 Wantedly, Inc. SyntaxVisitor ● Syntax の種類ごとに visit メソッドが用意されている ○ lint したい要素の visit/visitPost を実装して node から必要な情報を取り出す
Slide 12
Slide 12 text
© 2024 Wantedly, Inc. 実際に取り組んでみた
Slide 13
Slide 13 text
© 2024 Wantedly, Inc. はじめに ● SwiftLint を clone してルールを一通り SwiftSyntax の勉 強を兼ねて眺める ○ 大多数は既に SwiftSyntax ベースに移行済み 😮 ● SwiftSyntax に変更できそうなルールをさがす ○ SourceKittenFramework を import しているルール ○ @SwiftSyntaxRule のないルール
Slide 14
Slide 14 text
© 2024 Wantedly, Inc. 書き換えたルール ● mark ● orphaned_doc_comment ● nesting
Slide 15
Slide 15 text
© 2024 Wantedly, Inc. mark ● // MARK: comment 形式になっていないものを検出する ○ /// MARK comment ○ // MARK:comment ● Trivia のコメント文字列が適正か正規表現でチェック
Slide 16
Slide 16 text
© 2024 Wantedly, Inc. nesting ● ネストした型定義が指定階層以上のものを検出する ○ enum Foo { enum Bar { enum Baz {} } } ● DeclSyntax の階層を Stack 構造で記録する ○ Enum, Class, Struct, … , Protocol
Slide 17
Slide 17 text
© 2024 Wantedly, Inc. nesting ● ネストした型定義が指定階層以上のものを検出する ○ enum Foo { enum Bar { enum Baz {} } } ● DeclSyntax の階層を Stack 構造で記録する ○ Enum, Class, Struct, … , Protocol
Slide 18
Slide 18 text
© 2024 Wantedly, Inc. nesting ● Swift 5.10 から Protocol を型や関数内に定義できるように なった [SE-0404] ○ レビュー時にコメントをもらい対応することに ● やることは ProtocolDeclSyntax を追加で見るだけ 🎉 機能追加
Slide 19
Slide 19 text
© 2024 Wantedly, Inc. まとめ ● SwiftSyntax の理解が深まった ○ 単純に書き換えることだけでなく 他のルールがどういう風に Visitor を実装しているかも参考になる ○ ルールに対してテストを兼ねた Example が設置されているのでミニマルな検証が簡単 に行える ● ルールによっては書き換えだけでパフォーマンスが向上 ○ もとの実装と比べてデータの探索が単純化できる場合がある ● Swift 言語のアップデートで構文が追加されるためルールの アップデートも必要 ○ 既存ルールもコントリビュートチャンス