自作scalafix ruleの説明その2

以前書いてから増えた分の解説。

xuwei-k.hatenablog.com

以前と同様、特に記述がないものは全部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に書き換える