diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2012-06-06 14:29:05 +0200 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2012-06-08 15:32:03 +0200 |
commit | 6355d1a0b825c99560d4ccec1a8769f7421b1a71 (patch) | |
tree | 80f448f0da11dcab9cee30f3d8fe867cd66313ed /src/compiler/scala/reflect/runtime/package.scala | |
parent | ce67870e64afabf75363679bcee597812ad223e9 (diff) | |
download | scala-6355d1a0b825c99560d4ccec1a8769f7421b1a71.tar.gz scala-6355d1a0b825c99560d4ccec1a8769f7421b1a71.tar.bz2 scala-6355d1a0b825c99560d4ccec1a8769f7421b1a71.zip |
brings reification up to speed
Along with recovering from reflection refactoring, I implemented
some new features (e.g. rollback of macro expansions),
and did some stabilizing refactorings (e.g. moved mutable state into a ghetto).
Also used the refactoring as a chance to fix free and aux symbols.
Encapsulated this notion in a symbol table class, which allowed me
to address outstanding issues with symbol table inheritance and inlining.
Diffstat (limited to 'src/compiler/scala/reflect/runtime/package.scala')
-rw-r--r-- | src/compiler/scala/reflect/runtime/package.scala | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/compiler/scala/reflect/runtime/package.scala b/src/compiler/scala/reflect/runtime/package.scala index 531873c661..a5809a2629 100644 --- a/src/compiler/scala/reflect/runtime/package.scala +++ b/src/compiler/scala/reflect/runtime/package.scala @@ -9,5 +9,18 @@ package object runtime { // [Eugene++ to Martin] removed `mirrorOfLoader`, because one can use `universe.runtimeMirror` instead - def currentMirror: universe.Mirror = ??? + def currentMirror: universe.Mirror = macro Macros.currentMirror +} + +package runtime { + object Macros { + def currentMirror(c: scala.reflect.makro.Context): c.Expr[universe.Mirror] = { + import c.universe._ + val runtimeClass = c.reifyEnclosingRuntimeClass + if (runtimeClass.isEmpty) c.abort(c.enclosingPosition, "call site does not have an enclosing class") + val runtimeUniverse = Select(Select(Select(Ident(newTermName("scala")), newTermName("reflect")), newTermName("runtime")), newTermName("universe")) + val currentMirror = Apply(Select(runtimeUniverse, newTermName("runtimeMirror")), List(Select(runtimeClass, newTermName("getClassLoader")))) + c.Expr[Nothing](currentMirror)(c.TypeTag.Nothing) + } + } } |