Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SwiftSyntaxが面白い

Ryu
May 22, 2023

 SwiftSyntaxが面白い

Ryu

May 22, 2023
Tweet

More Decks by Ryu

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. SwiftSyntaxを少し学ぶ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  15. 実⾏すると…

    View Slide

  16. 期待通りの出⼒になった

    View Slide

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

    View Slide

  18. View Slide

  19. View Slide

  20. View Slide

  21. View Slide

  22. View Slide

  23. View Slide

  24. View Slide

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

    View Slide

  26. 並び変わった!!

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide