SwiftLint にコントリビュートする
by
swiftty
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 言語のアップデートで構文が追加されるためルールの アップデートも必要 ○ 既存ルールもコントリビュートチャンス