/
FilterNot.scala
63 lines (60 loc) · 1.5 KB
/
FilterNot.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package fix
import fix.FilterNot._
import scala.meta.Term
import scala.meta.Term.ApplyUnary
import scala.meta.XtensionCollectionLikeUI
import scalafix.Patch
import scalafix.v1.SyntacticDocument
import scalafix.v1.SyntacticRule
import scalafix.v1.XtensionSeqPatch
object FilterNot {
private object FilterValue {
def unapply(t: Term.Name): Option[String] = {
PartialFunction.condOpt(t.value) {
case "filter" =>
"filterNot"
case "filterNot" =>
"filter"
}
}
}
}
class FilterNot extends SyntacticRule("FilterNot") {
override def fix(implicit doc: SyntacticDocument): Patch = {
doc.tree.collect {
case Term.Apply.Initial(
Term.Select(
_,
filter @ FilterValue(inverse)
),
Term.AnonymousFunction(
ApplyUnary(
op @ Term.Name("!"),
_
)
) :: Nil
) =>
Seq(
Patch.replaceTree(filter, inverse),
Patch.removeTokens(op.tokens)
).asPatch
case Term.Apply.Initial(
Term.Select(
_,
filter @ FilterValue(inverse)
),
Term.Function.Initial(
_ :: Nil,
ApplyUnary(
op @ Term.Name("!"),
_
)
) :: Nil
) =>
Seq(
Patch.replaceTree(filter, inverse),
Patch.removeTokens(op.tokens)
).asPatch
}.asPatch
}
}