SwiftSyntaxが⾯⽩い~ Enumのcaseをアルファベット順でsortしよう ~
View Slide
About Me!• りゅう• 法政⼤学電気電⼦⼯学科 3年• NewsPicksでインターン• 最近SwiftSyntaxに⼊⾨した• CLIツールを作るのが好き@Ryu0118@ryu_hu03@Ryu0118@ryu_hu03
• Apple公式のライブラリ• ソースコードを解析、⽣成、変換することができるライブラリ• swift-formatやSwiftLint, mockolo, Sourceryなどのライブラリで使⽤されている。SwiftSyntaxとは今回はSwiftSyntaxを⽤いてEnumのcaseをアルファベット順にソートするプログラムを書いてみる=>
コードを抽象構⽂⽊(AST)に変換してみる
enum Hoge {case bcase a}ASTに変換すると…(使⽤したツール https://swift-ast-explorer.com)
この⼆つを並び替えるコードを書いたらいけそう🧐
SwiftSyntaxを少し学ぶ
SyntaxRewriter• 構⽂⽊を書き換えることができる• descriptionプロパティで書き換えたSwiftコードを出⼒できる⚠ 本スライドのSwiftSyntaxはmainブランチを指定して使⽤しています。最新バージョンとは書き⽅が違うのでご了承ください。
この2つが対応している。つまり、コード内にEnumがあった場合、このvisitメソッドが呼び出される。
それぞれの対応関係はこんな感じで、node.with(_:_:)で⼦ノードの値を書き換えることができる。
membersを空のListに置き換えた!これでcaseがないenumができるはず実際にEnumEmptyRewriterを動かしてみよう!
ソースコードを構⽂⽊に変換して
SyntaxRewriterを使って構⽂⽊を書き換える
構⽂⽊からSwiftのコードに変換し、出⼒
実⾏すると…
期待通りの出⼒になった
enumのcaseをアルファベット順に並び替える
実⾏すると…let `enum` ="""enum E1 {case bcase a}"""let syntax = Parser.parse(source: `enum`)let formatted = EnumRewriter().visit(syntax)print(formatted.description)
並び変わった!!
enum E1 {case bcase acase jcase hcase icase ecase dcase gcase fcase c}別のenumでもちゃんと並びかわる!
ただ、、enum E1 {case b, a, j, h, i, e, d}このenumには⾮対応
https://github.com/Ryu0118/Sorterそれにも対応したコードがこちらにあるので、よかったらStar押してください!!
ご清聴ありがとうございました!!