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

Quick introduction to scalafix

Quick introduction to scalafix

Scala fukuoka 2019 LT

9b888a029ae98abd2675b115ff0c4256?s=128

Rikito Taniguchi

January 19, 2019
Tweet

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を使って簡単に独自ルールが

    作れる