diff --git a/scalafix/input/src/main/scala/fix/Usability.scala b/scalafix/input/src/main/scala/fix/Usability.scala new file mode 100644 index 0000000000..d3cb2e1d76 --- /dev/null +++ b/scalafix/input/src/main/scala/fix/Usability.scala @@ -0,0 +1,16 @@ +/* +rule = v1 + */ +package fix + +import cats.effect.IO +import fs2._ +import scala.concurrent.ExecutionContext.Implicits.global + +trait Usability { + def s: Stream[IO, String] + + val observe1 = s.observe1(_ => IO.unit) + val join = Stream.emit(s).join(1) + val joinUnbounded = Stream.emit(s).joinUnbounded +} diff --git a/scalafix/output/src/main/scala/fix/Usability.scala b/scalafix/output/src/main/scala/fix/Usability.scala new file mode 100644 index 0000000000..76c26e01c2 --- /dev/null +++ b/scalafix/output/src/main/scala/fix/Usability.scala @@ -0,0 +1,14 @@ +package fix + +import cats.effect.IO +import fs2._ +import scala.concurrent.ExecutionContext.Implicits.global + +trait Usability { + def s: Stream[IO, String] + + val observe1 = s.evalTap(_ => IO.unit) + val join = Stream.emit(s).parJoin(1) + val joinUnbounded = Stream.emit(s).parJoinUnbounded +} + diff --git a/scalafix/rules/src/main/scala/fix/v1.scala b/scalafix/rules/src/main/scala/fix/v1.scala index 40649214a0..efc866fe2e 100644 --- a/scalafix/rules/src/main/scala/fix/v1.scala +++ b/scalafix/rules/src/main/scala/fix/v1.scala @@ -8,7 +8,7 @@ import fixUtils._ class v1 extends SemanticRule("v1") { override def fix(implicit doc: SemanticDocument): Patch = (StreamAppRules(doc.tree) ++ SchedulerRules(doc.tree) ++ BracketRules(doc.tree) ++ ConcurrentDataTypesRules( - doc.tree) ++ ChunkRules(doc.tree)).asPatch + doc.tree) ++ ChunkRules(doc.tree) ++ UsabilityRenameRules(doc.tree)).asPatch } object fixUtils { @@ -492,4 +492,21 @@ object ChunkRules { val pullOutputMatcher = SymbolMatcher.normalized("fs2/Pull#outputChunk.") val segmentMatcher = SymbolMatcher.normalized("fs2/Segment.") +} + +object UsabilityRenameRules { + def apply(t: Tree)(implicit doc: SemanticDocument): List[Patch] = + t.collect { + case t @ observeMatcher(_: Term.Name) => + Patch.replaceTree(t, "evalTap") + case t @ joinMatcher(_: Term.Name) => + Patch.replaceTree(t, "parJoin") + case t @ joinUnboundedMatcher(_: Term.Name) => + Patch.replaceTree(t, "parJoinUnbounded") + } + + val observeMatcher = SymbolMatcher.normalized("fs2/Stream.InvariantOps#observe1.") + val joinMatcher = SymbolMatcher.normalized("fs2/Stream.PureOps#join.") + val joinUnboundedMatcher = SymbolMatcher.normalized("fs2/Stream.PureOps#joinUnbounded.") + } \ No newline at end of file