$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

  2. About me - 谷口 力斗 / @tanishiking - 株式会社はてな -

    Scala / TypeScript / Go / Perl - 高校生までは福岡に住んでました
  3. Scalafix - https://scalacenter.github.io/scalafix/ - Refactoring and linting tool for Scala

    - scala.meta - Builtin Rules / Suppressing Rules - Linter - 独自ルールを作ろう
  4. Scala.meta

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

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

    Term.Apply(Term.Name("function"), List(Term.Name("argument")))
  7. Scala.meta - Semantic API - 型情報やシンボルの情報を提供するAPI - compiler plugin を使って

    typer phase の後に SemanticDB を生成 - SemanticDB - protobuf で定められたスキーマに従ってシリ アライズされたバイナリ
  8. Builtin Rules / Supressing Rules

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

    DisableSyntax, RemoveUnused ]
  10. Suppressing Rules @SuppressWarnings(Array("all")) def foo = ??? List("", null) //

    scalafix: ok // scalafix: off foo(null) // scalafix: on
  11. Linter

  12. Linter - v0.5 から linter としての機能が豊富に - 将来的に metals (scala.meta

    ベースの Language Server 実装) から scalafix を使った refactoring や lint の提供も
  13. Lint (vs wartremover) - (+) Lintに加えて自動修正もできる - (+) syntactic rulesの実行にコンパイルは不要

    なので高速 - (+) 独自ルールの実装が容易(wart実装も難しくないけど) - (-) Builtin rule が少ない - (-) scala compiler と比べて SemanticDB から取 得できる情報は制限される
  14. 独自ルールを 作ろう

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

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

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

    作れる