diff --git a/build.sbt b/build.sbt index b18aa1cb9..8ccbd4adb 100644 --- a/build.sbt +++ b/build.sbt @@ -369,7 +369,7 @@ def CiCommand(name: String)(commands: List[String]): Command = case (state, command) => command :: state } } -def ci(command: String) = s"plz ${ciScalaVersion.get} $command" +def ci(command: String) = s"plz ${ciScalaVersion.getOrElse("No CI_SCALA_VERSION defined")} $command" lazy val compilerOptions = Seq( "-deprecation", diff --git a/readme/Rewrites.scalatex b/readme/Rewrites.scalatex index ea0a9dae9..1b9df82b8 100644 --- a/readme/Rewrites.scalatex +++ b/readme/Rewrites.scalatex @@ -139,6 +139,16 @@ Such members already have a return type of @code{Unit} and sometimes this is unexpected. Adding an explicit return type makes it more obvious. + @sect(DottyVarArgPattern.toString) + @p + Replaces @code{@@} symbols in VarArg patterns with a colon (@code{:}). See @lnk{http://dotty.epfl.ch/docs/reference/changed/vararg-patterns.html} + + @hl.scala + // before + case List(1, 2, xs @@ _*) + // after + case List(1, 2, xs : _*) + @sect(NoAutoTupling.toString) @p Adds explicit tuples around argument lists where auto-tupling is occurring. diff --git a/scalafix-core/src/main/scala/scalafix/rewrite/DottyVarArgPattern.scala b/scalafix-core/src/main/scala/scalafix/rewrite/DottyVarArgPattern.scala new file mode 100644 index 000000000..0c77a6c8e --- /dev/null +++ b/scalafix-core/src/main/scala/scalafix/rewrite/DottyVarArgPattern.scala @@ -0,0 +1,20 @@ +package scalafix.rewrite + +import scala.meta._ + +import scala.meta.tokens.Token +import scalafix.Patch + +case object DottyVarArgPattern extends Rewrite { + override def rewrite(ctx: RewriteCtx): Patch = { + val patches = ctx.tree.collect { + case bind @ Pat.Bind(_, Pat.Arg.SeqWildcard()) => + ctx.tokenList.leading(bind.tokens.last).collectFirst { + case tok @ Token.At() => + ctx.replaceToken(tok, ":") + }.asPatch + } + patches.asPatch + } + +} diff --git a/scalafix-core/src/main/scala/scalafix/rewrite/ScalafixRewrites.scala b/scalafix-core/src/main/scala/scalafix/rewrite/ScalafixRewrites.scala index dc7d02dd3..ea2344ee9 100644 --- a/scalafix-core/src/main/scala/scalafix/rewrite/ScalafixRewrites.scala +++ b/scalafix-core/src/main/scala/scalafix/rewrite/ScalafixRewrites.scala @@ -8,7 +8,8 @@ object ScalafixRewrites { VolatileLazyVal, RemoveXmlLiterals, ExplicitUnit, - NoValInForComprehension + NoValInForComprehension, + DottyVarArgPattern ) def semantic(mirror: Mirror): List[Rewrite] = List( ExplicitReturnTypes(mirror), diff --git a/scalafix-tests/input/src/main/scala/test/DottyVarArgPattern.scala b/scalafix-tests/input/src/main/scala/test/DottyVarArgPattern.scala new file mode 100644 index 000000000..5aded0e4e --- /dev/null +++ b/scalafix-tests/input/src/main/scala/test/DottyVarArgPattern.scala @@ -0,0 +1,12 @@ +/* +rewrites = DottyVarArgPattern + */ +package test + +object DottyVarArgPattern { + List(1, 2, 3, 4) match { + case List(1, 2, xs @ _*) => + } + + val List(1, 2, x @ _*) = List(1, 2, 3, 4) +} diff --git a/scalafix-tests/output-dotty/src/main/scala/test/DottyVarArgPattern.scala b/scalafix-tests/output-dotty/src/main/scala/test/DottyVarArgPattern.scala new file mode 100644 index 000000000..e630ada25 --- /dev/null +++ b/scalafix-tests/output-dotty/src/main/scala/test/DottyVarArgPattern.scala @@ -0,0 +1,9 @@ +package test + +object DottyVarArgPattern { + List(1, 2, 3, 4) match { + case List(1, 2, xs : _*) => + } + + val List(1, 2, x : _*) = List(1, 2, 3, 4) +}