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 言語のアップデートで構文が追加されるためルールの アップデートも必要 ○ 既存ルールもコントリビュートチャンス