diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2012-08-03 17:13:18 +0200 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2012-08-13 21:03:19 +0200 |
commit | 64138082a4f1bb4c864d85660d350f61c81e7fd7 (patch) | |
tree | 40203e3ddc34b43171b0023ed8b4edef05eecd4a /test | |
parent | 613970af6b6083d55d98bdfeb1a867e5236fcd90 (diff) | |
download | scala-64138082a4f1bb4c864d85660d350f61c81e7fd7.tar.gz scala-64138082a4f1bb4c864d85660d350f61c81e7fd7.tar.bz2 scala-64138082a4f1bb4c864d85660d350f61c81e7fd7.zip |
SI-5940 impls are no longer in macro def pickles
The first officially released version of macros persisted
macro def -> impl bindings across compilation runs using a neat trick.
The right-hand side of macro definition (which contains a reference to an impl)
was typechecked and then put verbatim into an annotation on macro definition.
This solution is very simple, but unfortunately it's also lacking. If we use it
then signatures of macro defs become transitively dependent on scala-reflect.jar
(because they refer to macro impls, and macro impls refer to
scala.reflect.macros.Context defined in scala-reflect.jar).
More details can be found in https://issues.scala-lang.org/browse/SI-5940.
Therefore we have to avoid putting macro impls into binding pickles and
come up with our own serialization format. Situation is further complicated
by the fact that it's not enough to just pickle impl's class and method names,
because macro expansion needs knowledge about the shape of impl's signature
(which we can't pickle). Hence we precompute necessary stuff (e.g. the layout
of type parameters) when compiling macro defs.
Diffstat (limited to 'test')
-rw-r--r-- | test/files/run/t5940.scala | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/test/files/run/t5940.scala b/test/files/run/t5940.scala new file mode 100644 index 0000000000..147ff38256 --- /dev/null +++ b/test/files/run/t5940.scala @@ -0,0 +1,41 @@ +import scala.tools.partest._ + +object Test extends DirectTest { + def code = ??? + + def macros_1 = """ + import scala.reflect.macros.Context + + object Impls { + def impl(c: Context) = c.literalUnit + } + + object Macros { + //import Impls._ + def impl(c: Context) = c.literalUnit + def foo = macro impl + } + """ + def compileMacros() = { + val classpath = List(sys.props("partest.lib"), sys.props("partest.reflect")) mkString sys.props("path.separator") + compileString(newCompiler("-language:experimental.macros", "-cp", classpath, "-d", testOutput.path))(macros_1) + } + + def test_2 = """ + object Test extends App { + println(Macros.foo) + } + """ + def compileTest() = { + val classpath = List(sys.props("partest.lib"), testOutput.path) mkString sys.props("path.separator") + compileString(newCompiler("-cp", classpath, "-d", testOutput.path))(test_2) + } + + def show(): Unit = { + log("Compiling Macros_1...") + if (compileMacros()) { + log("Compiling Test_2...") + if (compileTest()) log("Success!") else log("Failed...") + } + } +}
\ No newline at end of file |