Slide 1

Slide 1 text

SwiftSyntaxが⾯⽩い ~ Enumのcaseをアルファベット順でsortしよう ~

Slide 2

Slide 2 text

About Me! • りゅう • 法政⼤学電気電⼦⼯学科 3年 • NewsPicksでインターン • 最近SwiftSyntaxに⼊⾨した • CLIツールを作るのが好き @Ryu0118 @ryu_hu03 @Ryu0118 @ryu_hu03

Slide 3

Slide 3 text

• Apple公式のライブラリ • ソースコードを解析、⽣成、変換することができるライブラリ • swift-formatやSwiftLint, mockolo, Sourceryなどのライブラリ で使⽤されている。 SwiftSyntaxとは 今回はSwiftSyntaxを⽤いてEnumのcaseをアルファベット 順にソートするプログラムを書いてみる =>

Slide 4

Slide 4 text

コードを抽象構⽂⽊(AST)に変換してみる

Slide 5

Slide 5 text

enum Hoge { case b case a } ASTに変換すると… (使⽤したツール https://swift-ast-explorer.com)

Slide 6

Slide 6 text

この⼆つを並び替えるコードを 書いたらいけそう🧐

Slide 7

Slide 7 text

SwiftSyntaxを少し学ぶ

Slide 8

Slide 8 text

SyntaxRewriter • 構⽂⽊を書き換えることができる • descriptionプロパティで書き換えたSwiftコードを出⼒できる ⚠ 本スライドのSwiftSyntaxはmainブランチを指定して使⽤しています。 最新バージョンとは書き⽅が違うのでご了承ください。

Slide 9

Slide 9 text

この2つが対応している。 つまり、コード内にEnumがあった場合、 このvisitメソッドが呼び出される。

Slide 10

Slide 10 text

それぞれの対応関係はこんな感じで、 node.with(_:_:)で⼦ノードの値を書き換えることができる。

Slide 11

Slide 11 text

membersを空のListに置き換えた! これでcaseがないenumができるはず 実際にEnumEmptyRewriterを動かしてみよう!

Slide 12

Slide 12 text

ソースコードを構⽂⽊に変換して

Slide 13

Slide 13 text

SyntaxRewriterを使って構⽂⽊を書き換える

Slide 14

Slide 14 text

構⽂⽊からSwiftのコードに変換し、出⼒

Slide 15

Slide 15 text

実⾏すると…

Slide 16

Slide 16 text

期待通りの出⼒になった

Slide 17

Slide 17 text

enumのcaseをアルファ ベット順に並び替える

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

実⾏すると… let `enum` = """ enum E1 { case b case a } """ let syntax = Parser.parse(source: `enum`) let formatted = EnumRewriter().visit(syntax) print(formatted.description)

Slide 26

Slide 26 text

並び変わった!!

Slide 27

Slide 27 text

enum E1 { case b case a case j case h case i case e case d case g case f case c } 別のenumでもちゃんと並びかわる!

Slide 28

Slide 28 text

ただ、、 enum E1 { case b, a, j, h, i, e, d } このenumには⾮対応

Slide 29

Slide 29 text

https://github.com/Ryu0118/Sorter それにも対応したコードがこちらにあるの で、 よかったらStar押してください!!

Slide 30

Slide 30 text

ご清聴ありがとうございました!!