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/RetainSrc.scala b/scalafix/input/src/main/scala/fix/RetainSrc.scala new file mode 100644 index 00000000..2ba1ca6c --- /dev/null +++ b/scalafix/input/src/main/scala/fix/RetainSrc.scala @@ -0,0 +1,11 @@ +/* +rule = "scala:fix.Scalacollectioncompat_NewCollections" + */ +package fix + +import scala.collection.mutable.Map + +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/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/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 diff --git a/scalafix/rules/src/main/scala/fix/Scalacollectioncompat_NewCollections.scala b/scalafix/rules/src/main/scala/fix/Scalacollectioncompat_NewCollections.scala index 7d2cc087..8f660cb8 100644 --- a/scalafix/rules/src/main/scala/fix/Scalacollectioncompat_NewCollections.scala +++ b/scalafix/rules/src/main/scala/fix/Scalacollectioncompat_NewCollections.scala @@ -30,6 +30,28 @@ 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 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) = ctx.tree.collect { case iterator(t: Name) => @@ -110,6 +132,7 @@ case class Scalacollectioncompat_NewCollections(index: SemanticdbIndex) replaceSymbols(ctx) + replaceTupleZipped(ctx) + replaceCopyToBuffer(ctx) + - replaceStreamAppend(ctx) + replaceStreamAppend(ctx) + + replaceMutableMap(ctx) } }