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:
Martin Duhem 2014-03-19 20:57:20 +01:00
parent 133ba07eb8
commit 04e226bd59
7 changed files with 69 additions and 5 deletions

View File

@ -0,0 +1,5 @@
package macro
object Client {
Provider.printTree(Provider.printTree(Foo.str))
}

View File

@ -0,0 +1,5 @@
package macro
object Foo {
def str: String = "abc"
}

View File

@ -0,0 +1,3 @@
package macro
object Foo {
}

View File

@ -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)
}
}

View File

@ -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
)
}

View File

@ -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

View File

@ -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