Packages

class IMain extends Imports with PresentationCompilation with Closeable

An interpreter for Scala code.

The main public entry points are compile(), interpret(), and bind(). The compile() method loads a complete Scala file. The interpret() method executes one line of Scala code at the request of the user. The bind() method binds an object to a variable that can then be used by later interpreted code.

The overall approach is based on compiling the requested code and then using a Java classloader and Java reflection to run the code and access its results.

In more detail, a single compiler instance is used to accumulate all successfully compiled or interpreted Scala code. To "interpret" a line of code, the compiler generates a fresh object that includes the line of code and which has public member(s) to export all variables defined by that code. To extract the result of an interpreted line to show the user, a second "result object" is created which imports the variables exported by the above object and then exports members called "$eval" and "$print". To accommodate user expressions that read from variables or methods defined in previous statements, "import" statements are used.

This interpreter shares the strengths and weaknesses of using the full compiler-to-Java. The main strength is that interpreted code behaves exactly as does compiled code, including running at full speed. The main weakness is that redefining classes and methods is not handled properly, because rebinding at the Java level is technically difficult.

Self Type
IMain
Linear Supertypes
Closeable, AutoCloseable, PresentationCompilation, Imports, AnyRef, Any
Known Subclasses
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. IMain
  2. Closeable
  3. AutoCloseable
  4. PresentationCompilation
  5. Imports
  6. AnyRef
  7. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. All

Instance Constructors

  1. new IMain(initialSettings: Settings)
  2. new IMain(initialSettings: Settings, out: JPrintWriter)

Type Members

  1. abstract class PhaseDependentOps extends AnyRef
  2. class ReadEvalPrint extends AnyRef

    Here is where we:

    Here is where we:

    1) Read some source code, and put it in the "read" object. 2) Evaluate the read object, and put the result in the "eval" object. 3) Create a String for human consumption, and put it in the "print" object.

    Read! Eval! Print! Some of that not yet centralized here.

  3. implicit class ReplTypeOps extends AnyRef
  4. class Request extends AnyRef

    One line of code submitted by the user for interpretation

  5. case class ComputedImports(header: String, prepend: String, append: String, access: String) extends Product with Serializable

    Compute imports that allow definitions from previous requests to be visible in a new request.

    Compute imports that allow definitions from previous requests to be visible in a new request. Returns three or four pieces of related code:

    0. Header code fragment that should go at the beginning of the compilation unit, specifically, import Predef.

    1. An initial code fragment that should go before the code of the new request.

    2. A code fragment that should go after the code of the new request.

    3. An access path which can be traversed to access any bindings inside code wrapped by #1 and #2 .

    The argument is a set of Names that need to be imported.

    Limitations: This method is not as precise as it could be. (1) It does not process wildcard imports to see what exactly they import. (2) If it imports any names from a request, it imports all of them, which is not really necessary. (3) It imports multiple same-named implicits, but only the last one imported is actually usable.

    Definition Classes
    Imports
  6. abstract class PresentationCompileResult extends AnyRef
    Definition Classes
    PresentationCompilation

