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
- All
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 to any2stringadd[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 to ArrowAssoc[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( ... ) @native()
-
def
ensuring(cond: (Universe.Importer) ⇒ Boolean, msg: ⇒ Any): Universe.Importer
- Implicit
- This member is added by an implicit conversion from Universe.Importer to Ensuring[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 to Ensuring[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 to Ensuring[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 to Ensuring[Universe.Importer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
final
def
getClass(): Class[_]
- 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( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
def
→[B](y: B): (Universe.Importer, B)
- Implicit
- This member is added by an implicit conversion from Universe.Importer to ArrowAssoc[Universe.Importer] performed by method ArrowAssoc in scala.Predef.
- Definition Classes
- ArrowAssoc
Deprecated Value Members
-
def
formatted(fmtstr: String): String
- Implicit
- This member is added by an implicit conversion from Universe.Importer to StringFormat[Universe.Importer] performed by method StringFormat in scala.Predef.
- Definition Classes
- StringFormat
- Annotations
- @deprecated @inline()
- Deprecated
(Since version 2.12.16) Use
formatString.format(value)
instead ofvalue.formatted(formatString)
, or use thef""
string interpolator. In Java 15 and later,formatted
resolves to the new method in String which has reversed parameters.