-
Notifications
You must be signed in to change notification settings - Fork 186
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Support dynamic loading of rewrites from uri. (#90)
This commit adds support to load rewrites using different protocols - file:path/to/rewrite.scala - https://github.com/... - scala:fully.qualified.Name We use the scala.reflect toolbox to compile and load rewrites from code. We instrument the code to make it compile with scala.reflect Toolbox.
- Loading branch information
Showing
14 changed files
with
226 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
49 changes: 49 additions & 0 deletions
49
core/src/main/scala/scalafix/util/RewriteInstrumentation.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
package scalafix.util | ||
|
||
import scala.meta._ | ||
import scala.collection.immutable.Seq | ||
import scalafix.util.TreeExtractors._ | ||
|
||
object RewriteInstrumentation { | ||
|
||
// removes syntax that is not supported by toolbox | ||
private def simplify(tree: Tree): Tree = tree.transform { | ||
// packages are not supported by toolbox. | ||
case Source(Seq(Pkg(ref, stats))) => Source(q"import $ref._" +: stats) | ||
case Source(stats) => | ||
Source(stats.flatMap { | ||
case Import(is) => is.map(i => Import(Seq(i))) | ||
case x => Seq(x) | ||
}) | ||
} | ||
|
||
def instrument(code: String): String = { | ||
code.parse[Source] match { | ||
case parsers.Parsed.Success(ast) => | ||
val rewriteName: Seq[String] = ast.collect { | ||
case Defn.Object(_, | ||
name, | ||
Template(_, ctor"Rewrite[$_]" :: _, _, _)) => | ||
name.value | ||
case Defn.Val(_, Pat.Var.Term(name) :: Nil, _, q"Rewrite[$_]($_)") | ||
`:WithParent:` (_: Template) | ||
`:WithParent:` Defn.Object(_, parentName, _) => | ||
s"$parentName.$name" | ||
} | ||
rewriteName match { | ||
case Nil => | ||
sys.error(s"Found no rewrite in code! \n $code") | ||
case _ => | ||
val folded = rewriteName.tail.foldLeft(rewriteName.head)( | ||
_ + ".andThen(" + _ + ")") | ||
val transformed = simplify(ast) | ||
s""" | ||
|${transformed.syntax} | ||
| | ||
|$folded | ||
|""".stripMargin | ||
} | ||
case _ => code | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package scalafix.util | ||
|
||
import scala.collection.immutable.Seq | ||
import scala.collection.mutable | ||
import scala.util.control.NonFatal | ||
import scalafix.rewrite.Rewrite | ||
import scalafix.util.TreeExtractors._ | ||
|
||
object ScalafixToolbox { | ||
import scala.reflect.runtime.universe._ | ||
import scala.tools.reflect.ToolBox | ||
private val tb = runtimeMirror(getClass.getClassLoader).mkToolBox() | ||
private val rewriteCache: mutable.WeakHashMap[String, Any] = | ||
mutable.WeakHashMap.empty | ||
|
||
def getRewrite[T](code: String): Either[Throwable, Rewrite[T]] = | ||
try { | ||
Right( | ||
compile(RewriteInstrumentation.instrument(code)) | ||
.asInstanceOf[Rewrite[T]]) | ||
} catch { | ||
case NonFatal(e) => Left(e) | ||
} | ||
|
||
private def compile(code: String): Any = { | ||
rewriteCache.getOrElseUpdate(code, tb.eval(tb.parse(code))) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package foo.bar { | ||
|
||
import scalafix._ | ||
import scalafix.rewrite._ | ||
import scalafix.util._ | ||
import scalafix.util.TreePatch._ | ||
import scala.collection.immutable.Seq | ||
import scala.meta._ | ||
|
||
case object MyRewrite extends Rewrite[Any] { | ||
def rewrite[T](ctx: RewriteCtx[T]): Seq[Patch] = { | ||
ctx.tree.collect { | ||
case n: scala.meta.Name => Rename(n, Term.Name(n.syntax + "1")) | ||
} | ||
} | ||
} | ||
|
||
case object MyRewrite2 extends Rewrite[Any] { | ||
def rewrite[T](ctx: RewriteCtx[T]): Seq[Patch] = { | ||
Seq( | ||
AddGlobalImport(importer"scala.collection.immutable.Seq") | ||
) | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import scalafix._ | ||
import scalafix.rewrite._ | ||
import scalafix.util._ | ||
import scalafix.util.TreePatch._ | ||
import scala.collection.immutable.Seq | ||
import scala.meta._ | ||
import scalafix.config.ScalafixConfig | ||
|
||
object Rewrites { | ||
val myRewrite = Rewrite[Any] { ctx => | ||
ctx.tree.collect { | ||
case n: scala.meta.Name => Rename(n, Term.Name(n.syntax + "1")) | ||
} | ||
} | ||
|
||
val myRewrite2 = Rewrite[Any] { ctx => | ||
Seq( | ||
AddGlobalImport(importer"scala.collection.immutable.Seq") | ||
) | ||
} | ||
} |
9 changes: 9 additions & 0 deletions
9
scalafix-nsc/src/test/resources/checkSyntax/FileRewrite.source
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
rewrites = [ | ||
"file:rewrites/MyRewrite.scala" | ||
] | ||
<<< NOWRAP basic | ||
object Name | ||
>>> | ||
import scala.collection.immutable.Seq | ||
object Name1 | ||
|
9 changes: 9 additions & 0 deletions
9
scalafix-nsc/src/test/resources/checkSyntax/FileRewrite2.source
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
rewrites = [ | ||
"file:rewrites/MyRewrite2.scala" | ||
] | ||
<<< NOWRAP basic | ||
object Name | ||
>>> | ||
import scala.collection.immutable.Seq | ||
object Name1 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
scalafix-nsc/src/test/resources/checkSyntax/UrlRewrite.source
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
rewrites = [ | ||
"https://gist.githubusercontent.com/olafurpg/2a4b1ee14c831fb7cab556b4b471c976/raw/e42891cd705eed6b1411b92a71f9f4f4a399a4f1/MyRewrite.scala" | ||
] | ||
<<< NOWRAP basic | ||
object Name | ||
>>> | ||
object Name1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters