$30 off During Our Annual Pro Sale. View Details »

Quick introduction to scalafix

Quick introduction to scalafix

Scala fukuoka 2019 LT

Rikito Taniguchi

January 19, 2019
Tweet

More Decks by Rikito Taniguchi

Other Decks in Technology

Transcript

  1. Quick
    introduction to
    scalafix
    Scala福岡 2019

    View Slide

  2. About me
    - 谷口 力斗 / @tanishiking
    - 株式会社はてな
    - Scala / TypeScript / Go / Perl
    - 高校生までは福岡に住んでました

    View Slide

  3. Scalafix
    - https://scalacenter.github.io/scalafix/
    - Refactoring and linting tool for Scala
    - scala.meta
    - Builtin Rules / Suppressing Rules
    - Linter
    - 独自ルールを作ろう

    View Slide

  4. Scala.meta

    View Slide

  5. Scala.meta
    - https://scalameta.org/
    - Scala compiler とは独立した Scala プログラム
    解析のためのライブラリ
    - Syntactic API
    - Semantic API

    View Slide

  6. Scala.meta - Syntactic API
    - Scalaプログラムをパースしトークン列や構文木
    を返すAPI
    println("function(argument)".parse[Stat].get.struct
    ure)
    // Term.Apply(Term.Name("function"),
    List(Term.Name("argument")))

    View Slide

  7. Scala.meta - Semantic API
    - 型情報やシンボルの情報を提供するAPI
    - compiler plugin を使って typer phase の後に
    SemanticDB を生成
    - SemanticDB
    - protobuf で定められたスキーマに従ってシリ
    アライズされたバイナリ

    View Slide

  8. Builtin Rules /
    Supressing
    Rules

    View Slide

  9. Builtin Rules
    - https://scalacenter.github.io/scalafix/docs/rul
    es/overview.html
    // .scalafix.conf
    rules = [
    DisableSyntax,
    RemoveUnused
    ]

    View Slide

  10. Suppressing Rules
    @SuppressWarnings(Array("all"))
    def foo = ???
    List("", null) // scalafix: ok
    // scalafix: off
    foo(null)
    // scalafix: on

    View Slide

  11. Linter

    View Slide

  12. Linter
    - v0.5 から linter としての機能が豊富に
    - 将来的に metals (scala.meta ベースの
    Language Server 実装) から scalafix を使った
    refactoring や lint の提供も

    View Slide

  13. Lint (vs wartremover)
    - (+) Lintに加えて自動修正もできる
    - (+) syntactic rulesの実行にコンパイルは不要
    なので高速
    - (+) 独自ルールの実装が容易(wart実装も難しくないけど)
    - (-) Builtin rule が少ない
    - (-) scala compiler と比べて SemanticDB から取
    得できる情報は制限される

    View Slide

  14. 独自ルールを
    作ろう

    View Slide

  15. 独自ルールを作ろう
    https://scalacenter.git
    hub.io/scalafix/docs/d
    evelopers/setup.html

    View Slide

  16. 独自ルールを作ろう - 作ってみた
    https://github.com/tanishiking/scalafix-check-scaladoc
    - publicなAPIにscaladocが書かれてなかったら
    怒ってくれるルール
    - golintとかにあるやつ

    View Slide

  17. まとめ
    - scalafix は refactoring ツールとしてだけでなく
    linter としても使える
    - scala.metaのAPIを使って簡単に独自ルールが
    作れる

    View Slide