Scala fukuoka 2019 LT
Quickintroduction toscalafixScala福岡 2019
View Slide
About me- 谷口 力斗 / @tanishiking- 株式会社はてな- Scala / TypeScript / Go / Perl- 高校生までは福岡に住んでました
Scalafix- https://scalacenter.github.io/scalafix/- Refactoring and linting tool for Scala- scala.meta- Builtin Rules / Suppressing Rules- Linter- 独自ルールを作ろう
Scala.meta
Scala.meta- https://scalameta.org/- Scala compiler とは独立した Scala プログラム解析のためのライブラリ- Syntactic API- Semantic API
Scala.meta - Syntactic API- Scalaプログラムをパースしトークン列や構文木を返すAPIprintln("function(argument)".parse[Stat].get.structure)// Term.Apply(Term.Name("function"),List(Term.Name("argument")))
Scala.meta - Semantic API- 型情報やシンボルの情報を提供するAPI- compiler plugin を使って typer phase の後にSemanticDB を生成- SemanticDB- protobuf で定められたスキーマに従ってシリアライズされたバイナリ
Builtin Rules /SupressingRules
Builtin Rules- https://scalacenter.github.io/scalafix/docs/rules/overview.html// .scalafix.confrules = [DisableSyntax,RemoveUnused]
Suppressing Rules@SuppressWarnings(Array("all"))def foo = ???List("", null) // scalafix: ok// scalafix: offfoo(null)// scalafix: on
Linter
Linter- v0.5 から linter としての機能が豊富に- 将来的に metals (scala.meta ベースのLanguage Server 実装) から scalafix を使ったrefactoring や lint の提供も
Lint (vs wartremover)- (+) Lintに加えて自動修正もできる- (+) syntactic rulesの実行にコンパイルは不要なので高速- (+) 独自ルールの実装が容易(wart実装も難しくないけど)- (-) Builtin rule が少ない- (-) scala compiler と比べて SemanticDB から取得できる情報は制限される
独自ルールを作ろう
独自ルールを作ろうhttps://scalacenter.github.io/scalafix/docs/developers/setup.html
独自ルールを作ろう - 作ってみたhttps://github.com/tanishiking/scalafix-check-scaladoc- publicなAPIにscaladocが書かれてなかったら怒ってくれるルール- golintとかにあるやつ
まとめ- scalafix は refactoring ツールとしてだけでなくlinter としても使える- scala.metaのAPIを使って簡単に独自ルールが作れる