From 284ca713c21c2860713a78304bcf51689ac1fee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillaume=20Mass=C3=A9?= Date: Mon, 11 Jun 2018 12:02:22 +0200 Subject: [PATCH 1/3] Bump scalafix to the latest version --- scalafix/project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scalafix/project/plugins.sbt b/scalafix/project/plugins.sbt index b23cfd7c..0fd7a907 100644 --- a/scalafix/project/plugins.sbt +++ b/scalafix/project/plugins.sbt @@ -1,3 +1,3 @@ -addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.5.7") +addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.5.10") addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.0") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.6.1") \ No newline at end of file From e738da5c83437a8b078ee17697e81c0718a25a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillaume=20Mass=C3=A9?= Date: Mon, 11 Jun 2018 12:02:44 +0200 Subject: [PATCH 2/3] Rewrite `retain` to `filterInPlace` (fix scala/collection-strawman #556) --- scalafix/build.sbt | 3 ++- .../input/src/main/scala/fix/MethodRenames.scala | 10 ++++++++++ .../output/src/main/scala/fix/MethodRenames.scala | 7 +++++++ .../fix/Scalacollectioncompat_NewCollections.scala | 14 +++++++++++++- 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 scalafix/input/src/main/scala/fix/MethodRenames.scala create mode 100644 scalafix/output/src/main/scala/fix/MethodRenames.scala diff --git a/scalafix/build.sbt b/scalafix/build.sbt index f091f184..5cf2d509 100644 --- a/scalafix/build.sbt +++ b/scalafix/build.sbt @@ -37,7 +37,8 @@ lazy val tests = project sourceDirectory.in(output, Compile).value, "inputClassdirectory" -> classDirectory.in(input, Compile).value - ) + ), + test in Test := (test in Test).dependsOn(compile in (output, Compile)).value ) .dependsOn(input, rules) .enablePlugins(BuildInfoPlugin) diff --git a/scalafix/input/src/main/scala/fix/MethodRenames.scala b/scalafix/input/src/main/scala/fix/MethodRenames.scala new file mode 100644 index 00000000..a60f2e30 --- /dev/null +++ b/scalafix/input/src/main/scala/fix/MethodRenames.scala @@ -0,0 +1,10 @@ +/* +rule = "scala:fix.Scalacollectioncompat_NewCollections" + */ +package fix + +import scala.collection.mutable.Map + +object MethodRenames { + Map(1 -> 1).retain{ case (x, y) => true } +} \ No newline at end of file diff --git a/scalafix/output/src/main/scala/fix/MethodRenames.scala b/scalafix/output/src/main/scala/fix/MethodRenames.scala new file mode 100644 index 00000000..3c1c923f --- /dev/null +++ b/scalafix/output/src/main/scala/fix/MethodRenames.scala @@ -0,0 +1,7 @@ +package fix + +import scala.collection.mutable.Map + +object MethodRenames { + Map(1 -> 1).filterInPlace{ case (x, y) => true } +} \ No newline at end of file diff --git a/scalafix/rules/src/main/scala/fix/Scalacollectioncompat_NewCollections.scala b/scalafix/rules/src/main/scala/fix/Scalacollectioncompat_NewCollections.scala index 7d2cc087..ccd6f730 100644 --- a/scalafix/rules/src/main/scala/fix/Scalacollectioncompat_NewCollections.scala +++ b/scalafix/rules/src/main/scala/fix/Scalacollectioncompat_NewCollections.scala @@ -30,6 +30,17 @@ case class Scalacollectioncompat_NewCollections(index: SemanticdbIndex) Symbol("_root_.scala.runtime.Tuple3Zipped.Ops.zipped.") ) + val retain = + SymbolMatcher.normalized( + Symbol("_root_.scala.collection.mutable.MapLike.retain.") + ) + + def replaceMutableMap(ctx: RuleCtx) = + ctx.tree.collect { + case retain(t: Name) => + ctx.replaceTree(t, "filterInPlace") + }.asPatch + def replaceToList(ctx: RuleCtx) = ctx.tree.collect { case iterator(t: Name) => @@ -110,6 +121,7 @@ case class Scalacollectioncompat_NewCollections(index: SemanticdbIndex) replaceSymbols(ctx) + replaceTupleZipped(ctx) + replaceCopyToBuffer(ctx) + - replaceStreamAppend(ctx) + replaceStreamAppend(ctx) + + replaceMutableMap(ctx) } } From 58c6f7ce06e1ceeacaedd1f038238fde6efd2d0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillaume=20Mass=C3=A9?= Date: Mon, 11 Jun 2018 14:53:47 +0200 Subject: [PATCH 3/3] Map.retain handle functions and partial functions --- .../fix/{MethodRenames.scala => RetainSrc.scala} | 5 +++-- .../output/src/main/scala/fix/MethodRenames.scala | 7 ------- .../output/src/main/scala/fix/RetainSrc.scala | 8 ++++++++ .../Scalacollectioncompat_NewCollections.scala | 15 +++++++++++++-- 4 files changed, 24 insertions(+), 11 deletions(-) rename scalafix/input/src/main/scala/fix/{MethodRenames.scala => RetainSrc.scala} (52%) delete mode 100644 scalafix/output/src/main/scala/fix/MethodRenames.scala create mode 100644 scalafix/output/src/main/scala/fix/RetainSrc.scala diff --git a/scalafix/input/src/main/scala/fix/MethodRenames.scala b/scalafix/input/src/main/scala/fix/RetainSrc.scala similarity index 52% rename from scalafix/input/src/main/scala/fix/MethodRenames.scala rename to scalafix/input/src/main/scala/fix/RetainSrc.scala index a60f2e30..2ba1ca6c 100644 --- a/scalafix/input/src/main/scala/fix/MethodRenames.scala +++ b/scalafix/input/src/main/scala/fix/RetainSrc.scala @@ -5,6 +5,7 @@ package fix import scala.collection.mutable.Map -object MethodRenames { - Map(1 -> 1).retain{ case (x, y) => true } +class MethodRenames(xs: Map[Int, Int]) { + xs.retain((_, _) => true) + xs.retain{case (x, y) => true} } \ No newline at end of file diff --git a/scalafix/output/src/main/scala/fix/MethodRenames.scala b/scalafix/output/src/main/scala/fix/MethodRenames.scala deleted file mode 100644 index 3c1c923f..00000000 --- a/scalafix/output/src/main/scala/fix/MethodRenames.scala +++ /dev/null @@ -1,7 +0,0 @@ -package fix - -import scala.collection.mutable.Map - -object MethodRenames { - Map(1 -> 1).filterInPlace{ case (x, y) => true } -} \ No newline at end of file diff --git a/scalafix/output/src/main/scala/fix/RetainSrc.scala b/scalafix/output/src/main/scala/fix/RetainSrc.scala new file mode 100644 index 00000000..950570c6 --- /dev/null +++ b/scalafix/output/src/main/scala/fix/RetainSrc.scala @@ -0,0 +1,8 @@ +package fix + +import scala.collection.mutable.Map + +class MethodRenames(xs: Map[Int, Int]) { + xs.filterInPlace{case (_, _) => true} + xs.filterInPlace{case (x, y) => true} +} \ No newline at end of file diff --git a/scalafix/rules/src/main/scala/fix/Scalacollectioncompat_NewCollections.scala b/scalafix/rules/src/main/scala/fix/Scalacollectioncompat_NewCollections.scala index ccd6f730..8f660cb8 100644 --- a/scalafix/rules/src/main/scala/fix/Scalacollectioncompat_NewCollections.scala +++ b/scalafix/rules/src/main/scala/fix/Scalacollectioncompat_NewCollections.scala @@ -37,8 +37,19 @@ case class Scalacollectioncompat_NewCollections(index: SemanticdbIndex) def replaceMutableMap(ctx: RuleCtx) = ctx.tree.collect { - case retain(t: Name) => - ctx.replaceTree(t, "filterInPlace") + case Term.Apply(Term.Select(_, retain(n: Name)), List(_: Term.PartialFunction)) => + ctx.replaceTree(n, "filterInPlace") + + case Term.Apply(Term.Select(_, retain(n: Name)), List(_: Term.Function)) => + (for { + name <- n.tokens.lastOption + open <- ctx.tokenList.find(name)(t => t.is[Token.LeftParen]) + close <- ctx.matchingParens.close(open.asInstanceOf[Token.LeftParen]) + } yield + ctx.replaceToken(open, "{case ") + + ctx.replaceToken(close, "}") + + ctx.replaceTree(n, "filterInPlace") + ).asPatch }.asPatch def replaceToList(ctx: RuleCtx) =