W3cubDocs

/Scala 2.12 Reflection

Trait scala.reflect.api.Internals.Importer

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 Universes, which is reflected by the fact that types of artifacts from different universes are not compatible. By using Importers, 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 Universes 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
Linear Supertypes

Abstract Value Members

abstract val from: Universe

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

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. 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. 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. If necessary imports the underlying symbols, annotations, scopes and trees.

abstract val reverse: Universe.Importer { val from: Internals.this.type }

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] )

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
@inline()

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

© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.12.9/scala-reflect/scala/reflect/api/Internals$Importer.html