trait Importer extends AnyRef
This trait provides support for importers, a facility to migrate reflection artifacts between universes. Note: this trait should typically be used only rarely.
Reflection artifacts, such as Symbols and Types,
are contained in Universes. Typically all processing happens
within a single Universe
(e.g. a compile-time macro Universe
or a runtime reflection Universe
), but sometimes
there is a need to migrate artifacts from one Universe
to another. For example, runtime compilation works by
importing runtime reflection trees into a runtime compiler universe, compiling the importees and exporting the
result back.
Reflection artifacts are firmly grounded in their Universe
s, which is reflected by the fact that types of artifacts
from different universes are not compatible. By using Importer
s, however, they be imported from one universe
into another. For example, to import foo.bar.Baz
from the source Universe
to the target Universe
,
an importer will first check whether the entire owner chain exists in the target Universe
.
If it does, then nothing else will be done. Otherwise, the importer will recreate the entire owner chain
and will import the corresponding type signatures into the target Universe
.
Since importers match Symbol
tables of the source and the target Universe
s using plain string names,
it is programmer's responsibility to make sure that imports don't distort semantics, e.g., that
foo.bar.Baz
in the source Universe
means the same that foo.bar.Baz
does in the target Universe
.
Example
Here's how one might implement a macro that performs compile-time evaluation of its argument by using a runtime compiler to compile and evaluate a tree that belongs to a compile-time compiler:
def staticEval[T](x: T) = macro staticEval[T] def staticEval[T](c: scala.reflect.macros.blackbox.Context)(x: c.Expr[T]) = { // creates a runtime reflection universe to host runtime compilation import scala.reflect.runtime.{universe => ru} val mirror = ru.runtimeMirror(c.libraryClassLoader) import scala.tools.reflect.ToolBox val toolBox = mirror.mkToolBox() // runtime reflection universe and compile-time macro universe are different // therefore an importer is needed to bridge them // currently mkImporter requires a cast to correctly assign the path-dependent types val importer0 = ru.internal.mkImporter(c.universe) val importer = importer0.asInstanceOf[ru.internal.Importer { val from: c.universe.type }] // the created importer is used to turn a compiler tree into a runtime compiler tree // both compilers use the same classpath, so semantics remains intact val imported = importer.importTree(tree) // after the tree is imported, it can be evaluated as usual val tree = toolBox.untypecheck(imported.duplicate) val valueOfX = toolBox.eval(imported).asInstanceOf[T] ... }
- Source
- Internals.scala
- Alphabetic
- By Inheritance
- Importer
- AnyRef
- Any
- by any2stringadd
- by StringFormat
- by Ensuring
- by ArrowAssoc
- Hide All
- Show All
- Public
- Protected
Abstract Value Members
- abstract val from: Universe
The source universe of reflection artifacts that will be processed.
The source universe of reflection artifacts that will be processed. The target universe is universe that created this importer with
mkImporter
. - abstract def importPosition(pos: Universe.Position): Universe.Position
In the current universe, creates a position that corresponds to the provided position in the source universe.
- abstract def importSymbol(sym: Universe.Symbol): Universe.Symbol
In the current universe, locates or creates a symbol that corresponds to the provided symbol in the source universe.
In the current universe, locates or creates a symbol that corresponds to the provided symbol in the source universe. If necessary imports the owner chain, companions, type signature, annotations and attachments.
- abstract def importTree(tree: Universe.Tree): Universe.Tree
In the current universe, creates a tree that corresponds to the provided tree in the source universe.
In the current universe, creates a tree that corresponds to the provided tree in the source universe. If necessary imports the underlying symbols, types and attachments.
- abstract def importType(tpe: Universe.Type): Universe.Type
In the current universe, locates or creates a type that corresponds to the provided type in the source universe.
In the current universe, locates or creates a type that corresponds to the provided type in the source universe. If necessary imports the underlying symbols, annotations, scopes and trees.
- abstract val reverse: Universe.Importer { val from: Internals.this.type }
An importer that works in reverse direction, namely: imports reflection artifacts from the current universe to the universe specified in
from
.
Concrete Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##(): Int
- Definition Classes
- AnyRef → Any
- def +(other: String): String
- Implicit
- This member is added by an implicit conversion from Universe.Importer toany2stringadd[Universe.Importer] performed by method any2stringadd in scala.Predef.
- Definition Classes
- any2stringadd
- def ->[B](y: B): (Universe.Importer, B)
- Implicit
- This member is added by an implicit conversion from Universe.Importer toArrowAssoc[Universe.Importer] performed by method ArrowAssoc in scala.Predef.
- Definition Classes
- ArrowAssoc
- Annotations
- @inline()
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native()
- def ensuring(cond: (Universe.Importer) => Boolean, msg: => Any): Universe.Importer
- Implicit
- This member is added by an implicit conversion from Universe.Importer toEnsuring[Universe.Importer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
- def ensuring(cond: (Universe.Importer) => Boolean): Universe.Importer
- Implicit
- This member is added by an implicit conversion from Universe.Importer toEnsuring[Universe.Importer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
- def ensuring(cond: Boolean, msg: => Any): Universe.Importer
- Implicit
- This member is added by an implicit conversion from Universe.Importer toEnsuring[Universe.Importer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
- def ensuring(cond: Boolean): Universe.Importer
- Implicit
- This member is added by an implicit conversion from Universe.Importer toEnsuring[Universe.Importer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable])
- def formatted(fmtstr: String): String
- Implicit
- This member is added by an implicit conversion from Universe.Importer toStringFormat[Universe.Importer] performed by method StringFormat in scala.Predef.
- Definition Classes
- StringFormat
- Annotations
- @inline()
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
Deprecated Value Members
- def →[B](y: B): (Universe.Importer, B)
- Implicit
- This member is added by an implicit conversion from Universe.Importer toArrowAssoc[Universe.Importer] performed by method ArrowAssoc in scala.Predef.
- Definition Classes
- ArrowAssoc
- Annotations
- @deprecated
- Deprecated
(Since version 2.13.0) Use
->
instead. If you still wish to display it as one character, consider using a font with programming ligatures such as Fira Code.