mirror of https://github.com/sbt/sbt.git
Add scripted test for nested macros
Add test analogous to source-dependencies/macro-arg-dep but check if dependencies of nested macro applications are handled properly. Nested macro applications are tricky because we have to look into original (before macro expansion) trees recursively. This test verifies that.
This commit is contained in:
parent
133ba07eb8
commit
04e226bd59
|
|
@ -0,0 +1,5 @@
|
|||
package macro
|
||||
|
||||
object Client {
|
||||
Provider.printTree(Provider.printTree(Foo.str))
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
package macro
|
||||
|
||||
object Foo {
|
||||
def str: String = "abc"
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
package macro
|
||||
object Foo {
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package macro
|
||||
import scala.language.experimental.macros
|
||||
import scala.reflect.macros._
|
||||
|
||||
object Provider {
|
||||
def printTree(arg: Any) = macro printTreeImpl
|
||||
def printTreeImpl(c: Context)(arg: c.Expr[Any]): c.Expr[String] = {
|
||||
val argStr = arg.tree.toString
|
||||
val literalStr = c.universe.Literal(c.universe.Constant(argStr))
|
||||
c.Expr[String](literalStr)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
import sbt._
|
||||
import Keys._
|
||||
|
||||
object build extends Build {
|
||||
val defaultSettings = Seq(
|
||||
libraryDependencies <+= scalaVersion("org.scala-lang" % "scala-reflect" % _ ),
|
||||
incOptions := incOptions.value.withNameHashing(true)
|
||||
)
|
||||
|
||||
lazy val root = Project(
|
||||
base = file("."),
|
||||
id = "macro",
|
||||
aggregate = Seq(macroProvider, macroClient),
|
||||
settings = Defaults.defaultSettings ++ defaultSettings
|
||||
)
|
||||
|
||||
lazy val macroProvider = Project(
|
||||
base = file("macro-provider"),
|
||||
id = "macro-provider",
|
||||
settings = Defaults.defaultSettings ++ defaultSettings
|
||||
)
|
||||
|
||||
lazy val macroClient = Project(
|
||||
base = file("macro-client"),
|
||||
id = "macro-client",
|
||||
dependencies = Seq(macroProvider),
|
||||
settings = Defaults.defaultSettings ++ defaultSettings
|
||||
)
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
> compile
|
||||
|
||||
# remove `Foo.str` which is an argument to a macro
|
||||
# (this macro itself that is an argument to another macro)
|
||||
$ copy-file macro-client/changes/Foo.scala macro-client/Foo.scala
|
||||
|
||||
# we should recompile Foo.scala first and then fail to compile Client.scala due to missing
|
||||
# `Foo.str`
|
||||
-> macro-client/compile
|
||||
|
||||
> clean
|
||||
|
||||
-> compile
|
||||
|
|
@ -1,13 +1,10 @@
|
|||
> compile
|
||||
|
||||
# remove `Foo.str` which is an argument to a macro that incremental compiler doesn't see in
|
||||
# Client.scala because macro has been already expanded
|
||||
|
||||
# remove `Foo.str` which is an argument to a macro
|
||||
$ copy-file macro-client/changes/Foo.scala macro-client/Foo.scala
|
||||
|
||||
# we should recompile Foo.scala first and then fail to compile Client.scala due to missing
|
||||
# `Foo.str`; however recompilation of Client.scala is never triggered due to missing
|
||||
# dependency
|
||||
# `Foo.str`
|
||||
-> macro-client/compile
|
||||
|
||||
> clean
|
||||
|
|
|
|||
Loading…
Reference in New Issue