Skip to content

Instantly share code, notes, and snippets.

@eed3si9n
Last active May 31, 2023 05:03
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save eed3si9n/57e83f5330592d968ce49f0d5030d4d5 to your computer and use it in GitHub Desktop.
Save eed3si9n/57e83f5330592d968ce49f0d5030d4d5 to your computer and use it in GitHub Desktop.
package sbt
package internal
package fix
import scalafix.v1._
import scala.meta._
class Sbt0_13BuildSyntax extends SyntacticRule("Sbt0_13BuildSyntax") {
override def fix(implicit doc: SyntacticDocument): Patch = {
doc.tree.collect {
case t: Term.ApplyInfix if t.op.value == "in" && t.lhs.toString != "project" =>
slashify(t, t.lhs, t.args)
case t @ Term.Apply(Term.Select(qual, Term.Name("in")), args) if qual.toString != "project" =>
slashify(t, qual, args)
}.asPatch
}
def slashify(t: Tree, lhs: Term, args: Seq[Term]): Patch =
args match {
case List(arg0) =>
Patch.replaceTree(t, s"($arg0 / $lhs)")
case List(arg0, arg1) =>
Patch.replaceTree(t, s"($arg0 / $arg1 / $lhs)")
case List(arg0, arg1, arg2) =>
Patch.replaceTree(t, s"($arg0 / $arg1 / $arg2 / $lhs)")
case _ => Patch.empty
}
}
@SethTisue
Copy link

The attempt to restrict what forms of in get rewritten didn't work in this example:

-lazy val `play-functional` = crossProject(JVMPlatform, JSPlatform)
-  .crossType(CrossType.Pure)
-  .in(file("play-functional"))
+lazy val `play-functional` = (file("play-functional") / crossProject(JVMPlatform, JSPlatform)
+  .crossType(CrossType.Pure))

no big deal, just something for users to watch out for.

@SethTisue
Copy link

SethTisue commented Apr 13, 2021

Other than that, the only shortcoming I've noticed is that the rewrite often introduces unnecessary parentheses. I have no idea whether Scalafix offers any way of avoiding that.

This rewrite has been super helpful to me in multiple repos. 🙇

@eed3si9n
Copy link
Author

@xuwei-k had an idea of putting parens only at the call site of .value.
https://twitter.com/xuwei_k/status/1361554682276057090

I haven't experimented with that yet.

@kammoh
Copy link

kammoh commented May 12, 2021

Seems it's not handling multiple ins correctly. Code like (dependencyClasspath in Compile in emptySbtPlugin) is incorrectly translated to (emptySbtPlugin / dependencyClasspath in Compile)(Compile / dependencyClasspath)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment