以前書いてから増えた分の解説。
以前と同様、特に記述がないものは全部SyntacticRuleなので、100%正しく書き換えや警告出せる保証がないです。
AddLambdaParamParentheses
Scala 3からlambdaの引数の括弧が実質必須になるので、括弧を付与する。 以前は警告するものだけ作ったが、書き換えも作った。
{ a: Int => a + 2 }
を
{ (a: Int) => a + 2 }
CollectHead
collect(f).head
を
collectFirst(f).get
に書き換え
CollectHeadOption
collect(f).headOption
を
collectFirst(f)
に書き換え
FlatTraverse
seq.traverse(f).map(_.flatten)
を
seq.flatTraverse(f)
に書き換え
flatTraverseはtypelevel/catsのメソッド
ImplicitValueClass
implicit classがvalue classに変更可能かどうか?を判断して、可能な場合に extends AnyVal
を付与。
必要に応じて private val
も付与
KindProjector
https://github.com/lampepfl/dotty-feature-requests/issues/117
Scala 3で -Ykind-projector
付与してkind-projectorの形式でinfix(中置記法)が未サポートなので、infix使わない形に書き換え。
例:
Functor[String Either *]
を
Functor[Either[String, *]]
に書き換え
MapDistinctSize
map(f).distinct.size
を
distinctBy(f).size
に書き換え。
sizeIs, length, lengthIsも同様に書き換える。 Scala 2.12にはdistinctByがないので注意
https://github.com/scala/scala-collection-compat/issues/543
MapSequenceTraverse
seq.map(f).sequence
を
seq.traverse(f)
に書き換え。 catsやscalazを想定。 名前だけの雑な判断で書き換えるので、割と壊れることがある
OptionMapFlatMap
x match { case Some(y) => f(y) case None => None
というようなパターンは、mapやflatMapで書き換え可能はなず?なので、警告出す
OptionMatchToRight
opt match { case Some(x) => Right(x) case None => Left("error") }
を
opt.toRight("error")
に書き換え
RemoveStringInterpolation
変数を埋め込んでいない String Interpolation を、String literalに書き換え
s"aaa bbb"
を
"aaa bbb"
に書き換え( s
を消すだけ)
ReplaceFill
(1 to 10).map(_ => Random.nextInt())
というような、Rangeを使う必要ないものを
Seq.fill(10)(Random.nextInt())
に書き換え
SyntacticOrganizeImports
SemanticRuleが遅いので、 Syntacticで雑に、トップレベルのimportが
- sortされてるか?(現状、アルファベット順で決め打ち)
- importの間に空行がないか?
を検査して警告出す
https://github.com/liancheng/scalafix-organize-imports
UnnecessaryCase
{ case a => // 省略
のように、パターンマッチも何もしてなくて case
が必要なさそうな場合に case
を消す
UnnecessaryMatch
seq.map { a => a match { case // 省略 } }
というように、Functionの中身のトップレベル?ですぐmatchしていたら、match消せるので、それを書き換え
seq.map { case // 省略 }
UnusedTypeParams
メソッドに、未使用な型引数があったら警告出す
WithFilter
map, flatMap, foreachの前にfilterを呼び出していたらwithFilterに書き換える