Slide 1

Slide 1 text

Quick introduction to scalafix Scala福岡 2019

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Scala.meta

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Builtin Rules / Supressing Rules

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Linter

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

独自ルールを 作ろう

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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