Value Members

  1. final def !=(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  2. final def ##(): Int
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  4. def addUrlsToClassPath(urls: URL*): Unit

    Adds all specified jars to the compile and runtime classpaths.

    Adds all specified jars to the compile and runtime classpaths.

    urls

    The list of items to add to the compile and runtime classpaths.

    Note

    Currently only supports jars, not directories.

  5. def allDefinedNames: List[Global.Name]
  6. def allHandlers: collection.immutable.List[(memberHandlers)#MemberHandler]
  7. def allImportedNames: collection.immutable.List[Global.Name]
    Definition Classes
    Imports
  8. final def asInstanceOf[T0]: T0
    Definition Classes
    Any
  9. def backticked(s: String): String
  10. def beQuietDuring[T](body: ⇒ T): T

    Temporarily be quiet

  11. def beSilentDuring[T](operation: ⇒ T): T
  12. def bind[T](name: String, value: T)(implicit arg0: reflect.api.JavaUniverse.TypeTag[T], arg1: ClassTag[T]): Result
  13. def bind(p: NamedParam): Result
  14. def bind(name: String, boundType: String, value: Any, modifiers: List[String] = Nil): Result

    Bind a specified name to a specified value.

    Bind a specified name to a specified value. The name may later be used by expressions passed to interpret.

    A fresh ReadEvalPrint, which defines a line package, is used to compile a custom eval object that wraps the bound value.

    If the bound value is successfully installed, then bind the name by interpreting val name = $line42.$eval.value.

    name

    the variable name to bind

    boundType

    the type of the variable, as a string

    value

    the object value to bind to it

    returns

    an indication of whether the binding succeeded

  15. def classLoader: util.AbstractFileClassLoader
  16. def classOfTerm(id: String): Option[JClass]
  17. def cleanMemberDecl(owner: Global.Symbol, member: Global.Name): Global.Type
  18. def cleanTypeAfterTyper(sym: ⇒ Global.Symbol): Global.Type
  19. def clearExecutionWrapper(): Unit
  20. def clone(): AnyRef
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( ... ) @native()
  21. def close(): Unit

    This instance is no longer needed, so release any resources it is using.

    This instance is no longer needed, so release any resources it is using. The reporter's output gets flushed.

    Definition Classes
    IMain → Closeable → AutoCloseable
  22. def compileSources(sources: SourceFile*): Boolean

    Compile an nsc SourceFile.

    Compile an nsc SourceFile. Returns true if there are no compilation errors, or false otherwise.

  23. def compileSourcesKeepingRun(sources: SourceFile*): (Boolean, Run)
  24. def compileString(code: String): Boolean

    Compile a string.

    Compile a string. Returns true if there are no compilation errors, or false otherwise.

  25. def compilerClasspath: Seq[URL]
  26. def dealiasNonPublic(tp: Global.Type): Global.Type
  27. def debugging[T](msg: String)(res: T): T
  28. def definedSymbolList: collection.immutable.List[Global.Symbol]
  29. def definedTerms: collection.immutable.List[Global.TermName]
  30. def definedTypes: List[Global.TypeName]
  31. def directBind[T](name: String, value: T)(implicit arg0: reflect.api.JavaUniverse.TypeTag[T], arg1: ClassTag[T]): Result
  32. def directBind(p: NamedParam): Result
  33. def directBind(name: String, boundType: String, value: Any): Result
  34. final def ensureClassLoader(): Unit
  35. final def eq(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  36. def equals(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  37. def executionWrapper: String
  38. def finalize(): Unit
    Definition Classes
    IMain → AnyRef
  39. def flatPath(sym: Global.Symbol): String
  40. final def getClass(): Class[_]
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  41. def getClassIfDefined(path: String): Global.Symbol
  42. def getModuleIfDefined(path: String): Global.Symbol
  43. lazy val global: Global
  44. def hashCode(): Int
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  45. def implicitSymbolsBySource: List[(Global.Symbol, List[Global.Symbol])]
    Definition Classes
    Imports
  46. def importHandlers: collection.immutable.List[(memberHandlers)#ImportHandler]
  47. def importedSymbols: collection.immutable.List[Global.Symbol]
    Definition Classes
    Imports
  48. def importedSymbolsBySource: List[(Global.Symbol, List[Global.Symbol])]

    Tuples of (source, imported symbols) in the order they were imported.

    Tuples of (source, imported symbols) in the order they were imported.

    Definition Classes
    Imports
  49. def importedTermSymbols: collection.immutable.List[Global.TermSymbol]
    Definition Classes
    Imports
  50. def importsCode(wanted: Set[Global.Name], wrapper: Wrapper, definesClass: Boolean, generousImports: Boolean): ComputedImports
    Attributes
    protected
    Definition Classes
    Imports
  51. def initialize(postInitSignal: ⇒ Unit): Unit
  52. def initializeSynchronous(): Unit
  53. def interpret(line: String, synthetic: Boolean): Result
  54. def interpret(line: String): Result

    Interpret one line of input.

    Interpret one line of input. All feedback, including parse errors and evaluation results, are printed via the supplied compiler's reporter. Values defined are available for future interpreted strings.

    The return value is whether the line was interpreter successfully, e.g. that there were no parse errors.

  55. def interpretSynthetic(line: String): Result
  56. lazy val isClassBased: Boolean
  57. def isInitializeComplete: Boolean
  58. final def isInstanceOf[T0]: Boolean
    Definition Classes
    Any
  59. lazy val isettings: ISettings

    interpreter settings

  60. def languageSymbols: collection.immutable.List[Global.Symbol]
    Definition Classes
    Imports
  61. def languageWildcardHandlers: collection.immutable.List[(memberHandlers)#ImportHandler]
    Definition Classes
    Imports
  62. def languageWildcardSyms: List[Global.Symbol]

    Symbols whose contents are language-defined to be imported.

    Symbols whose contents are language-defined to be imported.

    Definition Classes
    Imports
  63. def lastRequest: Request
  64. def lastWarnings: List[(Global.Position, String)]
  65. lazy val memberHandlers: MemberHandlers { val intp: IMain.this.type }
  66. def mostRecentVar: String

    Returns the name of the most recent interpreter result.

    Returns the name of the most recent interpreter result. Mostly this exists so you can conveniently invoke methods on the previous result.

  67. def namedDefinedTerms: collection.immutable.List[Global.TermName]
  68. final def ne(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  69. def newCompiler(settings: Settings, reporter: Reporter): ReplGlobal

    Instantiate a compiler.

    Instantiate a compiler. Overridable.

    Attributes
    protected
  70. def newPresentationCompiler(): interactive.Global

    Create an instance of the presentation compiler with a classpath comprising the REPL's configured classpath and the classes output by previously compiled REPL lines.

    Create an instance of the presentation compiler with a classpath comprising the REPL's configured classpath and the classes output by previously compiled REPL lines.

    You may directly interact with this compiler from any thread, although you must not access it concurrently from multiple threads.

    You may downcast the reporter to StoreReporter to access type errors.

    Definition Classes
    PresentationCompilation
  71. final def notify(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  72. final def notifyAll(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  73. def onlyTerms(xs: List[Global.Name]): List[Global.TermName]
    Attributes
    protected
  74. def onlyTypes(xs: List[Global.Name]): List[Global.TypeName]
    Attributes
    protected
  75. def originalPath(sym: Global.Symbol): String
  76. def originalPath(name: Global.Name): String
  77. def originalPath(name: String): String
  78. val out: JPrintWriter
    Attributes
    protected
  79. def parentClassLoader: ClassLoader

    Parent classloader.

    Parent classloader. Overridable.

    Attributes
    protected
  80. var partialInput: String
  81. def prevRequestList: collection.immutable.List[Request]
  82. def quietBind(p: NamedParam): Result
  83. def quietRun[T](code: String): Result
  84. val readInstanceName: String

    For class based repl mode we use an .INSTANCE accessor.

  85. def readRootPath(readPath: String): Global.Symbol
  86. def rebind(p: NamedParam): Result
  87. def recordRequest(req: Request): Unit
  88. def replScope: Global.Scope
  89. lazy val reporter: ReplReporter
  90. def reset(): Unit

    Reset this interpreter, forgetting all user-specified requests.

  91. def resetClassLoader(): Unit
  92. def runtimeClassAndTypeOfTerm(id: String): Option[(JClass, Global.Type)]
  93. def runtimeMirror: Mirror
  94. def runtimeTypeOfTerm(id: String): Global.Type
  95. def sessionImportedSymbols: collection.immutable.List[Global.Symbol]
    Definition Classes
    Imports
  96. def sessionWildcards: List[Global.Type]

    Types which have been wildcard imported, such as: val x = "abc" ; import x._ // type java.lang.String import java.lang.String._ // object java.lang.String

    Types which have been wildcard imported, such as: val x = "abc" ; import x._ // type java.lang.String import java.lang.String._ // object java.lang.String

    Used by tab completion.

    XXX right now this gets import x._ and import java.lang.String._, but doesn't figure out import String._. There's a lot of ad hoc scope twiddling which should be swept away in favor of digging into the compiler scopes.

    Definition Classes
    Imports
  97. def setExecutionWrapper(code: String): Unit
  98. def settings: Settings
  99. def showCodeIfDebugging(code: String): Unit
  100. def showDirectory(): Unit
  101. def symbolDefString(sym: Global.Symbol): String
  102. def symbolOfIdent(id: String): Global.Symbol
  103. def symbolOfLine(code: String): Global.Symbol
  104. def symbolOfName(id: Global.Name): Global.Symbol
  105. def symbolOfTerm(id: String): Global.Symbol
  106. def symbolOfType(id: String): Global.Symbol
  107. final def synchronized[T0](arg0: ⇒ T0): T0
    Definition Classes
    AnyRef
  108. def toString(): String
    Definition Classes
    AnyRef → Any
  109. def translateEnclosingClass(n: String): Option[String]
  110. def translateOriginalPath(p: String): String
  111. def translatePath(path: String): Option[String]
  112. def translateSimpleResource(path: String): Option[String]

    If path represents a class resource in the default package, see if the corresponding symbol has a class file that is a REPL artifact residing at a different resource path.

    If path represents a class resource in the default package, see if the corresponding symbol has a class file that is a REPL artifact residing at a different resource path. Translate X.class to $line3/$read$$iw$$iw$X.class.

  113. def tryTwice(op: ⇒ Global.Symbol): Global.Symbol

    It's a bit of a shotgun approach, but for now we will gain in robustness.

    It's a bit of a shotgun approach, but for now we will gain in robustness. Try a symbol-producing operation at phase typer, and if that is NoSymbol, try again at phase flatten. I'll be able to lose this and run only from exitingTyper as soon as I figure out exactly where a flat name is sneaking in when calculating imports.

  114. def typeOfExpression(expr: String, silent: Boolean = true): Global.Type
  115. def typeOfTerm(id: String): Global.Type
  116. def unqualifiedIds: List[String]
  117. def valueOfTerm(id: String): Option[Any]
  118. final def wait(): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  119. final def wait(arg0: Long, arg1: Int): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  120. final def wait(arg0: Long): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... ) @native()
  121. def withLabel[A](temp: String)(body: ⇒ A): A
  122. def withoutTruncating[A](body: ⇒ A): A
  123. def withoutUnwrapping(op: ⇒ Unit): Unit
  124. def withoutWarnings[T](body: ⇒ T): T
  125. object deconstruct extends StructuredTypeStrings
  126. object exprTyper extends ExprTyper
  127. object flatOp extends PhaseDependentOps
  128. object naming extends Naming
  129. object parse

    Parse a line into and return parsing result (error, incomplete or success with list of trees)

  130. object replOutput extends ReplOutput
  131. object typerOp extends PhaseDependentOps
  132. object PresentationCompileResult
    Definition Classes
    PresentationCompilation

Deprecated Value Members

  1. def setContextClassLoader(): Unit
    Annotations
    @deprecated
    Deprecated

    (Since version 2.12.0) The thread context classloader is now set and restored around execution of REPL line, this method is now a no-op.

  2. def virtualDirectory: ReplDir
    Annotations
    @deprecated
    Deprecated

    (Since version 2.11.0) Use replOutput.dir instead

Inherited from Closeable

Inherited from AutoCloseable

Inherited from PresentationCompilation

Inherited from Imports

Inherited from AnyRef

Inherited from Any

Ungrouped