From bcce6e8d01a0e842483270099a73310cb46dfc88 Mon Sep 17 00:00:00 2001 From: Matei Zaharia <matei@eecs.berkeley.edu> Date: Tue, 31 May 2011 17:31:51 -0700 Subject: [PATCH] Various work to use the 2.9 interpreter --- project/build/SparkProject.scala | 2 +- repl/lib/jline.jar | Bin 87543 -> 0 bytes repl/lib/scala-jline.jar | Bin 0 -> 158463 bytes repl/src/main/scala/spark/repl/Main.scala | 8 +- .../spark/repl/SparkCompletionOutput.scala | 92 -- .../main/scala/spark/repl/SparkHelper.scala | 5 + .../main/scala/spark/repl/SparkILoop.scala | 990 ++++++++++++ .../main/scala/spark/repl/SparkIMain.scala | 1131 +++++++++++++ .../scala/spark/repl/SparkISettings.scala | 63 + .../main/scala/spark/repl/SparkImports.scala | 196 +++ .../spark/repl/SparkInteractiveReader.scala | 60 - .../scala/spark/repl/SparkInterpreter.scala | 1395 ----------------- .../spark/repl/SparkInterpreterLoop.scala | 662 -------- .../spark/repl/SparkInterpreterSettings.scala | 112 -- ...etion.scala => SparkJLineCompletion.scala} | 266 ++-- .../scala/spark/repl/SparkJLineReader.scala | 81 +- .../spark/repl/SparkMemberHandlers.scala | 207 +++ .../scala/spark/repl/SparkSimpleReader.scala | 33 - .../src/test/scala/spark/repl/ReplSuite.scala | 2 +- 19 files changed, 2805 insertions(+), 2500 deletions(-) delete mode 100644 repl/lib/jline.jar create mode 100644 repl/lib/scala-jline.jar delete mode 100644 repl/src/main/scala/spark/repl/SparkCompletionOutput.scala create mode 100644 repl/src/main/scala/spark/repl/SparkHelper.scala create mode 100644 repl/src/main/scala/spark/repl/SparkILoop.scala create mode 100644 repl/src/main/scala/spark/repl/SparkIMain.scala create mode 100644 repl/src/main/scala/spark/repl/SparkISettings.scala create mode 100644 repl/src/main/scala/spark/repl/SparkImports.scala delete mode 100644 repl/src/main/scala/spark/repl/SparkInteractiveReader.scala delete mode 100644 repl/src/main/scala/spark/repl/SparkInterpreter.scala delete mode 100644 repl/src/main/scala/spark/repl/SparkInterpreterLoop.scala delete mode 100644 repl/src/main/scala/spark/repl/SparkInterpreterSettings.scala rename repl/src/main/scala/spark/repl/{SparkCompletion.scala => SparkJLineCompletion.scala} (60%) create mode 100644 repl/src/main/scala/spark/repl/SparkMemberHandlers.scala delete mode 100644 repl/src/main/scala/spark/repl/SparkSimpleReader.scala diff --git a/project/build/SparkProject.scala b/project/build/SparkProject.scala index 469dd93ef1..7ebd92fde6 100644 --- a/project/build/SparkProject.scala +++ b/project/build/SparkProject.scala @@ -10,7 +10,7 @@ class SparkProject(info: ProjectInfo) extends ParentProject(info) with IdeaProje lazy val core = project("core", "Spark Core", new CoreProject(_)) -// lazy val repl = project("repl", "Spark REPL", new ReplProject(_), core) + lazy val repl = project("repl", "Spark REPL", new ReplProject(_), core) lazy val examples = project("examples", "Spark Examples", new ExamplesProject(_), core) diff --git a/repl/lib/jline.jar b/repl/lib/jline.jar deleted file mode 100644 index 6ed67faab68b4ba09e264bdaaaa610971479438b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87543 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≫4E0ZFqX*8+KsHm~0Rh<s}#Fn>GL0TR7b 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 diff --git a/repl/lib/scala-jline.jar b/repl/lib/scala-jline.jar new file mode 100644 index 0000000000000000000000000000000000000000..2f18c95cdd7aa00e103e80f2c589ecd715030c70 GIT binary patch literal 158463 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 A6#xJL literal 0 HcmV?d00001 diff --git a/repl/src/main/scala/spark/repl/Main.scala b/repl/src/main/scala/spark/repl/Main.scala index f00df5aa58..b4a2bb05f9 100644 --- a/repl/src/main/scala/spark/repl/Main.scala +++ b/repl/src/main/scala/spark/repl/Main.scala @@ -3,14 +3,14 @@ package spark.repl import scala.collection.mutable.Set object Main { - private var _interp: SparkInterpreterLoop = null + private var _interp: SparkILoop = null def interp = _interp - private[repl] def interp_=(i: SparkInterpreterLoop) { _interp = i } + private[repl] def interp_=(i: SparkILoop) { _interp = i } def main(args: Array[String]) { - _interp = new SparkInterpreterLoop - _interp.main(args) + _interp = new SparkILoop + _interp.process(args) } } diff --git a/repl/src/main/scala/spark/repl/SparkCompletionOutput.scala b/repl/src/main/scala/spark/repl/SparkCompletionOutput.scala deleted file mode 100644 index 5ac46e3412..0000000000 --- a/repl/src/main/scala/spark/repl/SparkCompletionOutput.scala +++ /dev/null @@ -1,92 +0,0 @@ -/* NSC -- new Scala compiler - * Copyright 2005-2010 LAMP/EPFL - * @author Paul Phillips - */ - -package spark.repl - -import scala.tools.nsc -import scala.tools.nsc._ -import scala.tools.nsc.interpreter -import scala.tools.nsc.interpreter._ - -/** This has a lot of duplication with other methods in Symbols and Types, - * but repl completion utility is very sensitive to precise output. Best - * thing would be to abstract an interface for how such things are printed, - * as is also in progress with error messages. - */ -trait SparkCompletionOutput { - self: SparkCompletion => - - import global._ - import definitions.{ NothingClass, AnyClass, isTupleType, isFunctionType, isRepeatedParamType } - - /** Reducing fully qualified noise for some common packages. - */ - val typeTransforms = List( - "java.lang." -> "", - "scala.collection.immutable." -> "immutable.", - "scala.collection.mutable." -> "mutable.", - "scala.collection.generic." -> "generic." - ) - - def quietString(tp: String): String = - typeTransforms.foldLeft(tp) { - case (str, (prefix, replacement)) => - if (str startsWith prefix) replacement + (str stripPrefix prefix) - else str - } - - class MethodSymbolOutput(method: Symbol) { - val pkg = method.ownerChain find (_.isPackageClass) map (_.fullName) getOrElse "" - - def relativize(str: String): String = quietString(str stripPrefix (pkg + ".")) - def relativize(tp: Type): String = relativize(tp.normalize.toString) - def relativize(sym: Symbol): String = relativize(sym.info) - - def braceList(tparams: List[String]) = if (tparams.isEmpty) "" else (tparams map relativize).mkString("[", ", ", "]") - def parenList(params: List[Any]) = params.mkString("(", ", ", ")") - - def methodTypeToString(mt: MethodType) = - (mt.paramss map paramsString mkString "") + ": " + relativize(mt.finalResultType) - - def typeToString(tp: Type): String = relativize( - tp match { - case x if isFunctionType(x) => functionString(x) - case x if isTupleType(x) => tupleString(x) - case x if isRepeatedParamType(x) => typeToString(x.typeArgs.head) + "*" - case mt @ MethodType(_, _) => methodTypeToString(mt) - case x => x.toString - } - ) - - def tupleString(tp: Type) = parenList(tp.normalize.typeArgs map relativize) - def functionString(tp: Type) = tp.normalize.typeArgs match { - case List(t, r) => t + " => " + r - case xs => parenList(xs.init) + " => " + xs.last - } - - def tparamsString(tparams: List[Symbol]) = braceList(tparams map (_.defString)) - def paramsString(params: List[Symbol]) = { - def paramNameString(sym: Symbol) = if (sym.isSynthetic) "" else sym.nameString + ": " - def paramString(sym: Symbol) = paramNameString(sym) + typeToString(sym.info.normalize) - - val isImplicit = params.nonEmpty && params.head.isImplicit - val strs = (params map paramString) match { - case x :: xs if isImplicit => ("implicit " + x) :: xs - case xs => xs - } - parenList(strs) - } - - def methodString() = - method.keyString + " " + method.nameString + (method.info.normalize match { - case PolyType(Nil, resType) => ": " + typeToString(resType) // nullary method - case PolyType(tparams, resType) => tparamsString(tparams) + typeToString(resType) - case mt @ MethodType(_, _) => methodTypeToString(mt) - case x => - DBG("methodString(): %s / %s".format(x.getClass, x)) - x.toString - }) - } -} diff --git a/repl/src/main/scala/spark/repl/SparkHelper.scala b/repl/src/main/scala/spark/repl/SparkHelper.scala new file mode 100644 index 0000000000..d8fb7191b4 --- /dev/null +++ b/repl/src/main/scala/spark/repl/SparkHelper.scala @@ -0,0 +1,5 @@ +package scala.tools.nsc + +object SparkHelper { + def explicitParentLoader(settings: Settings) = settings.explicitParentLoader +} diff --git a/repl/src/main/scala/spark/repl/SparkILoop.scala b/repl/src/main/scala/spark/repl/SparkILoop.scala new file mode 100644 index 0000000000..bfbc66ebdd --- /dev/null +++ b/repl/src/main/scala/spark/repl/SparkILoop.scala @@ -0,0 +1,990 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Alexander Spoon + */ + +package spark.repl + +import scala.tools.nsc._ +import scala.tools.nsc.interpreter._ + +import Predef.{ println => _, _ } +import java.io.{ BufferedReader, FileReader, PrintWriter } +import scala.sys.process.Process +import session._ +import scala.tools.nsc.interpreter.{ Results => IR } +import scala.tools.util.{ SignalManager, Signallable, Javap } +import scala.annotation.tailrec +import scala.util.control.Exception.{ ignoring } +import scala.collection.mutable.ListBuffer +import scala.concurrent.ops +import util.{ ClassPath, Exceptional, stringFromWriter, stringFromStream } +import interpreter._ +import io.{ File, Sources } + +import spark.SparkContext + +/** The Scala interactive shell. It provides a read-eval-print loop + * around the Interpreter class. + * After instantiation, clients should call the main() method. + * + * If no in0 is specified, then input will come from the console, and + * the class will attempt to provide input editing feature such as + * input history. + * + * @author Moez A. Abdel-Gawad + * @author Lex Spoon + * @version 1.2 + */ +class SparkILoop(in0: Option[BufferedReader], val out: PrintWriter, val master: Option[String]) + extends AnyRef + with LoopCommands +{ + def this(in0: BufferedReader, out: PrintWriter, master: String) = this(Some(in0), out, Some(master)) + def this(in0: BufferedReader, out: PrintWriter) = this(Some(in0), out, None) + def this() = this(None, new PrintWriter(Console.out, true), None) + + var in: InteractiveReader = _ // the input stream from which commands come + var settings: Settings = _ + var intp: SparkIMain = _ + + /* + lazy val power = { + val g = intp.global + Power[g.type](this, g) + } + */ + + // TODO + // object opt extends AestheticSettings + // + @deprecated("Use `intp` instead.", "2.9.0") + def interpreter = intp + + @deprecated("Use `intp` instead.", "2.9.0") + def interpreter_= (i: SparkIMain): Unit = intp = i + + def history = in.history + + /** The context class loader at the time this object was created */ + protected val originalClassLoader = Thread.currentThread.getContextClassLoader + + // Install a signal handler so we can be prodded. + private val signallable = + /*if (isReplDebug) Signallable("Dump repl state.")(dumpCommand()) + else*/ null + + // classpath entries added via :cp + var addedClasspath: String = "" + + /** A reverse list of commands to replay if the user requests a :replay */ + var replayCommandStack: List[String] = Nil + + /** A list of commands to replay if the user requests a :replay */ + def replayCommands = replayCommandStack.reverse + + /** Record a command for replay should the user request a :replay */ + def addReplay(cmd: String) = replayCommandStack ::= cmd + + /** Try to install sigint handler: ignore failure. Signal handler + * will interrupt current line execution if any is in progress. + * + * Attempting to protect the repl from accidental exit, we only honor + * a single ctrl-C if the current buffer is empty: otherwise we look + * for a second one within a short time. + */ + private def installSigIntHandler() { + def onExit() { + Console.println("") // avoiding "shell prompt in middle of line" syndrome + sys.exit(1) + } + ignoring(classOf[Exception]) { + SignalManager("INT") = { + if (intp == null) + onExit() + else if (intp.lineManager.running) + intp.lineManager.cancel() + else if (in.currentLine != "") { + // non-empty buffer, so make them hit ctrl-C a second time + SignalManager("INT") = onExit() + io.timer(5)(installSigIntHandler()) // and restore original handler if they don't + } + else onExit() + } + } + } + + /** Close the interpreter and set the var to null. */ + def closeInterpreter() { + if (intp ne null) { + intp.close + intp = null + Thread.currentThread.setContextClassLoader(originalClassLoader) + } + } + + class SparkILoopInterpreter extends SparkIMain(settings, out) { + override lazy val formatting = new Formatting { + def prompt = SparkILoop.this.prompt + } + override protected def createLineManager() = new Line.Manager { + override def onRunaway(line: Line[_]): Unit = { + val template = """ + |// She's gone rogue, captain! Have to take her out! + |// Calling Thread.stop on runaway %s with offending code: + |// scala> %s""".stripMargin + + echo(template.format(line.thread, line.code)) + // XXX no way to suppress the deprecation warning + line.thread.stop() + in.redrawLine() + } + } + override protected def parentClassLoader = { + SparkHelper.explicitParentLoader(settings).getOrElse( classOf[SparkILoop].getClassLoader ) + } + } + + /** Create a new interpreter. */ + def createInterpreter() { + if (addedClasspath != "") + settings.classpath append addedClasspath + + intp = new SparkILoopInterpreter + intp.setContextClassLoader() + installSigIntHandler() + } + + /** print a friendly help message */ + def helpCommand(line: String): Result = { + if (line == "") helpSummary() + else uniqueCommand(line) match { + case Some(lc) => echo("\n" + lc.longHelp) + case _ => ambiguousError(line) + } + } + private def helpSummary() = { + val usageWidth = commands map (_.usageMsg.length) max + val formatStr = "%-" + usageWidth + "s %s %s" + + echo("All commands can be abbreviated, e.g. :he instead of :help.") + echo("Those marked with a * have more detailed help, e.g. :help imports.\n") + + commands foreach { cmd => + val star = if (cmd.hasLongHelp) "*" else " " + echo(formatStr.format(cmd.usageMsg, star, cmd.help)) + } + } + private def ambiguousError(cmd: String): Result = { + matchingCommands(cmd) match { + case Nil => echo(cmd + ": no such command. Type :help for help.") + case xs => echo(cmd + " is ambiguous: did you mean " + xs.map(":" + _.name).mkString(" or ") + "?") + } + Result(true, None) + } + private def matchingCommands(cmd: String) = commands filter (_.name startsWith cmd) + private def uniqueCommand(cmd: String): Option[LoopCommand] = { + // this lets us add commands willy-nilly and only requires enough command to disambiguate + matchingCommands(cmd) match { + case List(x) => Some(x) + // exact match OK even if otherwise appears ambiguous + case xs => xs find (_.name == cmd) + } + } + + /** Print a welcome message */ + def printWelcome() { + echo("""Welcome to + ____ __ + / __/__ ___ _____/ /__ + _\ \/ _ \/ _ `/ __/ '_/ + /___/ .__/\_,_/_/ /_/\_\ version 0.3 + /_/ +""") + import Properties._ + val welcomeMsg = "Using Scala %s (%s, Java %s)".format( + versionString, javaVmName, javaVersion) + echo(welcomeMsg) + } + + /** Show the history */ + lazy val historyCommand = new LoopCommand("history", "show the history (optional num is commands to show)") { + override def usage = "[num]" + def defaultLines = 20 + + def apply(line: String): Result = { + if (history eq NoHistory) + return "No history available." + + val xs = words(line) + val current = history.index + val count = try xs.head.toInt catch { case _: Exception => defaultLines } + val lines = history.asStrings takeRight count + val offset = current - lines.size + 1 + + for ((line, index) <- lines.zipWithIndex) + echo("%3d %s".format(index + offset, line)) + } + } + + private def echo(msg: String) = { + out println msg + out.flush() + } + private def echoNoNL(msg: String) = { + out print msg + out.flush() + } + + /** Search the history */ + def searchHistory(_cmdline: String) { + val cmdline = _cmdline.toLowerCase + val offset = history.index - history.size + 1 + + for ((line, index) <- history.asStrings.zipWithIndex ; if line.toLowerCase contains cmdline) + echo("%d %s".format(index + offset, line)) + } + + private var currentPrompt = Properties.shellPromptString + def setPrompt(prompt: String) = currentPrompt = prompt + /** Prompt to print when awaiting input */ + def prompt = currentPrompt + + import LoopCommand.{ cmd, nullary } + + /** Standard commands **/ + lazy val standardCommands = List( + cmd("cp", "<path>", "add a jar or directory to the classpath", addClasspath), + cmd("help", "[command]", "print this summary or command-specific help", helpCommand), + historyCommand, + cmd("h?", "<string>", "search the history", searchHistory), + cmd("imports", "[name name ...]", "show import history, identifying sources of names", importsCommand), + cmd("implicits", "[-v]", "show the implicits in scope", implicitsCommand), + cmd("javap", "<path|class>", "disassemble a file or class name", javapCommand), + nullary("keybindings", "show how ctrl-[A-Z] and other keys are bound", keybindingsCommand), + cmd("load", "<path>", "load and interpret a Scala file", loadCommand), + nullary("paste", "enter paste mode: all input up to ctrl-D compiled together", pasteCommand), + //nullary("power", "enable power user mode", powerCmd), + nullary("quit", "exit the interpreter", () => Result(false, None)), + nullary("replay", "reset execution and replay all previous commands", replay), + shCommand, + nullary("silent", "disable/enable automatic printing of results", verbosity), + cmd("type", "<expr>", "display the type of an expression without evaluating it", typeCommand) + ) + + /** Power user commands */ + lazy val powerCommands: List[LoopCommand] = List( + //nullary("dump", "displays a view of the interpreter's internal state", dumpCommand), + //cmd("phase", "<phase>", "set the implicit phase for power commands", phaseCommand), + cmd("wrap", "<method>", "name of method to wrap around each repl line", wrapCommand) withLongHelp (""" + |:wrap + |:wrap clear + |:wrap <method> + | + |Installs a wrapper around each line entered into the repl. + |Currently it must be the simple name of an existing method + |with the specific signature shown in the following example. + | + |def timed[T](body: => T): T = { + | val start = System.nanoTime + | try body + | finally println((System.nanoTime - start) + " nanos elapsed.") + |} + |:wrap timed + | + |If given no argument, :wrap names the wrapper installed. + |An argument of clear will remove the wrapper if any is active. + |Note that wrappers do not compose (a new one replaces the old + |one) and also that the :phase command uses the same machinery, + |so setting :wrap will clear any :phase setting. + """.stripMargin.trim) + ) + + /* + private def dumpCommand(): Result = { + echo("" + power) + history.asStrings takeRight 30 foreach echo + in.redrawLine() + } + */ + + private val typeTransforms = List( + "scala.collection.immutable." -> "immutable.", + "scala.collection.mutable." -> "mutable.", + "scala.collection.generic." -> "generic.", + "java.lang." -> "jl.", + "scala.runtime." -> "runtime." + ) + + private def importsCommand(line: String): Result = { + val tokens = words(line) + val handlers = intp.languageWildcardHandlers ++ intp.importHandlers + val isVerbose = tokens contains "-v" + + handlers.filterNot(_.importedSymbols.isEmpty).zipWithIndex foreach { + case (handler, idx) => + val (types, terms) = handler.importedSymbols partition (_.name.isTypeName) + val imps = handler.implicitSymbols + val found = tokens filter (handler importsSymbolNamed _) + val typeMsg = if (types.isEmpty) "" else types.size + " types" + val termMsg = if (terms.isEmpty) "" else terms.size + " terms" + val implicitMsg = if (imps.isEmpty) "" else imps.size + " are implicit" + val foundMsg = if (found.isEmpty) "" else found.mkString(" // imports: ", ", ", "") + val statsMsg = List(typeMsg, termMsg, implicitMsg) filterNot (_ == "") mkString ("(", ", ", ")") + + intp.reporter.printMessage("%2d) %-30s %s%s".format( + idx + 1, + handler.importString, + statsMsg, + foundMsg + )) + } + } + + private def implicitsCommand(line: String): Result = { + val intp = SparkILoop.this.intp + import intp._ + import global.Symbol + + def p(x: Any) = intp.reporter.printMessage("" + x) + + // If an argument is given, only show a source with that + // in its name somewhere. + val args = line split "\\s+" + val filtered = intp.implicitSymbolsBySource filter { + case (source, syms) => + (args contains "-v") || { + if (line == "") (source.fullName.toString != "scala.Predef") + else (args exists (source.name.toString contains _)) + } + } + + if (filtered.isEmpty) + return "No implicits have been imported other than those in Predef." + + filtered foreach { + case (source, syms) => + p("/* " + syms.size + " implicit members imported from " + source.fullName + " */") + + // This groups the members by where the symbol is defined + val byOwner = syms groupBy (_.owner) + val sortedOwners = byOwner.toList sortBy { case (owner, _) => intp.afterTyper(source.info.baseClasses indexOf owner) } + + sortedOwners foreach { + case (owner, members) => + // Within each owner, we cluster results based on the final result type + // if there are more than a couple, and sort each cluster based on name. + // This is really just trying to make the 100 or so implicits imported + // by default into something readable. + val memberGroups: List[List[Symbol]] = { + val groups = members groupBy (_.tpe.finalResultType) toList + val (big, small) = groups partition (_._2.size > 3) + val xss = ( + (big sortBy (_._1.toString) map (_._2)) :+ + (small flatMap (_._2)) + ) + + xss map (xs => xs sortBy (_.name.toString)) + } + + val ownerMessage = if (owner == source) " defined in " else " inherited from " + p(" /* " + members.size + ownerMessage + owner.fullName + " */") + + memberGroups foreach { group => + group foreach (s => p(" " + intp.symbolDefString(s))) + p("") + } + } + p("") + } + } + + protected def newJavap() = new Javap(intp.classLoader, new SparkIMain.ReplStrippingWriter(intp)) { + override def tryClass(path: String): Array[Byte] = { + // Look for Foo first, then Foo$, but if Foo$ is given explicitly, + // we have to drop the $ to find object Foo, then tack it back onto + // the end of the flattened name. + def className = intp flatName path + def moduleName = (intp flatName path.stripSuffix("$")) + "$" + + val bytes = super.tryClass(className) + if (bytes.nonEmpty) bytes + else super.tryClass(moduleName) + } + } + private lazy val javap = + try newJavap() + catch { case _: Exception => null } + + private def typeCommand(line: String): Result = { + intp.typeOfExpression(line) match { + case Some(tp) => tp.toString + case _ => "Failed to determine type." + } + } + + private def javapCommand(line: String): Result = { + if (javap == null) + return ":javap unavailable on this platform." + if (line == "") + return ":javap [-lcsvp] [path1 path2 ...]" + + javap(words(line)) foreach { res => + if (res.isError) return "Failed: " + res.value + else res.show() + } + } + private def keybindingsCommand(): Result = { + if (in.keyBindings.isEmpty) "Key bindings unavailable." + else { + echo("Reading jline properties for default key bindings.") + echo("Accuracy not guaranteed: treat this as a guideline only.\n") + in.keyBindings foreach (x => echo ("" + x)) + } + } + private def wrapCommand(line: String): Result = { + def failMsg = "Argument to :wrap must be the name of a method with signature [T](=> T): T" + val intp = SparkILoop.this.intp + val g: intp.global.type = intp.global + import g._ + + words(line) match { + case Nil => + intp.executionWrapper match { + case "" => "No execution wrapper is set." + case s => "Current execution wrapper: " + s + } + case "clear" :: Nil => + intp.executionWrapper match { + case "" => "No execution wrapper is set." + case s => intp.clearExecutionWrapper() ; "Cleared execution wrapper." + } + case wrapper :: Nil => + intp.typeOfExpression(wrapper) match { + case Some(PolyType(List(targ), MethodType(List(arg), restpe))) => + intp setExecutionWrapper intp.pathToTerm(wrapper) + "Set wrapper to '" + wrapper + "'" + case Some(x) => + failMsg + "\nFound: " + x + case _ => + failMsg + "\nFound: <unknown>" + } + case _ => failMsg + } + } + + private def pathToPhaseWrapper = intp.pathToTerm("$r") + ".phased.atCurrent" + /* + private def phaseCommand(name: String): Result = { + // This line crashes us in TreeGen: + // + // if (intp.power.phased set name) "..." + // + // Exception in thread "main" java.lang.AssertionError: assertion failed: ._7.type + // at scala.Predef$.assert(Predef.scala:99) + // at scala.tools.nsc.ast.TreeGen.mkAttributedQualifier(TreeGen.scala:69) + // at scala.tools.nsc.ast.TreeGen.mkAttributedQualifier(TreeGen.scala:44) + // at scala.tools.nsc.ast.TreeGen.mkAttributedRef(TreeGen.scala:101) + // at scala.tools.nsc.ast.TreeGen.mkAttributedStableRef(TreeGen.scala:143) + // + // But it works like so, type annotated. + val phased: Phased = power.phased + import phased.NoPhaseName + + if (name == "clear") { + phased.set(NoPhaseName) + intp.clearExecutionWrapper() + "Cleared active phase." + } + else if (name == "") phased.get match { + case NoPhaseName => "Usage: :phase <expr> (e.g. typer, erasure.next, erasure+3)" + case ph => "Active phase is '%s'. (To clear, :phase clear)".format(phased.get) + } + else { + val what = phased.parse(name) + if (what.isEmpty || !phased.set(what)) + "'" + name + "' does not appear to represent a valid phase." + else { + intp.setExecutionWrapper(pathToPhaseWrapper) + val activeMessage = + if (what.toString.length == name.length) "" + what + else "%s (%s)".format(what, name) + + "Active phase is now: " + activeMessage + } + } + } + */ + + /** Available commands */ + def commands: List[LoopCommand] = standardCommands /* ++ ( + if (isReplPower) powerCommands else Nil + )*/ + + val replayQuestionMessage = + """|The repl compiler has crashed spectacularly. Shall I replay your + |session? I can re-run all lines except the last one. + |[y/n] + """.trim.stripMargin + + private val crashRecovery: PartialFunction[Throwable, Unit] = { + case ex: Throwable => + if (settings.YrichExes.value) { + val sources = implicitly[Sources] + echo("\n" + ex.getMessage) + echo( + if (isReplDebug) "[searching " + sources.path + " for exception contexts...]" + else "[searching for exception contexts...]" + ) + echo(Exceptional(ex).force().context()) + } + else { + echo(util.stackTraceString(ex)) + } + ex match { + case _: NoSuchMethodError | _: NoClassDefFoundError => + echo("Unrecoverable error.") + throw ex + case _ => + def fn(): Boolean = in.readYesOrNo(replayQuestionMessage, { echo("\nYou must enter y or n.") ; fn() }) + if (fn()) replay() + else echo("\nAbandoning crashed session.") + } + } + + /** The main read-eval-print loop for the repl. It calls + * command() for each line of input, and stops when + * command() returns false. + */ + def loop() { + def readOneLine() = { + out.flush() + in readLine prompt + } + // return false if repl should exit + def processLine(line: String): Boolean = + if (line eq null) false // assume null means EOF + else command(line) match { + case Result(false, _) => false + case Result(_, Some(finalLine)) => addReplay(finalLine) ; true + case _ => true + } + + while (true) { + try if (!processLine(readOneLine)) return + catch crashRecovery + } + } + + /** interpret all lines from a specified file */ + def interpretAllFrom(file: File) { + val oldIn = in + val oldReplay = replayCommandStack + + try file applyReader { reader => + in = SimpleReader(reader, out, false) + echo("Loading " + file + "...") + loop() + } + finally { + in = oldIn + replayCommandStack = oldReplay + } + } + + /** create a new interpreter and replay all commands so far */ + def replay() { + closeInterpreter() + createInterpreter() + for (cmd <- replayCommands) { + echo("Replaying: " + cmd) // flush because maybe cmd will have its own output + command(cmd) + echo("") + } + } + + /** fork a shell and run a command */ + lazy val shCommand = new LoopCommand("sh", "run a shell command (result is implicitly => List[String])") { + override def usage = "<command line>" + def apply(line: String): Result = line match { + case "" => showUsage() + case _ => + val toRun = classOf[ProcessResult].getName + "(" + string2codeQuoted(line) + ")" + intp interpret toRun + () + } + } + + def withFile(filename: String)(action: File => Unit) { + val f = File(filename) + + if (f.exists) action(f) + else echo("That file does not exist") + } + + def loadCommand(arg: String) = { + var shouldReplay: Option[String] = None + withFile(arg)(f => { + interpretAllFrom(f) + shouldReplay = Some(":load " + arg) + }) + Result(true, shouldReplay) + } + + def addClasspath(arg: String): Unit = { + val f = File(arg).normalize + if (f.exists) { + addedClasspath = ClassPath.join(addedClasspath, f.path) + val totalClasspath = ClassPath.join(settings.classpath.value, addedClasspath) + echo("Added '%s'. Your new classpath is:\n\"%s\"".format(f.path, totalClasspath)) + replay() + } + else echo("The path '" + f + "' doesn't seem to exist.") + } + + def powerCmd(): Result = { + if (isReplPower) "Already in power mode." + else enablePowerMode() + } + def enablePowerMode() = { + //replProps.power setValue true + //power.unleash() + //echo(power.banner) + } + + def verbosity() = { + val old = intp.printResults + intp.printResults = !old + echo("Switched " + (if (old) "off" else "on") + " result printing.") + } + + /** Run one command submitted by the user. Two values are returned: + * (1) whether to keep running, (2) the line to record for replay, + * if any. */ + def command(line: String): Result = { + if (line startsWith ":") { + val cmd = line.tail takeWhile (x => !x.isWhitespace) + uniqueCommand(cmd) match { + case Some(lc) => lc(line.tail stripPrefix cmd dropWhile (_.isWhitespace)) + case _ => ambiguousError(cmd) + } + } + else if (intp.global == null) Result(false, None) // Notice failure to create compiler + else Result(true, interpretStartingWith(line)) + } + + private def readWhile(cond: String => Boolean) = { + Iterator continually in.readLine("") takeWhile (x => x != null && cond(x)) + } + + def pasteCommand(): Result = { + echo("// Entering paste mode (ctrl-D to finish)\n") + val code = readWhile(_ => true) mkString "\n" + echo("\n// Exiting paste mode, now interpreting.\n") + intp interpret code + () + } + + private object paste extends Pasted { + val ContinueString = " | " + val PromptString = "scala> " + + def interpret(line: String): Unit = { + echo(line.trim) + intp interpret line + echo("") + } + + def transcript(start: String) = { + // Printing this message doesn't work very well because it's buried in the + // transcript they just pasted. Todo: a short timer goes off when + // lines stop coming which tells them to hit ctrl-D. + // + // echo("// Detected repl transcript paste: ctrl-D to finish.") + apply(Iterator(start) ++ readWhile(_.trim != PromptString.trim)) + } + } + import paste.{ ContinueString, PromptString } + + /** Interpret expressions starting with the first line. + * Read lines until a complete compilation unit is available + * or until a syntax error has been seen. If a full unit is + * read, go ahead and interpret it. Return the full string + * to be recorded for replay, if any. + */ + def interpretStartingWith(code: String): Option[String] = { + // signal completion non-completion input has been received + in.completion.resetVerbosity() + + def reallyInterpret = { + val reallyResult = intp.interpret(code) + (reallyResult, reallyResult match { + case IR.Error => None + case IR.Success => Some(code) + case IR.Incomplete => + if (in.interactive && code.endsWith("\n\n")) { + echo("You typed two blank lines. Starting a new command.") + None + } + else in.readLine(ContinueString) match { + case null => + // we know compilation is going to fail since we're at EOF and the + // parser thinks the input is still incomplete, but since this is + // a file being read non-interactively we want to fail. So we send + // it straight to the compiler for the nice error message. + intp.compileString(code) + None + + case line => interpretStartingWith(code + "\n" + line) + } + }) + } + + /** Here we place ourselves between the user and the interpreter and examine + * the input they are ostensibly submitting. We intervene in several cases: + * + * 1) If the line starts with "scala> " it is assumed to be an interpreter paste. + * 2) If the line starts with "." (but not ".." or "./") it is treated as an invocation + * on the previous result. + * 3) If the Completion object's execute returns Some(_), we inject that value + * and avoid the interpreter, as it's likely not valid scala code. + */ + if (code == "") None + else if (!paste.running && code.trim.startsWith(PromptString)) { + paste.transcript(code) + None + } + else if (Completion.looksLikeInvocation(code) && intp.mostRecentVar != "") { + interpretStartingWith(intp.mostRecentVar + code) + } + else { + def runCompletion = in.completion execute code map (intp bindValue _) + /** Due to my accidentally letting file completion execution sneak ahead + * of actual parsing this now operates in such a way that the scala + * interpretation always wins. However to avoid losing useful file + * completion I let it fail and then check the others. So if you + * type /tmp it will echo a failure and then give you a Directory object. + * It's not pretty: maybe I'll implement the silence bits I need to avoid + * echoing the failure. + */ + if (intp isParseable code) { + val (code, result) = reallyInterpret + //if (power != null && code == IR.Error) + // runCompletion + + result + } + else runCompletion match { + case Some(_) => None // completion hit: avoid the latent error + case _ => reallyInterpret._2 // trigger the latent error + } + } + } + + // runs :load `file` on any files passed via -i + def loadFiles(settings: Settings) = settings match { + case settings: GenericRunnerSettings => + for (filename <- settings.loadfiles.value) { + val cmd = ":load " + filename + command(cmd) + addReplay(cmd) + echo("") + } + case _ => + } + + /** Tries to create a JLineReader, falling back to SimpleReader: + * unless settings or properties are such that it should start + * with SimpleReader. + */ + def chooseReader(settings: Settings): InteractiveReader = { + if (settings.Xnojline.value || Properties.isEmacsShell) + SimpleReader() + else try JLineReader( + if (settings.noCompletion.value) NoCompletion + else new JLineCompletion(intp) + ) + catch { + case ex @ (_: Exception | _: NoClassDefFoundError) => + echo("Failed to created JLineReader: " + ex + "\nFalling back to SimpleReader.") + SimpleReader() + } + } + + def initializeSpark() { + intp.beQuietDuring { + command(""" + spark.repl.Main.interp.out.println("Creating SparkContext..."); + spark.repl.Main.interp.out.flush(); + @transient val sc = spark.repl.Main.interp.createSparkContext(); + sc.waitForRegister(); + spark.repl.Main.interp.out.println("Spark context available as sc."); + spark.repl.Main.interp.out.flush(); + """) + command("import spark.SparkContext._"); + } + echo("Type in expressions to have them evaluated.") + echo("Type :help for more information.") + } + + var sparkContext: SparkContext = null + + def createSparkContext(): SparkContext = { + val master = this.master match { + case Some(m) => m + case None => { + val prop = System.getenv("MASTER") + if (prop != null) prop else "local" + } + } + sparkContext = new SparkContext(master, "Spark shell") + sparkContext + } + + def process(settings: Settings): Boolean = { + this.settings = settings + createInterpreter() + + // sets in to some kind of reader depending on environmental cues + in = in0 match { + case Some(reader) => SimpleReader(reader, out, true) + case None => chooseReader(settings) + } + + loadFiles(settings) + // it is broken on startup; go ahead and exit + if (intp.reporter.hasErrors) + return false + + printWelcome() + try { + // this is about the illusion of snappiness. We call initialize() + // which spins off a separate thread, then print the prompt and try + // our best to look ready. Ideally the user will spend a + // couple seconds saying "wow, it starts so fast!" and by the time + // they type a command the compiler is ready to roll. + intp.initialize() + initializeSpark() + if (isReplPower) { + echo("Starting in power mode, one moment...\n") + enablePowerMode() + } + loop() + } + finally closeInterpreter() + true + } + + /** process command-line arguments and do as they request */ + def process(args: Array[String]): Boolean = { + val command = new CommandLine(args.toList, msg => echo("scala: " + msg)) + def neededHelp(): String = + (if (command.settings.help.value) command.usageMsg + "\n" else "") + + (if (command.settings.Xhelp.value) command.xusageMsg + "\n" else "") + + // if they asked for no help and command is valid, we call the real main + neededHelp() match { + case "" => command.ok && process(command.settings) + case help => echoNoNL(help) ; true + } + } + + @deprecated("Use `process` instead", "2.9.0") + def main(args: Array[String]): Unit = { + if (isReplDebug) + System.out.println(new java.util.Date) + + process(args) + } + @deprecated("Use `process` instead", "2.9.0") + def main(settings: Settings): Unit = process(settings) +} + +object SparkILoop { + implicit def loopToInterpreter(repl: SparkILoop): SparkIMain = repl.intp + private def echo(msg: String) = Console println msg + + // Designed primarily for use by test code: take a String with a + // bunch of code, and prints out a transcript of what it would look + // like if you'd just typed it into the repl. + def runForTranscript(code: String, settings: Settings): String = { + import java.io.{ BufferedReader, StringReader, OutputStreamWriter } + + stringFromStream { ostream => + Console.withOut(ostream) { + val output = new PrintWriter(new OutputStreamWriter(ostream), true) { + override def write(str: String) = { + // completely skip continuation lines + if (str forall (ch => ch.isWhitespace || ch == '|')) () + // print a newline on empty scala prompts + else if ((str contains '\n') && (str.trim == "scala> ")) super.write("\n") + else super.write(str) + } + } + val input = new BufferedReader(new StringReader(code)) { + override def readLine(): String = { + val s = super.readLine() + // helping out by printing the line being interpreted. + if (s != null) + output.println(s) + s + } + } + val repl = new SparkILoop(input, output) + if (settings.classpath.isDefault) + settings.classpath.value = sys.props("java.class.path") + + repl process settings + } + } + } + + /** Creates an interpreter loop with default settings and feeds + * the given code to it as input. + */ + def run(code: String, sets: Settings = new Settings): String = { + import java.io.{ BufferedReader, StringReader, OutputStreamWriter } + + stringFromStream { ostream => + Console.withOut(ostream) { + val input = new BufferedReader(new StringReader(code)) + val output = new PrintWriter(new OutputStreamWriter(ostream), true) + val repl = new SparkILoop(input, output) + + if (sets.classpath.isDefault) + sets.classpath.value = sys.props("java.class.path") + + repl process sets + } + } + } + def run(lines: List[String]): String = run(lines map (_ + "\n") mkString) + + // provide the enclosing type T + // in order to set up the interpreter's classpath and parent class loader properly + def breakIf[T: Manifest](assertion: => Boolean, args: NamedParam*): Unit = + if (assertion) break[T](args.toList) + + // start a repl, binding supplied args + def break[T: Manifest](args: List[NamedParam]): Unit = { + val msg = if (args.isEmpty) "" else " Binding " + args.size + " value%s.".format( + if (args.size == 1) "" else "s" + ) + echo("Debug repl starting." + msg) + val repl = new SparkILoop { + override def prompt = "\ndebug> " + } + repl.settings = new Settings(echo) + repl.settings.embeddedDefaults[T] + repl.createInterpreter() + repl.in = JLineReader(repl) + + // rebind exit so people don't accidentally call sys.exit by way of predef + repl.quietRun("""def exit = println("Type :quit to resume program execution.")""") + args foreach (p => repl.bind(p.name, p.tpe, p.value)) + repl.loop() + + echo("\nDebug repl exiting.") + repl.closeInterpreter() + } +} diff --git a/repl/src/main/scala/spark/repl/SparkIMain.scala b/repl/src/main/scala/spark/repl/SparkIMain.scala new file mode 100644 index 0000000000..1fdc4eaf8a --- /dev/null +++ b/repl/src/main/scala/spark/repl/SparkIMain.scala @@ -0,0 +1,1131 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Martin Odersky + */ + +package spark.repl + +import scala.tools.nsc._ +import scala.tools.nsc.interpreter._ + +import Predef.{ println => _, _ } +import java.io.{ PrintWriter } +import java.lang.reflect +import java.net.URL +import util.{ Set => _, _ } +import io.{ AbstractFile, PlainFile, VirtualDirectory } +import reporters.{ ConsoleReporter, Reporter } +import symtab.{ Flags, Names } +import scala.tools.nsc.interpreter.{ Results => IR } +import scala.tools.util.PathResolver +import scala.tools.nsc.util.{ ScalaClassLoader, Exceptional } +import ScalaClassLoader.URLClassLoader +import Exceptional.unwrap +import scala.collection.{ mutable, immutable } +import scala.PartialFunction.{ cond, condOpt } +import scala.util.control.Exception.{ ultimately } +import scala.reflect.NameTransformer +import SparkIMain._ + +import spark.HttpServer +import spark.Utils + +/** 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 a single member named "$export". To accomodate 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. + * + * @author Moez A. Abdel-Gawad + * @author Lex Spoon + */ +class SparkIMain(val settings: Settings, protected val out: PrintWriter) extends SparkImports { + imain => + + /** construct an interpreter that reports to Console */ + def this(settings: Settings) = this(settings, new NewLinePrintWriter(new ConsoleWriter, true)) + def this() = this(new Settings()) + + /** whether to print out result lines */ + var printResults: Boolean = true + + /** whether to print errors */ + var totalSilence: Boolean = false + + private val RESULT_OBJECT_PREFIX = "RequestResult$" + + lazy val formatting: Formatting = new Formatting { + val prompt = Properties.shellPromptString + } + import formatting._ + + val SPARK_DEBUG_REPL: Boolean = (System.getenv("SPARK_DEBUG_REPL") == "1") + + /** Local directory to save .class files too */ + val outputDir = { + val tmp = System.getProperty("java.io.tmpdir") + val rootDir = System.getProperty("spark.repl.classdir", tmp) + Utils.createTempDir(rootDir) + } + if (SPARK_DEBUG_REPL) { + echo("Output directory: " + outputDir) + } + + /** Scala compiler virtual directory for outputDir */ + val virtualDirectory = new PlainFile(outputDir) + + /** Jetty server that will serve our classes to worker nodes */ + val classServer = new HttpServer(outputDir) + + // Start the classServer and store its URI in a spark system property + // (which will be passed to executors so that they can connect to it) + classServer.start() + System.setProperty("spark.repl.class.uri", classServer.uri) + if (SPARK_DEBUG_REPL) { + echo("Class server started, URI = " + classServer.uri) + } + + /* + // directory to save .class files to + val virtualDirectory = new VirtualDirectory("(memory)", None) { + private def pp(root: io.AbstractFile, indentLevel: Int) { + val spaces = " " * indentLevel + out.println(spaces + root.name) + if (root.isDirectory) + root.toList sortBy (_.name) foreach (x => pp(x, indentLevel + 1)) + } + // print the contents hierarchically + def show() = pp(this, 0) + } + */ + + /** reporter */ + lazy val reporter: ConsoleReporter = new SparkIMain.ReplReporter(this) + import reporter.{ printMessage, withoutTruncating } + + // not sure if we have some motivation to print directly to console + private def echo(msg: String) { Console println msg } + + // protected def defaultImports: List[String] = List("_root_.scala.sys.exit") + + /** We're going to go to some trouble to initialize the compiler asynchronously. + * It's critical that nothing call into it until it's been initialized or we will + * run into unrecoverable issues, but the perceived repl startup time goes + * through the roof if we wait for it. So we initialize it with a future and + * use a lazy val to ensure that any attempt to use the compiler object waits + * on the future. + */ + private val _compiler: Global = newCompiler(settings, reporter) + private var _initializeComplete = false + def isInitializeComplete = _initializeComplete + + private def _initialize(): Boolean = { + val source = """ + |class $repl_$init { + | List(1) map (_ + 1) + |} + |""".stripMargin + + val result = try { + new _compiler.Run() compileSources List(new BatchSourceFile("<init>", source)) + if (isReplDebug || settings.debug.value) { + // Can't use printMessage here, it deadlocks + Console.println("Repl compiler initialized.") + } + // addImports(defaultImports: _*) + true + } + catch { + case x: AbstractMethodError => + printMessage(""" + |Failed to initialize compiler: abstract method error. + |This is most often remedied by a full clean and recompile. + |""".stripMargin + ) + x.printStackTrace() + false + case x: MissingRequirementError => printMessage(""" + |Failed to initialize compiler: %s not found. + |** Note that as of 2.8 scala does not assume use of the java classpath. + |** For the old behavior pass -usejavacp to scala, or if using a Settings + |** object programatically, settings.usejavacp.value = true.""".stripMargin.format(x.req) + ) + false + } + + try result + finally _initializeComplete = result + } + + // set up initialization future + private var _isInitialized: () => Boolean = null + def initialize() = synchronized { + if (_isInitialized == null) + _isInitialized = scala.concurrent.ops future _initialize() + } + + /** the public, go through the future compiler */ + lazy val global: Global = { + initialize() + + // blocks until it is ; false means catastrophic failure + if (_isInitialized()) _compiler + else null + } + @deprecated("Use `global` for access to the compiler instance.", "2.9.0") + lazy val compiler: global.type = global + + import global._ + + object naming extends { + val global: imain.global.type = imain.global + } with Naming { + // make sure we don't overwrite their unwisely named res3 etc. + override def freshUserVarName(): String = { + val name = super.freshUserVarName() + if (definedNameMap contains name) freshUserVarName() + else name + } + } + import naming._ + + // object dossiers extends { + // val intp: imain.type = imain + // } with Dossiers { } + // import dossiers._ + + lazy val memberHandlers = new { + val intp: imain.type = imain + } with SparkMemberHandlers + import memberHandlers._ + + def atPickler[T](op: => T): T = atPhase(currentRun.picklerPhase)(op) + def afterTyper[T](op: => T): T = atPhase(currentRun.typerPhase.next)(op) + + /** Temporarily be quiet */ + def beQuietDuring[T](operation: => T): T = { + val wasPrinting = printResults + ultimately(printResults = wasPrinting) { + if (isReplDebug) echo(">> beQuietDuring") + else printResults = false + + operation + } + } + def beSilentDuring[T](operation: => T): T = { + val saved = totalSilence + totalSilence = true + try operation + finally totalSilence = saved + } + + def quietRun[T](code: String) = beQuietDuring(interpret(code)) + + /** whether to bind the lastException variable */ + private var bindLastException = true + + /** A string representing code to be wrapped around all lines. */ + private var _executionWrapper: String = "" + def executionWrapper = _executionWrapper + def setExecutionWrapper(code: String) = _executionWrapper = code + def clearExecutionWrapper() = _executionWrapper = "" + + /** Temporarily stop binding lastException */ + def withoutBindingLastException[T](operation: => T): T = { + val wasBinding = bindLastException + ultimately(bindLastException = wasBinding) { + bindLastException = false + operation + } + } + + protected def createLineManager(): Line.Manager = new Line.Manager + lazy val lineManager = createLineManager() + + /** interpreter settings */ + lazy val isettings = new SparkISettings(this) + + /** Instantiate a compiler. Subclasses can override this to + * change the compiler class used by this interpreter. */ + protected def newCompiler(settings: Settings, reporter: Reporter) = { + settings.outputDirs setSingleOutput virtualDirectory + settings.exposeEmptyPackage.value = true + new Global(settings, reporter) + } + + /** the compiler's classpath, as URL's */ + lazy val compilerClasspath: List[URL] = new PathResolver(settings) asURLs + + /* A single class loader is used for all commands interpreted by this Interpreter. + It would also be possible to create a new class loader for each command + to interpret. The advantages of the current approach are: + + - Expressions are only evaluated one time. This is especially + significant for I/O, e.g. "val x = Console.readLine" + + The main disadvantage is: + + - Objects, classes, and methods cannot be rebound. Instead, definitions + shadow the old ones, and old code objects refer to the old + definitions. + */ + private var _classLoader: AbstractFileClassLoader = null + def resetClassLoader() = _classLoader = makeClassLoader() + def classLoader: AbstractFileClassLoader = { + if (_classLoader == null) + resetClassLoader() + + _classLoader + } + private def makeClassLoader(): AbstractFileClassLoader = { + val parent = + if (parentClassLoader == null) ScalaClassLoader fromURLs compilerClasspath + else new URLClassLoader(compilerClasspath, parentClassLoader) + + new AbstractFileClassLoader(virtualDirectory, parent) { + /** Overridden here to try translating a simple name to the generated + * class name if the original attempt fails. This method is used by + * getResourceAsStream as well as findClass. + */ + override protected def findAbstractFile(name: String): AbstractFile = { + super.findAbstractFile(name) match { + // deadlocks on startup if we try to translate names too early + case null if isInitializeComplete => generatedName(name) map (x => super.findAbstractFile(x)) orNull + case file => file + } + } + } + } + private def loadByName(s: String): JClass = + (classLoader tryToInitializeClass s) getOrElse sys.error("Failed to load expected class: '" + s + "'") + + protected def parentClassLoader: ClassLoader = + SparkHelper.explicitParentLoader(settings).getOrElse( this.getClass.getClassLoader() ) + + def getInterpreterClassLoader() = classLoader + + // Set the current Java "context" class loader to this interpreter's class loader + def setContextClassLoader() = classLoader.setAsContext() + + /** Given a simple repl-defined name, returns the real name of + * the class representing it, e.g. for "Bippy" it may return + * + * $line19.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$Bippy + */ + def generatedName(simpleName: String): Option[String] = { + if (simpleName endsWith "$") optFlatName(simpleName.init) map (_ + "$") + else optFlatName(simpleName) + } + def flatName(id: String) = optFlatName(id) getOrElse id + def optFlatName(id: String) = requestForIdent(id) map (_ fullFlatName id) + + def allDefinedNames = definedNameMap.keys.toList sortBy (_.toString) + def pathToType(id: String): String = pathToName(newTypeName(id)) + def pathToTerm(id: String): String = pathToName(newTermName(id)) + def pathToName(name: Name): String = { + if (definedNameMap contains name) + definedNameMap(name) fullPath name + else name.toString + } + + /** Most recent tree handled which wasn't wholly synthetic. */ + private def mostRecentlyHandledTree: Option[Tree] = { + prevRequests.reverse foreach { req => + req.handlers.reverse foreach { + case x: MemberDefHandler if x.definesValue && !isInternalVarName(x.name) => return Some(x.member) + case _ => () + } + } + None + } + + /** Stubs for work in progress. */ + def handleTypeRedefinition(name: TypeName, old: Request, req: Request) = { + for (t1 <- old.simpleNameOfType(name) ; t2 <- req.simpleNameOfType(name)) { + DBG("Redefining type '%s'\n %s -> %s".format(name, t1, t2)) + } + } + + def handleTermRedefinition(name: TermName, old: Request, req: Request) = { + for (t1 <- old.compilerTypeOf get name ; t2 <- req.compilerTypeOf get name) { + // Printing the types here has a tendency to cause assertion errors, like + // assertion failed: fatal: <refinement> has owner value x, but a class owner is required + // so DBG is by-name now to keep it in the family. (It also traps the assertion error, + // but we don't want to unnecessarily risk hosing the compiler's internal state.) + DBG("Redefining term '%s'\n %s -> %s".format(name, t1, t2)) + } + } + def recordRequest(req: Request) { + if (req == null || referencedNameMap == null) + return + + prevRequests += req + req.referencedNames foreach (x => referencedNameMap(x) = req) + + // warning about serially defining companions. It'd be easy + // enough to just redefine them together but that may not always + // be what people want so I'm waiting until I can do it better. + if (!settings.nowarnings.value) { + for { + name <- req.definedNames filterNot (x => req.definedNames contains x.companionName) + oldReq <- definedNameMap get name.companionName + newSym <- req.definedSymbols get name + oldSym <- oldReq.definedSymbols get name.companionName + } { + printMessage("warning: previously defined %s is not a companion to %s.".format(oldSym, newSym)) + printMessage("Companions must be defined together; you may wish to use :paste mode for this.") + } + } + + // Updating the defined name map + req.definedNames foreach { name => + if (definedNameMap contains name) { + if (name.isTypeName) handleTypeRedefinition(name.toTypeName, definedNameMap(name), req) + else handleTermRedefinition(name.toTermName, definedNameMap(name), req) + } + definedNameMap(name) = req + } + } + + /** Parse a line into a sequence of trees. Returns None if the input is incomplete. */ + def parse(line: String): Option[List[Tree]] = { + var justNeedsMore = false + reporter.withIncompleteHandler((pos,msg) => {justNeedsMore = true}) { + // simple parse: just parse it, nothing else + def simpleParse(code: String): List[Tree] = { + reporter.reset() + val unit = new CompilationUnit(new BatchSourceFile("<console>", code)) + val scanner = new syntaxAnalyzer.UnitParser(unit) + + scanner.templateStatSeq(false)._2 + } + val trees = simpleParse(line) + + if (reporter.hasErrors) Some(Nil) // the result did not parse, so stop + else if (justNeedsMore) None + else Some(trees) + } + } + + def isParseable(line: String): Boolean = { + beSilentDuring { + parse(line) match { + case Some(xs) => xs.nonEmpty // parses as-is + case None => true // incomplete + } + } + } + + /** Compile an nsc SourceFile. Returns true if there are + * no compilation errors, or false otherwise. + */ + def compileSources(sources: SourceFile*): Boolean = { + reporter.reset() + new Run() compileSources sources.toList + !reporter.hasErrors + } + + /** Compile a string. Returns true if there are no + * compilation errors, or false otherwise. + */ + def compileString(code: String): Boolean = + compileSources(new BatchSourceFile("<script>", code)) + + /** Build a request from the user. `trees` is `line` after being parsed. + */ + private def buildRequest(line: String, trees: List[Tree]): Request = new Request(line, trees) + + private def requestFromLine(line: String, synthetic: Boolean): Either[IR.Result, Request] = { + val trees = parse(indentCode(line)) match { + case None => return Left(IR.Incomplete) + case Some(Nil) => return Left(IR.Error) // parse error or empty input + case Some(trees) => trees + } + + // use synthetic vars to avoid filling up the resXX slots + def varName = if (synthetic) freshInternalVarName() else freshUserVarName() + + // Treat a single bare expression specially. This is necessary due to it being hard to + // modify code at a textual level, and it being hard to submit an AST to the compiler. + if (trees.size == 1) trees.head match { + case _:Assign => // we don't want to include assignments + case _:TermTree | _:Ident | _:Select => // ... but do want these as valdefs. + requestFromLine("val %s =\n%s".format(varName, line), synthetic) match { + case Right(req) => return Right(req withOriginalLine line) + case x => return x + } + case _ => + } + + // figure out what kind of request + Right(buildRequest(line, trees)) + } + + /** + * 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. + * + * + * @param line ... + * @return ... + */ + def interpret(line: String): IR.Result = interpret(line, false) + def interpret(line: String, synthetic: Boolean): IR.Result = { + def loadAndRunReq(req: Request) = { + val (result, succeeded) = req.loadAndRun + /** To our displeasure, ConsoleReporter offers only printMessage, + * which tacks a newline on the end. Since that breaks all the + * output checking, we have to take one off to balance. + */ + def show() = { + if (result == "") () + else printMessage(result stripSuffix "\n") + } + + if (succeeded) { + if (printResults) + show() + // Book-keeping. Have to record synthetic requests too, + // as they may have been issued for information, e.g. :type + recordRequest(req) + IR.Success + } + else { + // don't truncate stack traces + withoutTruncating(show()) + IR.Error + } + } + + if (global == null) IR.Error + else requestFromLine(line, synthetic) match { + case Left(result) => result + case Right(req) => + // null indicates a disallowed statement type; otherwise compile and + // fail if false (implying e.g. a type error) + if (req == null || !req.compile) IR.Error + else loadAndRunReq(req) + } + } + + /** Bind a specified name to a specified value. The name may + * later be used by expressions passed to interpret. + * + * @param name the variable name to bind + * @param boundType the type of the variable, as a string + * @param value the object value to bind to it + * @return an indication of whether the binding succeeded + */ + def bind(name: String, boundType: String, value: Any): IR.Result = { + val bindRep = new ReadEvalPrint() + val run = bindRep.compile(""" + |object %s { + | var value: %s = _ + | def set(x: Any) = value = x.asInstanceOf[%s] + |} + """.stripMargin.format(bindRep.evalName, boundType, boundType) + ) + bindRep.callOpt("set", value) match { + case Some(_) => interpret("val %s = %s.value".format(name, bindRep.evalPath)) + case _ => DBG("Set failed in bind(%s, %s, %s)".format(name, boundType, value)) ; IR.Error + } + } + def rebind(p: NamedParam): IR.Result = { + val name = p.name + val oldType = typeOfTerm(name) getOrElse { return IR.Error } + val newType = p.tpe + val tempName = freshInternalVarName() + + quietRun("val %s = %s".format(tempName, name)) + quietRun("val %s = %s.asInstanceOf[%s]".format(name, tempName, newType)) + } + def quietImport(ids: String*): IR.Result = beQuietDuring(addImports(ids: _*)) + def addImports(ids: String*): IR.Result = + if (ids.isEmpty) IR.Success + else interpret("import " + ids.mkString(", ")) + + def quietBind(p: NamedParam): IR.Result = beQuietDuring(bind(p)) + def bind(p: NamedParam): IR.Result = bind(p.name, p.tpe, p.value) + def bind[T: Manifest](name: String, value: T): IR.Result = bind((name, value)) + def bindValue(x: Any): IR.Result = bind(freshUserVarName(), TypeStrings.fromValue(x), x) + + /** Reset this interpreter, forgetting all user-specified requests. */ + def reset() { + //virtualDirectory.clear() + virtualDirectory.delete() + virtualDirectory.create() + resetClassLoader() + resetAllCreators() + prevRequests.clear() + } + + /** This instance is no longer needed, so release any resources + * it is using. The reporter's output gets flushed. + */ + def close() { + reporter.flush() + } + + /** 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. + */ + class ReadEvalPrint(lineId: Int) { + def this() = this(freshLineId()) + + val packageName = "$line" + lineId + val readName = "$read" + val evalName = "$eval" + val printName = "$print" + val valueMethod = "$result" // no-args method giving result + + // TODO: split it out into a package object and a regular + // object and we can do that much less wrapping. + def packageDecl = "package " + packageName + + def pathTo(name: String) = packageName + "." + name + def packaged(code: String) = packageDecl + "\n\n" + code + + def readPath = pathTo(readName) + def evalPath = pathTo(evalName) + def printPath = pathTo(printName) + + def call(name: String, args: Any*): AnyRef = + evalMethod(name).invoke(evalClass, args.map(_.asInstanceOf[AnyRef]): _*) + + def callOpt(name: String, args: Any*): Option[AnyRef] = + try Some(call(name, args: _*)) + catch { case ex: Exception => + quietBind("lastException", ex) + None + } + + lazy val evalClass = loadByName(evalPath) + lazy val evalValue = callOpt(valueMethod) + + def compile(source: String): Boolean = compileAndSaveRun("<console>", source) + def lineAfterTyper[T](op: => T): T = { + assert(lastRun != null, "Internal error: trying to use atPhase, but Run is null." + this) + atPhase(lastRun.typerPhase.next)(op) + } + + /** The innermost object inside the wrapper, found by + * following accessPath into the outer one. + */ + def resolvePathToSymbol(accessPath: String): Symbol = { + val readRoot = definitions.getModule(readPath) // the outermost wrapper + (accessPath split '.').foldLeft(readRoot) { (sym, name) => + if (name == "") sym else + lineAfterTyper(sym.info member newTermName(name)) + } + } + + // def compileAndTypeExpr(expr: String): Option[Typer] = { + // class TyperRun extends Run { + // override def stopPhase(name: String) = name == "superaccessors" + // } + // } + private var lastRun: Run = _ + private def evalMethod(name: String) = { + val methods = evalClass.getMethods filter (_.getName == name) + assert(methods.size == 1, "Internal error - eval object method " + name + " is overloaded: " + methods) + methods.head + } + private def compileAndSaveRun(label: String, code: String) = { + showCodeIfDebugging(code) + reporter.reset() + lastRun = new Run() + lastRun.compileSources(List(new BatchSourceFile(label, packaged(code)))) + !reporter.hasErrors + } + } + + /** One line of code submitted by the user for interpretation */ + // private + class Request(val line: String, val trees: List[Tree]) { + val lineRep = new ReadEvalPrint() + import lineRep.lineAfterTyper + + private var _originalLine: String = null + def withOriginalLine(s: String): this.type = { _originalLine = s ; this } + def originalLine = if (_originalLine == null) line else _originalLine + + /** handlers for each tree in this request */ + val handlers: List[MemberHandler] = trees map (memberHandlers chooseHandler _) + + /** all (public) names defined by these statements */ + val definedNames = handlers flatMap (_.definedNames) + + /** list of names used by this expression */ + val referencedNames: List[Name] = handlers flatMap (_.referencedNames) + + /** def and val names */ + def termNames = handlers flatMap (_.definesTerm) + def typeNames = handlers flatMap (_.definesType) + + /** Code to import bound names from previous lines - accessPath is code to + * append to objectName to access anything bound by request. + */ + val ComputedImports(importsPreamble, importsTrailer, accessPath) = + importsCode(referencedNames.toSet) + + /** Code to access a variable with the specified name */ + def fullPath(vname: String) = ( + lineRep.readPath + accessPath + ".`%s`".format(vname) + ) + /** Same as fullpath, but after it has been flattened, so: + * $line5.$iw.$iw.$iw.Bippy // fullPath + * $line5.$iw$$iw$$iw$Bippy // fullFlatName + */ + def fullFlatName(name: String) = + lineRep.readPath + accessPath.replace('.', '$') + "$" + name + + /** Code to access a variable with the specified name */ + def fullPath(vname: Name): String = fullPath(vname.toString) + + /** the line of code to compute */ + def toCompute = line + + /** generate the source code for the object that computes this request */ + private object ObjectSourceCode extends CodeAssembler[MemberHandler] { + val preamble = """ + |object %s { + | %s%s + """.stripMargin.format(lineRep.readName, importsPreamble, indentCode(toCompute)) + val postamble = importsTrailer + "\n}" + val generate = (m: MemberHandler) => m extraCodeToEvaluate Request.this + } + + private object ResultObjectSourceCode extends CodeAssembler[MemberHandler] { + /** We only want to generate this code when the result + * is a value which can be referred to as-is. + */ + val evalResult = + if (!handlers.last.definesValue) "" + else handlers.last.definesTerm match { + case Some(vname) if typeOf contains vname => + """ + |lazy val $result = { + | $export + | %s + |}""".stripMargin.format(fullPath(vname)) + case _ => "" + } + // first line evaluates object to make sure constructor is run + // initial "" so later code can uniformly be: + etc + val preamble = """ + |object %s { + | %s + | val $export: String = %s { + | %s + | ("" + """.stripMargin.format( + lineRep.evalName, evalResult, executionWrapper, lineRep.readName + accessPath + ) + + val postamble = """ + | ) + | } + |} + """.stripMargin + val generate = (m: MemberHandler) => m resultExtractionCode Request.this + } + + // get it + def getEvalTyped[T] : Option[T] = getEval map (_.asInstanceOf[T]) + def getEval: Option[AnyRef] = { + // ensure it has been compiled + compile + // try to load it and call the value method + lineRep.evalValue filterNot (_ == null) + } + + /** Compile the object file. Returns whether the compilation succeeded. + * If all goes well, the "types" map is computed. */ + lazy val compile: Boolean = { + // error counting is wrong, hence interpreter may overlook failure - so we reset + reporter.reset() + + // compile the object containing the user's code + lineRep.compile(ObjectSourceCode(handlers)) && { + // extract and remember types + typeOf + typesOfDefinedTerms + + // compile the result-extraction object + lineRep compile ResultObjectSourceCode(handlers) + } + } + + lazy val resultSymbol = lineRep.resolvePathToSymbol(accessPath) + def applyToResultMember[T](name: Name, f: Symbol => T) = lineAfterTyper(f(resultSymbol.info.nonPrivateDecl(name))) + + /* typeOf lookup with encoding */ + def lookupTypeOf(name: Name) = typeOf.getOrElse(name, typeOf(global.encode(name.toString))) + def simpleNameOfType(name: TypeName) = (compilerTypeOf get name) map (_.typeSymbol.simpleName) + + private def typeMap[T](f: Type => T): Map[Name, T] = { + def toType(name: Name): T = { + // the types are all =>T; remove the => + val tp1 = lineAfterTyper(resultSymbol.info.nonPrivateDecl(name).tpe match { + case NullaryMethodType(tp) => tp + case tp => tp + }) + // normalize non-public types so we don't see protected aliases like Self + lineAfterTyper(tp1 match { + case TypeRef(_, sym, _) if !sym.isPublic => f(tp1.normalize) + case tp => f(tp) + }) + } + termNames ++ typeNames map (x => x -> toType(x)) toMap + } + /** Types of variables defined by this request. */ + lazy val compilerTypeOf = typeMap[Type](x => x) + /** String representations of same. */ + lazy val typeOf = typeMap[String](_.toString) + + // lazy val definedTypes: Map[Name, Type] = { + // typeNames map (x => x -> afterTyper(resultSymbol.info.nonPrivateDecl(x).tpe)) toMap + // } + lazy val definedSymbols: Map[Name, Symbol] = ( + termNames.map(x => x -> applyToResultMember(x, x => x)) ++ + typeNames.map(x => x -> compilerTypeOf.get(x).map(_.typeSymbol).getOrElse(NoSymbol)) + ).toMap + + lazy val typesOfDefinedTerms: Map[Name, Type] = + termNames map (x => x -> applyToResultMember(x, _.tpe)) toMap + + private def bindExceptionally(t: Throwable) = { + val ex: Exceptional = + if (isettings.showInternalStackTraces) Exceptional(t) + else new Exceptional(t) { + override def spanFn(frame: JavaStackFrame) = !(frame.className startsWith lineRep.evalPath) + override def contextPrelude = super.contextPrelude + "/* The repl internal portion of the stack trace is elided. */\n" + } + + quietBind("lastException", ex) + ex.contextHead + "\n(access lastException for the full trace)" + } + private def bindUnexceptionally(t: Throwable) = { + quietBind("lastException", t) + stackTraceString(t) + } + + /** load and run the code using reflection */ + def loadAndRun: (String, Boolean) = { + import interpreter.Line._ + + def handleException(t: Throwable) = { + /** We turn off the binding to accomodate ticket #2817 */ + withoutBindingLastException { + val message = + if (opt.richExes) bindExceptionally(unwrap(t)) + else bindUnexceptionally(unwrap(t)) + + (message, false) + } + } + + try { + val execution = lineManager.set(originalLine)(lineRep call "$export") + execution.await() + + execution.state match { + case Done => ("" + execution.get(), true) + case Threw => + val ex = execution.caught() + if (isReplDebug) + ex.printStackTrace() + + if (bindLastException) handleException(ex) + else throw ex + case Cancelled => ("Execution interrupted by signal.\n", false) + case Running => ("Execution still running! Seems impossible.", false) + } + } + finally lineManager.clear() + } + + override def toString = "Request(line=%s, %s trees)".format(line, trees.size) + } + + /** Returns the name of the most recent interpreter result. + * Mostly this exists so you can conveniently invoke methods on + * the previous result. + */ + def mostRecentVar: String = + if (mostRecentlyHandledTree.isEmpty) "" + else "" + (mostRecentlyHandledTree.get match { + case x: ValOrDefDef => x.name + case Assign(Ident(name), _) => name + case ModuleDef(_, name, _) => name + case _ => naming.mostRecentVar + }) + + private def requestForName(name: Name): Option[Request] = { + assert(definedNameMap != null, "definedNameMap is null") + definedNameMap get name + } + + private def requestForIdent(line: String): Option[Request] = + requestForName(newTermName(line)) orElse requestForName(newTypeName(line)) + + def safeClass(name: String): Option[Symbol] = { + try Some(definitions.getClass(newTypeName(name))) + catch { case _: MissingRequirementError => None } + } + def safeModule(name: String): Option[Symbol] = { + try Some(definitions.getModule(newTermName(name))) + catch { case _: MissingRequirementError => None } + } + + def definitionForName(name: Name): Option[MemberHandler] = + requestForName(name) flatMap { req => + req.handlers find (_.definedNames contains name) + } + + def valueOfTerm(id: String): Option[AnyRef] = + requestForIdent(id) flatMap (_.getEval) + + def classOfTerm(id: String): Option[JClass] = + valueOfTerm(id) map (_.getClass) + + def typeOfTerm(id: String): Option[Type] = newTermName(id) match { + case nme.ROOTPKG => Some(definitions.RootClass.tpe) + case name => requestForName(name) flatMap (_.compilerTypeOf get name) + } + def symbolOfTerm(id: String): Symbol = + requestForIdent(id) flatMap (_.definedSymbols get newTermName(id)) getOrElse NoSymbol + + def runtimeClassAndTypeOfTerm(id: String): Option[(JClass, Type)] = { + for { + clazz <- classOfTerm(id) + tpe <- runtimeTypeOfTerm(id) + nonAnon <- new RichClass(clazz).supers.find(c => !(new RichClass(c).isScalaAnonymous)) + } yield { + (nonAnon, tpe) + } + } + + def runtimeTypeOfTerm(id: String): Option[Type] = { + for { + tpe <- typeOfTerm(id) + clazz <- classOfTerm(id) + val staticSym = tpe.typeSymbol + runtimeSym <- safeClass(clazz.getName) + if runtimeSym != staticSym + if runtimeSym isSubClass staticSym + } yield { + runtimeSym.info + } + } + + // XXX literals. + // 1) Identifiers defined in the repl. + // 2) A path loadable via getModule. + // 3) Try interpreting it as an expression. + private var typeOfExpressionDepth = 0 + def typeOfExpression(expr: String): Option[Type] = { + DBG("typeOfExpression(" + expr + ")") + if (typeOfExpressionDepth > 2) { + DBG("Terminating typeOfExpression recursion for expression: " + expr) + return None + } + + def asQualifiedImport = { + val name = expr.takeWhile(_ != '.') + importedTermNamed(name) flatMap { sym => + typeOfExpression(sym.fullName + expr.drop(name.length)) + } + } + def asModule = safeModule(expr) map (_.tpe) + def asExpr = beSilentDuring { + val lhs = freshInternalVarName() + val line = "lazy val " + lhs + " = { " + expr + " } " + + interpret(line, true) match { + case IR.Success => typeOfExpression(lhs) + case _ => None + } + } + + typeOfExpressionDepth += 1 + try typeOfTerm(expr) orElse asModule orElse asExpr orElse asQualifiedImport + finally typeOfExpressionDepth -= 1 + } + // def compileAndTypeExpr(expr: String): Option[Typer] = { + // class TyperRun extends Run { + // override def stopPhase(name: String) = name == "superaccessors" + // } + // } + + protected def onlyTerms(xs: List[Name]) = xs collect { case x: TermName => x } + protected def onlyTypes(xs: List[Name]) = xs collect { case x: TypeName => x } + + def definedTerms = onlyTerms(allDefinedNames) filterNot isInternalVarName + def definedTypes = onlyTypes(allDefinedNames) + def definedSymbols = prevRequests.toSet flatMap ((x: Request) => x.definedSymbols.values) + + /** the previous requests this interpreter has processed */ + private lazy val prevRequests = mutable.ListBuffer[Request]() + private lazy val referencedNameMap = mutable.Map[Name, Request]() + private lazy val definedNameMap = mutable.Map[Name, Request]() + protected def prevRequestList = prevRequests.toList + private def allHandlers = prevRequestList flatMap (_.handlers) + def allSeenTypes = prevRequestList flatMap (_.typeOf.values.toList) distinct + def allImplicits = allHandlers filter (_.definesImplicit) flatMap (_.definedNames) + def importHandlers = allHandlers collect { case x: ImportHandler => x } + + def visibleTermNames: List[Name] = definedTerms ++ importedTerms distinct + + /** Another entry point for tab-completion, ids in scope */ + def unqualifiedIds = visibleTermNames map (_.toString) filterNot (_ contains "$") sorted + + /** Parse the ScalaSig to find type aliases */ + def aliasForType(path: String) = ByteCode.aliasForType(path) + + def withoutUnwrapping(op: => Unit): Unit = { + val saved = isettings.unwrapStrings + isettings.unwrapStrings = false + try op + finally isettings.unwrapStrings = saved + } + + def symbolDefString(sym: Symbol) = { + TypeStrings.quieter( + afterTyper(sym.defString), + sym.owner.name + ".this.", + sym.owner.fullName + "." + ) + } + + def showCodeIfDebugging(code: String) { + /** Secret bookcase entrance for repl debuggers: end the line + * with "// show" and see what's going on. + */ + if (code.lines exists (_.trim endsWith "// show")) { + echo(code) + parse(code) foreach (ts => ts foreach (t => withoutUnwrapping(DBG(asCompactString(t))))) + } + } + // debugging + def debugging[T](msg: String)(res: T) = { + DBG(msg + " " + res) + res + } + def DBG(s: => String) = if (isReplDebug) { + //try repldbg(s) + //catch { case x: AssertionError => repldbg("Assertion error printing debug string:\n " + x) } + } +} + +/** Utility methods for the Interpreter. */ +object SparkIMain { + // The two name forms this is catching are the two sides of this assignment: + // + // $line3.$read.$iw.$iw.Bippy = + // $line3.$read$$iw$$iw$Bippy@4a6a00ca + private def removeLineWrapper(s: String) = s.replaceAll("""\$line\d+[./]\$(read|eval|print)[$.]""", "") + private def removeIWPackages(s: String) = s.replaceAll("""\$(iw|read|eval|print)[$.]""", "") + def stripString(s: String) = removeIWPackages(removeLineWrapper(s)) + + trait CodeAssembler[T] { + def preamble: String + def generate: T => String + def postamble: String + + def apply(contributors: List[T]): String = stringFromWriter { code => + code println preamble + contributors map generate foreach (code println _) + code println postamble + } + } + + trait StrippingWriter { + def isStripping: Boolean + def stripImpl(str: String): String + def strip(str: String): String = if (isStripping) stripImpl(str) else str + } + trait TruncatingWriter { + def maxStringLength: Int + def isTruncating: Boolean + def truncate(str: String): String = { + if (isTruncating && str.length > maxStringLength) + (str take maxStringLength - 3) + "..." + else str + } + } + abstract class StrippingTruncatingWriter(out: PrintWriter) + extends PrintWriter(out) + with StrippingWriter + with TruncatingWriter { + self => + + def clean(str: String): String = truncate(strip(str)) + override def write(str: String) = super.write(clean(str)) + } + class ReplStrippingWriter(intp: SparkIMain) extends StrippingTruncatingWriter(intp.out) { + import intp._ + def maxStringLength = isettings.maxPrintString + def isStripping = isettings.unwrapStrings + def isTruncating = reporter.truncationOK + + def stripImpl(str: String): String = { + val cleaned = stripString(str) + var ctrlChars = 0 + cleaned map { ch => + if (ch.isControl && !ch.isWhitespace) { + ctrlChars += 1 + if (ctrlChars > 5) return "[line elided for control chars: possibly a scala signature]" + else '?' + } + else ch + } + } + } + + class ReplReporter(intp: SparkIMain) extends ConsoleReporter(intp.settings, null, new ReplStrippingWriter(intp)) { + override def printMessage(msg: String) { + // Avoiding deadlock when the compiler starts logging before + // the lazy val is done. + if (intp.isInitializeComplete) { + if (intp.totalSilence) () + else super.printMessage(msg) + } + else Console.println(msg) + } + } +} diff --git a/repl/src/main/scala/spark/repl/SparkISettings.scala b/repl/src/main/scala/spark/repl/SparkISettings.scala new file mode 100644 index 0000000000..8ebb01d146 --- /dev/null +++ b/repl/src/main/scala/spark/repl/SparkISettings.scala @@ -0,0 +1,63 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Alexander Spoon + */ + +package spark.repl + +import scala.tools.nsc._ +import scala.tools.nsc.interpreter._ + +/** Settings for the interpreter + * + * @version 1.0 + * @author Lex Spoon, 2007/3/24 + **/ +class SparkISettings(intp: SparkIMain) { + /** A list of paths where :load should look */ + var loadPath = List(".") + + /** Set this to true to see repl machinery under -Yrich-exceptions. + */ + var showInternalStackTraces = false + + /** The maximum length of toString to use when printing the result + * of an evaluation. 0 means no maximum. If a printout requires + * more than this number of characters, then the printout is + * truncated. + */ + var maxPrintString = 800 + + /** The maximum number of completion candidates to print for tab + * completion without requiring confirmation. + */ + var maxAutoprintCompletion = 250 + + /** String unwrapping can be disabled if it is causing issues. + * Settings this to false means you will see Strings like "$iw.$iw.". + */ + var unwrapStrings = true + + def deprecation_=(x: Boolean) = { + val old = intp.settings.deprecation.value + intp.settings.deprecation.value = x + if (!old && x) println("Enabled -deprecation output.") + else if (old && !x) println("Disabled -deprecation output.") + } + def deprecation: Boolean = intp.settings.deprecation.value + + def allSettings = Map( + "maxPrintString" -> maxPrintString, + "maxAutoprintCompletion" -> maxAutoprintCompletion, + "unwrapStrings" -> unwrapStrings, + "deprecation" -> deprecation + ) + + private def allSettingsString = + allSettings.toList sortBy (_._1) map { case (k, v) => " " + k + " = " + v + "\n" } mkString + + override def toString = """ + | SparkISettings { + | %s + | }""".stripMargin.format(allSettingsString) +} diff --git a/repl/src/main/scala/spark/repl/SparkImports.scala b/repl/src/main/scala/spark/repl/SparkImports.scala new file mode 100644 index 0000000000..e62c9245ea --- /dev/null +++ b/repl/src/main/scala/spark/repl/SparkImports.scala @@ -0,0 +1,196 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Paul Phillips + */ + +package spark.repl + +import scala.tools.nsc._ +import scala.tools.nsc.interpreter._ + +import scala.collection.{ mutable, immutable } + +trait SparkImports { + self: SparkIMain => + + import global._ + import definitions.{ ScalaPackage, JavaLangPackage, PredefModule } + import memberHandlers._ + + /** Synthetic import handlers for the language defined imports. */ + private def makeWildcardImportHandler(sym: Symbol): ImportHandler = { + val hd :: tl = sym.fullName.split('.').toList map newTermName + val tree = Import( + tl.foldLeft(Ident(hd): Tree)((x, y) => Select(x, y)), + List(ImportSelector(nme.WILDCARD, -1, null, -1)) + ) + tree setSymbol sym + new ImportHandler(tree) + } + + /** Symbols whose contents are language-defined to be imported. */ + def languageWildcardSyms: List[Symbol] = List(JavaLangPackage, ScalaPackage, PredefModule) + def languageWildcards: List[Type] = languageWildcardSyms map (_.tpe) + def languageWildcardHandlers = languageWildcardSyms map makeWildcardImportHandler + + def importedTerms = onlyTerms(importHandlers flatMap (_.importedNames)) + def importedTypes = onlyTypes(importHandlers flatMap (_.importedNames)) + + /** 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. + */ + def sessionWildcards: List[Type] = { + importHandlers flatMap { + case x if x.importsWildcard => x.targetType + case _ => None + } distinct + } + def wildcardTypes = languageWildcards ++ sessionWildcards + + def languageSymbols = languageWildcardSyms flatMap membersAtPickler + def sessionImportedSymbols = importHandlers flatMap (_.importedSymbols) + def importedSymbols = languageSymbols ++ sessionImportedSymbols + def importedTermSymbols = importedSymbols collect { case x: TermSymbol => x } + def importedTypeSymbols = importedSymbols collect { case x: TypeSymbol => x } + def implicitSymbols = importedSymbols filter (_.isImplicit) + + def importedTermNamed(name: String) = importedTermSymbols find (_.name.toString == name) + + /** Tuples of (source, imported symbols) in the order they were imported. + */ + def importedSymbolsBySource: List[(Symbol, List[Symbol])] = { + val lang = languageWildcardSyms map (sym => (sym, membersAtPickler(sym))) + val session = importHandlers filter (_.targetType.isDefined) map { mh => + (mh.targetType.get.typeSymbol, mh.importedSymbols) + } + + lang ++ session + } + def implicitSymbolsBySource: List[(Symbol, List[Symbol])] = { + importedSymbolsBySource map { + case (k, vs) => (k, vs filter (_.isImplicit)) + } filterNot (_._2.isEmpty) + } + + /** Compute imports that allow definitions from previous + * requests to be visible in a new request. Returns + * three pieces of related code: + * + * 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 traverested 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. + */ + case class ComputedImports(prepend: String, append: String, access: String) + protected def importsCode(wanted: Set[Name]): ComputedImports = { + /** Narrow down the list of requests from which imports + * should be taken. Removes requests which cannot contribute + * useful imports for the specified set of wanted names. + */ + case class ReqAndHandler(req: Request, handler: MemberHandler) { } + + def reqsToUse: List[ReqAndHandler] = { + /** Loop through a list of MemberHandlers and select which ones to keep. + * 'wanted' is the set of names that need to be imported. + */ + def select(reqs: List[ReqAndHandler], wanted: Set[Name]): List[ReqAndHandler] = { + val isWanted = wanted contains _ + // Single symbol imports might be implicits! See bug #1752. Rather than + // try to finesse this, we will mimic all imports for now. + def keepHandler(handler: MemberHandler) = handler match { + case _: ImportHandler => true + case x => x.definesImplicit || (x.definedNames exists isWanted) + } + + reqs match { + case Nil => Nil + case rh :: rest if !keepHandler(rh.handler) => select(rest, wanted) + case rh :: rest => + import rh.handler._ + val newWanted = wanted ++ referencedNames -- definedNames -- importedNames + rh :: select(rest, newWanted) + } + } + + /** Flatten the handlers out and pair each with the original request */ + select(allReqAndHandlers reverseMap { case (r, h) => ReqAndHandler(r, h) }, wanted).reverse + } + + val code, trailingBraces, accessPath = new StringBuilder + val currentImps = mutable.HashSet[Name]() + + // add code for a new object to hold some imports + def addWrapper() { + val impname = nme.INTERPRETER_IMPORT_WRAPPER + code append "object %s {\n".format(impname) + trailingBraces append "}\n" + accessPath append ("." + impname) + + currentImps.clear + } + + addWrapper() + + // loop through previous requests, adding imports for each one + for (ReqAndHandler(req, handler) <- reqsToUse) { + handler match { + // If the user entered an import, then just use it; add an import wrapping + // level if the import might conflict with some other import + case x: ImportHandler => + if (x.importsWildcard || (currentImps exists (x.importedNames contains _))) + addWrapper() + + code append (x.member + "\n") + + // give wildcard imports a import wrapper all to their own + if (x.importsWildcard) addWrapper() + else currentImps ++= x.importedNames + + // For other requests, import each defined name. + // import them explicitly instead of with _, so that + // ambiguity errors will not be generated. Also, quote + // the name of the variable, so that we don't need to + // handle quoting keywords separately. + case x => + for (imv <- x.definedNames) { + if (currentImps contains imv) addWrapper() + + code append ("import %s\n" format (req fullPath imv)) + currentImps += imv + } + } + } + // add one extra wrapper, to prevent warnings in the common case of + // redefining the value bound in the last interpreter request. + addWrapper() + ComputedImports(code.toString, trailingBraces.toString, accessPath.toString) + } + + private def allReqAndHandlers = + prevRequestList flatMap (req => req.handlers map (req -> _)) + + private def membersAtPickler(sym: Symbol): List[Symbol] = + atPickler(sym.info.nonPrivateMembers) +} diff --git a/repl/src/main/scala/spark/repl/SparkInteractiveReader.scala b/repl/src/main/scala/spark/repl/SparkInteractiveReader.scala deleted file mode 100644 index 4f5a0a6fa0..0000000000 --- a/repl/src/main/scala/spark/repl/SparkInteractiveReader.scala +++ /dev/null @@ -1,60 +0,0 @@ -/* NSC -- new Scala compiler - * Copyright 2005-2010 LAMP/EPFL - * @author Stepan Koltsov - */ - -package spark.repl - -import scala.tools.nsc -import scala.tools.nsc._ -import scala.tools.nsc.interpreter -import scala.tools.nsc.interpreter._ - -import scala.util.control.Exception._ - -/** Reads lines from an input stream */ -trait SparkInteractiveReader { - import SparkInteractiveReader._ - import java.io.IOException - - protected def readOneLine(prompt: String): String - val interactive: Boolean - - def readLine(prompt: String): String = { - def handler: Catcher[String] = { - case e: IOException if restartSystemCall(e) => readLine(prompt) - } - catching(handler) { readOneLine(prompt) } - } - - // override if history is available - def history: Option[History] = None - def historyList = history map (_.asList) getOrElse Nil - - // override if completion is available - def completion: Option[SparkCompletion] = None - - // hack necessary for OSX jvm suspension because read calls are not restarted after SIGTSTP - private def restartSystemCall(e: Exception): Boolean = - Properties.isMac && (e.getMessage == msgEINTR) -} - - -object SparkInteractiveReader { - val msgEINTR = "Interrupted system call" - private val exes = List(classOf[Exception], classOf[NoClassDefFoundError]) - - def createDefault(): SparkInteractiveReader = createDefault(null) - - /** Create an interactive reader. Uses <code>JLineReader</code> if the - * library is available, but otherwise uses a <code>SimpleReader</code>. - */ - def createDefault(interpreter: SparkInterpreter): SparkInteractiveReader = - try new SparkJLineReader(interpreter) - catch { - case e @ (_: Exception | _: NoClassDefFoundError) => - // println("Failed to create SparkJLineReader(%s): %s".format(interpreter, e)) - new SparkSimpleReader - } -} - diff --git a/repl/src/main/scala/spark/repl/SparkInterpreter.scala b/repl/src/main/scala/spark/repl/SparkInterpreter.scala deleted file mode 100644 index 10ea346658..0000000000 --- a/repl/src/main/scala/spark/repl/SparkInterpreter.scala +++ /dev/null @@ -1,1395 +0,0 @@ -/* NSC -- new Scala compiler - * Copyright 2005-2010 LAMP/EPFL - * @author Martin Odersky - */ - -package spark.repl - -import scala.tools.nsc -import scala.tools.nsc._ - -import Predef.{ println => _, _ } -import java.io.{ File, IOException, PrintWriter, StringWriter, Writer } -import File.pathSeparator -import java.lang.{ Class, ClassLoader } -import java.net.{ MalformedURLException, URL } -import java.lang.reflect -import reflect.InvocationTargetException -import java.util.UUID - -import scala.PartialFunction.{ cond, condOpt } -import scala.tools.util.PathResolver -import scala.reflect.Manifest -import scala.collection.mutable -import scala.collection.mutable.{ ListBuffer, HashSet, HashMap, ArrayBuffer } -import scala.collection.immutable.Set -import scala.tools.nsc.util.ScalaClassLoader -import ScalaClassLoader.URLClassLoader -import scala.util.control.Exception.{ Catcher, catching, ultimately, unwrapping } - -import io.{ PlainFile, VirtualDirectory } -import reporters.{ ConsoleReporter, Reporter } -import symtab.{ Flags, Names } -import util.{ SourceFile, BatchSourceFile, ScriptSourceFile, ClassPath, Chars, stringFromWriter } -import scala.reflect.NameTransformer -import scala.tools.nsc.{ InterpreterResults => IR } -import interpreter._ -import SparkInterpreter._ - -import spark.HttpServer -import spark.Utils - -/** <p> - * An interpreter for Scala code. - * </p> - * <p> - * The main public entry points are <code>compile()</code>, - * <code>interpret()</code>, and <code>bind()</code>. - * The <code>compile()</code> method loads a - * complete Scala file. The <code>interpret()</code> method executes one - * line of Scala code at the request of the user. The <code>bind()</code> - * method binds an object to a variable that can then be used by later - * interpreted code. - * </p> - * <p> - * 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. - * </p> - * <p> - * 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 a single member named "scala_repl_result". To accomodate user expressions - * that read from variables or methods defined in previous statements, "import" - * statements are used. - * </p> - * <p> - * 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. - * </p> - * - * @author Moez A. Abdel-Gawad - * @author Lex Spoon - */ -class SparkInterpreter(val settings: Settings, out: PrintWriter) { - repl => - - def println(x: Any) = { - out.println(x) - out.flush() - } - - /** construct an interpreter that reports to Console */ - def this(settings: Settings) = this(settings, new NewLinePrintWriter(new ConsoleWriter, true)) - def this() = this(new Settings()) - - val SPARK_DEBUG_REPL: Boolean = (System.getenv("SPARK_DEBUG_REPL") == "1") - - /** Local directory to save .class files too */ - val outputDir = { - val tmp = System.getProperty("java.io.tmpdir") - val rootDir = System.getProperty("spark.repl.classdir", tmp) - Utils.createTempDir(rootDir) - } - if (SPARK_DEBUG_REPL) { - println("Output directory: " + outputDir) - } - - /** Scala compiler virtual directory for outputDir */ - //val virtualDirectory = new VirtualDirectory("(memory)", None) - val virtualDirectory = new PlainFile(outputDir) - - /** Jetty server that will serve our classes to worker nodes */ - val classServer = new HttpServer(outputDir) - - // Start the classServer and store its URI in a spark system property - // (which will be passed to executors so that they can connect to it) - classServer.start() - System.setProperty("spark.repl.class.uri", classServer.uri) - if (SPARK_DEBUG_REPL) { - println("Class server started, URI = " + classServer.uri) - } - - /** reporter */ - object reporter extends ConsoleReporter(settings, null, out) { - override def printMessage(msg: String) { - out println clean(msg) - out.flush() - } - } - - /** We're going to go to some trouble to initialize the compiler asynchronously. - * It's critical that nothing call into it until it's been initialized or we will - * run into unrecoverable issues, but the perceived repl startup time goes - * through the roof if we wait for it. So we initialize it with a future and - * use a lazy val to ensure that any attempt to use the compiler object waits - * on the future. - */ - private val _compiler: Global = newCompiler(settings, reporter) - private def _initialize(): Boolean = { - val source = """ - |// this is assembled to force the loading of approximately the - |// classes which will be loaded on the first expression anyway. - |class $repl_$init { - | val x = "abc".reverse.length + (5 max 5) - | scala.runtime.ScalaRunTime.stringOf(x) - |} - |""".stripMargin - - try { - new _compiler.Run() compileSources List(new BatchSourceFile("<init>", source)) - if (isReplDebug || settings.debug.value) - println("Repl compiler initialized.") - true - } - catch { - case MissingRequirementError(msg) => println(""" - |Failed to initialize compiler: %s not found. - |** Note that as of 2.8 scala does not assume use of the java classpath. - |** For the old behavior pass -usejavacp to scala, or if using a Settings - |** object programatically, settings.usejavacp.value = true.""".stripMargin.format(msg) - ) - false - } - } - - // set up initialization future - private var _isInitialized: () => Boolean = null - def initialize() = synchronized { - if (_isInitialized == null) - _isInitialized = scala.concurrent.ops future _initialize() - } - - /** the public, go through the future compiler */ - lazy val compiler: Global = { - initialize() - - // blocks until it is ; false means catastrophic failure - if (_isInitialized()) _compiler - else null - } - - import compiler.{ Traverser, CompilationUnit, Symbol, Name, Type } - import compiler.{ - Tree, TermTree, ValOrDefDef, ValDef, DefDef, Assign, ClassDef, - ModuleDef, Ident, Select, TypeDef, Import, MemberDef, DocDef, - ImportSelector, EmptyTree, NoType } - import compiler.{ nme, newTermName, newTypeName } - import nme.{ - INTERPRETER_VAR_PREFIX, INTERPRETER_SYNTHVAR_PREFIX, INTERPRETER_LINE_PREFIX, - INTERPRETER_IMPORT_WRAPPER, INTERPRETER_WRAPPER_SUFFIX, USCOREkw - } - - import compiler.definitions - import definitions.{ EmptyPackage, getMember } - - /** whether to print out result lines */ - private[repl] var printResults: Boolean = true - - /** Temporarily be quiet */ - def beQuietDuring[T](operation: => T): T = { - val wasPrinting = printResults - ultimately(printResults = wasPrinting) { - printResults = false - operation - } - } - - /** whether to bind the lastException variable */ - private var bindLastException = true - - /** Temporarily stop binding lastException */ - def withoutBindingLastException[T](operation: => T): T = { - val wasBinding = bindLastException - ultimately(bindLastException = wasBinding) { - bindLastException = false - operation - } - } - - /** interpreter settings */ - lazy val isettings = new SparkInterpreterSettings(this) - - /** Instantiate a compiler. Subclasses can override this to - * change the compiler class used by this interpreter. */ - protected def newCompiler(settings: Settings, reporter: Reporter) = { - settings.outputDirs setSingleOutput virtualDirectory - new Global(settings, reporter) - } - - /** the compiler's classpath, as URL's */ - lazy val compilerClasspath: List[URL] = new PathResolver(settings) asURLs - - /* A single class loader is used for all commands interpreted by this Interpreter. - It would also be possible to create a new class loader for each command - to interpret. The advantages of the current approach are: - - - Expressions are only evaluated one time. This is especially - significant for I/O, e.g. "val x = Console.readLine" - - The main disadvantage is: - - - Objects, classes, and methods cannot be rebound. Instead, definitions - shadow the old ones, and old code objects refer to the old - definitions. - */ - private var _classLoader: ClassLoader = null - def resetClassLoader() = _classLoader = makeClassLoader() - def classLoader: ClassLoader = { - if (_classLoader == null) - resetClassLoader() - - _classLoader - } - private def makeClassLoader(): ClassLoader = { - /* - val parent = - if (parentClassLoader == null) ScalaClassLoader fromURLs compilerClasspath - else new URLClassLoader(compilerClasspath, parentClassLoader) - - new AbstractFileClassLoader(virtualDirectory, parent) - */ - val parent = - if (parentClassLoader == null) - new java.net.URLClassLoader(compilerClasspath.toArray) - else - new java.net.URLClassLoader(compilerClasspath.toArray, - parentClassLoader) - val virtualDirUrl = new URL("file://" + virtualDirectory.path + "/") - new java.net.URLClassLoader(Array(virtualDirUrl), parent) - } - - private def loadByName(s: String): Class[_] = // (classLoader tryToInitializeClass s).get - Class.forName(s, true, classLoader) - - private def methodByName(c: Class[_], name: String): reflect.Method = - c.getMethod(name, classOf[Object]) - - protected def parentClassLoader: ClassLoader = this.getClass.getClassLoader() - def getInterpreterClassLoader() = classLoader - - // Set the current Java "context" class loader to this interpreter's class loader - def setContextClassLoader() = Thread.currentThread.setContextClassLoader(classLoader) - - /** the previous requests this interpreter has processed */ - private val prevRequests = new ArrayBuffer[Request]() - private val usedNameMap = new HashMap[Name, Request]() - private val boundNameMap = new HashMap[Name, Request]() - private def allHandlers = prevRequests.toList flatMap (_.handlers) - private def allReqAndHandlers = prevRequests.toList flatMap (req => req.handlers map (req -> _)) - - def printAllTypeOf = { - prevRequests foreach { req => - req.typeOf foreach { case (k, v) => Console.println(k + " => " + v) } - } - } - - /** Most recent tree handled which wasn't wholly synthetic. */ - private def mostRecentlyHandledTree: Option[Tree] = { - for { - req <- prevRequests.reverse - handler <- req.handlers.reverse - name <- handler.generatesValue - if !isSynthVarName(name) - } return Some(handler.member) - - None - } - - def recordRequest(req: Request) { - def tripart[T](set1: Set[T], set2: Set[T]) = { - val intersect = set1 intersect set2 - List(set1 -- intersect, intersect, set2 -- intersect) - } - - prevRequests += req - req.usedNames foreach (x => usedNameMap(x) = req) - req.boundNames foreach (x => boundNameMap(x) = req) - - // XXX temporarily putting this here because of tricky initialization order issues - // so right now it's not bound until after you issue a command. - if (prevRequests.size == 1) - quietBind("settings", "spark.repl.SparkInterpreterSettings", isettings) - - // println("\n s1 = %s\n s2 = %s\n s3 = %s".format( - // tripart(usedNameMap.keysIterator.toSet, boundNameMap.keysIterator.toSet): _* - // )) - } - - private def keyList[T](x: collection.Map[T, _]): List[T] = x.keys.toList sortBy (_.toString) - def allUsedNames = keyList(usedNameMap) - def allBoundNames = keyList(boundNameMap) - def allSeenTypes = prevRequests.toList flatMap (_.typeOf.values.toList) distinct - def allValueGeneratingNames = allHandlers flatMap (_.generatesValue) - def allImplicits = partialFlatMap(allHandlers) { - case x: MemberHandler if x.definesImplicit => x.boundNames - } - - /** Generates names pre0, pre1, etc. via calls to apply method */ - class NameCreator(pre: String) { - private var x = -1 - var mostRecent: String = null - - def apply(): String = { - x += 1 - val name = pre + x.toString - // make sure we don't overwrite their unwisely named res3 etc. - mostRecent = - if (allBoundNames exists (_.toString == name)) apply() - else name - - mostRecent - } - def reset(): Unit = x = -1 - def didGenerate(name: String) = - (name startsWith pre) && ((name drop pre.length) forall (_.isDigit)) - } - - /** allocate a fresh line name */ - private lazy val lineNameCreator = new NameCreator(INTERPRETER_LINE_PREFIX) - - /** allocate a fresh var name */ - private lazy val varNameCreator = new NameCreator(INTERPRETER_VAR_PREFIX) - - /** allocate a fresh internal variable name */ - private lazy val synthVarNameCreator = new NameCreator(INTERPRETER_SYNTHVAR_PREFIX) - - /** Check if a name looks like it was generated by varNameCreator */ - private def isGeneratedVarName(name: String): Boolean = varNameCreator didGenerate name - private def isSynthVarName(name: String): Boolean = synthVarNameCreator didGenerate name - private def isSynthVarName(name: Name): Boolean = synthVarNameCreator didGenerate name.toString - - def getVarName = varNameCreator() - def getSynthVarName = synthVarNameCreator() - - /** Truncate a string if it is longer than isettings.maxPrintString */ - private def truncPrintString(str: String): String = { - val maxpr = isettings.maxPrintString - val trailer = "..." - - if (maxpr <= 0 || str.length <= maxpr) str - else str.substring(0, maxpr-3) + trailer - } - - /** Clean up a string for output */ - private def clean(str: String) = truncPrintString( - if (isettings.unwrapStrings && !SPARK_DEBUG_REPL) stripWrapperGunk(str) - else str - ) - - /** Heuristically strip interpreter wrapper prefixes - * from an interpreter output string. - * MATEI: Copied from interpreter package object - */ - def stripWrapperGunk(str: String): String = { - val wrapregex = """(line[0-9]+\$object[$.])?(\$?VAL.?)*(\$iwC?(.this)?[$.])*""" - str.replaceAll(wrapregex, "") - } - - /** Indent some code by the width of the scala> prompt. - * This way, compiler error messages read better. - */ - private final val spaces = List.fill(7)(" ").mkString - def indentCode(code: String) = { - /** Heuristic to avoid indenting and thereby corrupting """-strings and XML literals. */ - val noIndent = (code contains "\n") && (List("\"\"\"", "</", "/>") exists (code contains _)) - stringFromWriter(str => - for (line <- code.lines) { - if (!noIndent) - str.print(spaces) - - str.print(line + "\n") - str.flush() - }) - } - def indentString(s: String) = s split "\n" map (spaces + _ + "\n") mkString - - implicit def name2string(name: Name) = name.toString - - /** Compute imports that allow definitions from previous - * requests to be visible in a new request. Returns - * three pieces of related code: - * - * 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 traverested 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. - */ - private case class ComputedImports(prepend: String, append: String, access: String) - private def importsCode(wanted: Set[Name]): ComputedImports = { - /** Narrow down the list of requests from which imports - * should be taken. Removes requests which cannot contribute - * useful imports for the specified set of wanted names. - */ - case class ReqAndHandler(req: Request, handler: MemberHandler) { } - - def reqsToUse: List[ReqAndHandler] = { - /** Loop through a list of MemberHandlers and select which ones to keep. - * 'wanted' is the set of names that need to be imported. - */ - def select(reqs: List[ReqAndHandler], wanted: Set[Name]): List[ReqAndHandler] = { - val isWanted = wanted contains _ - // Single symbol imports might be implicits! See bug #1752. Rather than - // try to finesse this, we will mimic all imports for now. - def keepHandler(handler: MemberHandler) = handler match { - case _: ImportHandler => true - case x => x.definesImplicit || (x.boundNames exists isWanted) - } - - reqs match { - case Nil => Nil - case rh :: rest if !keepHandler(rh.handler) => select(rest, wanted) - case rh :: rest => - val importedNames = rh.handler match { case x: ImportHandler => x.importedNames ; case _ => Nil } - import rh.handler._ - val newWanted = wanted ++ usedNames -- boundNames -- importedNames - rh :: select(rest, newWanted) - } - } - - /** Flatten the handlers out and pair each with the original request */ - select(allReqAndHandlers reverseMap { case (r, h) => ReqAndHandler(r, h) }, wanted).reverse - } - - val code, trailingLines, accessPath = new StringBuffer - val currentImps = HashSet[Name]() - - // add code for a new object to hold some imports - def addWrapper() { - /* - val impname = INTERPRETER_IMPORT_WRAPPER - code append "object %s {\n".format(impname) - trailingLines append "}\n" - accessPath append ("." + impname) - currentImps.clear - */ - val impname = INTERPRETER_IMPORT_WRAPPER - code.append("@serializable class " + impname + "C {\n") - trailingLines.append("}\nval " + impname + " = new " + impname + "C;\n") - accessPath.append("." + impname) - currentImps.clear - } - - addWrapper() - - // loop through previous requests, adding imports for each one - for (ReqAndHandler(req, handler) <- reqsToUse) { - handler match { - // If the user entered an import, then just use it; add an import wrapping - // level if the import might conflict with some other import - case x: ImportHandler => - if (x.importsWildcard || (currentImps exists (x.importedNames contains _))) - addWrapper() - - code append (x.member.toString + "\n") - - // give wildcard imports a import wrapper all to their own - if (x.importsWildcard) addWrapper() - else currentImps ++= x.importedNames - - // For other requests, import each bound variable. - // import them explicitly instead of with _, so that - // ambiguity errors will not be generated. Also, quote - // the name of the variable, so that we don't need to - // handle quoting keywords separately. - case x => - for (imv <- x.boundNames) { - // MATEI: Commented this check out because it was messing up for case classes - // (trying to import them twice within the same wrapper), but that is more likely - // due to a miscomputation of names that makes the code think they're unique. - // Need to evaluate whether having so many wrappers is a bad thing. - /*if (currentImps contains imv) */ addWrapper() - - code.append("val " + req.objectName + "$VAL = " + req.objectName + ".INSTANCE;\n") - code.append("import " + req.objectName + "$VAL" + req.accessPath + ".`" + imv + "`;\n") - - //code append ("import %s\n" format (req fullPath imv)) - currentImps += imv - } - } - } - // add one extra wrapper, to prevent warnings in the common case of - // redefining the value bound in the last interpreter request. - addWrapper() - ComputedImports(code.toString, trailingLines.toString, accessPath.toString) - } - - /** Parse a line into a sequence of trees. Returns None if the input is incomplete. */ - private def parse(line: String): Option[List[Tree]] = { - var justNeedsMore = false - reporter.withIncompleteHandler((pos,msg) => {justNeedsMore = true}) { - // simple parse: just parse it, nothing else - def simpleParse(code: String): List[Tree] = { - reporter.reset - val unit = new CompilationUnit(new BatchSourceFile("<console>", code)) - val scanner = new compiler.syntaxAnalyzer.UnitParser(unit) - - scanner.templateStatSeq(false)._2 - } - val trees = simpleParse(line) - - if (reporter.hasErrors) Some(Nil) // the result did not parse, so stop - else if (justNeedsMore) None - else Some(trees) - } - } - - /** Compile an nsc SourceFile. Returns true if there are - * no compilation errors, or false otherwise. - */ - def compileSources(sources: SourceFile*): Boolean = { - reporter.reset - new compiler.Run() compileSources sources.toList - !reporter.hasErrors - } - - /** Compile a string. Returns true if there are no - * compilation errors, or false otherwise. - */ - def compileString(code: String): Boolean = - compileSources(new BatchSourceFile("<script>", code)) - - def compileAndSaveRun(label: String, code: String) = { - if (SPARK_DEBUG_REPL) - println(code) - if (isReplDebug) { - parse(code) match { - case Some(trees) => trees foreach (t => DBG(compiler.asCompactString(t))) - case _ => DBG("Parse error:\n\n" + code) - } - } - val run = new compiler.Run() - run.compileSources(List(new BatchSourceFile(label, code))) - run - } - - /** Build a request from the user. <code>trees</code> is <code>line</code> - * after being parsed. - */ - private def buildRequest(line: String, lineName: String, trees: List[Tree]): Request = - new Request(line, lineName, trees) - - private def chooseHandler(member: Tree): MemberHandler = member match { - case member: DefDef => new DefHandler(member) - case member: ValDef => new ValHandler(member) - case member@Assign(Ident(_), _) => new AssignHandler(member) - case member: ModuleDef => new ModuleHandler(member) - case member: ClassDef => new ClassHandler(member) - case member: TypeDef => new TypeAliasHandler(member) - case member: Import => new ImportHandler(member) - case DocDef(_, documented) => chooseHandler(documented) - case member => new GenericHandler(member) - } - - private def requestFromLine(line: String, synthetic: Boolean): Either[IR.Result, Request] = { - val trees = parse(indentCode(line)) match { - case None => return Left(IR.Incomplete) - case Some(Nil) => return Left(IR.Error) // parse error or empty input - case Some(trees) => trees - } - - // use synthetic vars to avoid filling up the resXX slots - def varName = if (synthetic) getSynthVarName else getVarName - - // Treat a single bare expression specially. This is necessary due to it being hard to - // modify code at a textual level, and it being hard to submit an AST to the compiler. - if (trees.size == 1) trees.head match { - case _:Assign => // we don't want to include assignments - case _:TermTree | _:Ident | _:Select => // ... but do want these as valdefs. - return requestFromLine("val %s =\n%s".format(varName, line), synthetic) - case _ => - } - - // figure out what kind of request - Right(buildRequest(line, lineNameCreator(), trees)) - } - - /** <p> - * 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. - * </p> - * <p> - * The return value is whether the line was interpreter successfully, - * e.g. that there were no parse errors. - * </p> - * - * @param line ... - * @return ... - */ - def interpret(line: String): IR.Result = interpret(line, false) - def interpret(line: String, synthetic: Boolean): IR.Result = { - def loadAndRunReq(req: Request) = { - val (result, succeeded) = req.loadAndRun - if (printResults || !succeeded) - out print clean(result) - - // book-keeping - if (succeeded && !synthetic) - recordRequest(req) - - if (succeeded) IR.Success - else IR.Error - } - - if (compiler == null) IR.Error - else requestFromLine(line, synthetic) match { - case Left(result) => result - case Right(req) => - // null indicates a disallowed statement type; otherwise compile and - // fail if false (implying e.g. a type error) - if (req == null || !req.compile) IR.Error - else loadAndRunReq(req) - } - } - - /** A name creator used for objects created by <code>bind()</code>. */ - private lazy val newBinder = new NameCreator("binder") - - /** Bind a specified name to a specified value. The name may - * later be used by expressions passed to interpret. - * - * @param name the variable name to bind - * @param boundType the type of the variable, as a string - * @param value the object value to bind to it - * @return an indication of whether the binding succeeded - */ - def bind(name: String, boundType: String, value: Any): IR.Result = { - val binderName = newBinder() - - compileString(""" - |object %s { - | var value: %s = _ - | def set(x: Any) = value = x.asInstanceOf[%s] - |} - """.stripMargin.format(binderName, boundType, boundType)) - - val binderObject = loadByName(binderName) - val setterMethod = methodByName(binderObject, "set") - - setterMethod.invoke(null, value.asInstanceOf[AnyRef]) - interpret("val %s = %s.value".format(name, binderName)) - } - - def quietBind(name: String, boundType: String, value: Any): IR.Result = - beQuietDuring { bind(name, boundType, value) } - - /** Reset this interpreter, forgetting all user-specified requests. */ - def reset() { - //virtualDirectory.clear - virtualDirectory.delete - virtualDirectory.create - resetClassLoader() - lineNameCreator.reset() - varNameCreator.reset() - prevRequests.clear - } - - /** <p> - * This instance is no longer needed, so release any resources - * it is using. The reporter's output gets flushed. - * </p> - */ - def close() { - reporter.flush - classServer.stop() - } - - /** A traverser that finds all mentioned identifiers, i.e. things - * that need to be imported. It might return extra names. - */ - private class ImportVarsTraverser extends Traverser { - val importVars = new HashSet[Name]() - - override def traverse(ast: Tree) = ast match { - // XXX this is obviously inadequate but it's going to require some effort - // to get right. - case Ident(name) if !(name.toString startsWith "x$") => importVars += name - case _ => super.traverse(ast) - } - } - - /** Class to handle one member among all the members included - * in a single interpreter request. - */ - private sealed abstract class MemberHandler(val member: Tree) { - lazy val usedNames: List[Name] = { - val ivt = new ImportVarsTraverser() - ivt traverse member - ivt.importVars.toList - } - def boundNames: List[Name] = Nil - val definesImplicit = cond(member) { - case tree: MemberDef => tree.mods hasFlag Flags.IMPLICIT - } - def generatesValue: Option[Name] = None - - def extraCodeToEvaluate(req: Request, code: PrintWriter) { } - def resultExtractionCode(req: Request, code: PrintWriter) { } - - override def toString = "%s(used = %s)".format(this.getClass.toString split '.' last, usedNames) - } - - private class GenericHandler(member: Tree) extends MemberHandler(member) - - private class ValHandler(member: ValDef) extends MemberHandler(member) { - lazy val ValDef(mods, vname, _, _) = member - lazy val prettyName = NameTransformer.decode(vname) - lazy val isLazy = mods hasFlag Flags.LAZY - - override lazy val boundNames = List(vname) - override def generatesValue = Some(vname) - - override def resultExtractionCode(req: Request, code: PrintWriter) { - val isInternal = isGeneratedVarName(vname) && req.typeOfEnc(vname) == "Unit" - if (!mods.isPublic || isInternal) return - - lazy val extractor = "scala.runtime.ScalaRunTime.stringOf(%s)".format(req fullPath vname) - - // if this is a lazy val we avoid evaluating it here - val resultString = if (isLazy) codegenln(false, "<lazy>") else extractor - val codeToPrint = - """ + "%s: %s = " + %s""".format(prettyName, string2code(req typeOf vname), resultString) - - code print codeToPrint - } - } - - private class DefHandler(defDef: DefDef) extends MemberHandler(defDef) { - lazy val DefDef(mods, name, _, vparamss, _, _) = defDef - override lazy val boundNames = List(name) - // true if 0-arity - override def generatesValue = - if (vparamss.isEmpty || vparamss.head.isEmpty) Some(name) - else None - - override def resultExtractionCode(req: Request, code: PrintWriter) = - if (mods.isPublic) code print codegenln(name, ": ", req.typeOf(name)) - } - - private class AssignHandler(member: Assign) extends MemberHandler(member) { - val lhs = member.lhs.asInstanceOf[Ident] // an unfortunate limitation - val helperName = newTermName(synthVarNameCreator()) - override def generatesValue = Some(helperName) - - override def extraCodeToEvaluate(req: Request, code: PrintWriter) = - code println """val %s = %s""".format(helperName, lhs) - - /** Print out lhs instead of the generated varName */ - override def resultExtractionCode(req: Request, code: PrintWriter) { - val lhsType = string2code(req typeOfEnc helperName) - val res = string2code(req fullPath helperName) - val codeToPrint = """ + "%s: %s = " + %s + "\n" """.format(lhs, lhsType, res) - - code println codeToPrint - } - } - - private class ModuleHandler(module: ModuleDef) extends MemberHandler(module) { - lazy val ModuleDef(mods, name, _) = module - override lazy val boundNames = List(name) - override def generatesValue = Some(name) - - override def resultExtractionCode(req: Request, code: PrintWriter) = - code println codegenln("defined module ", name) - } - - private class ClassHandler(classdef: ClassDef) extends MemberHandler(classdef) { - lazy val ClassDef(mods, name, _, _) = classdef - override lazy val boundNames = - name :: (if (mods hasFlag Flags.CASE) List(name.toTermName) else Nil) - - override def resultExtractionCode(req: Request, code: PrintWriter) = - code print codegenln("defined %s %s".format(classdef.keyword, name)) - } - - private class TypeAliasHandler(typeDef: TypeDef) extends MemberHandler(typeDef) { - lazy val TypeDef(mods, name, _, _) = typeDef - def isAlias() = mods.isPublic && compiler.treeInfo.isAliasTypeDef(typeDef) - override lazy val boundNames = if (isAlias) List(name) else Nil - - override def resultExtractionCode(req: Request, code: PrintWriter) = - code println codegenln("defined type alias ", name) - } - - private class ImportHandler(imp: Import) extends MemberHandler(imp) { - lazy val Import(expr, selectors) = imp - def targetType = stringToCompilerType(expr.toString) match { - case NoType => None - case x => Some(x) - } - - private def selectorWild = selectors filter (_.name == USCOREkw) // wildcard imports, e.g. import foo._ - private def selectorMasked = selectors filter (_.rename == USCOREkw) // masking imports, e.g. import foo.{ bar => _ } - private def selectorNames = selectors map (_.name) - private def selectorRenames = selectors map (_.rename) filterNot (_ == null) - - /** Whether this import includes a wildcard import */ - val importsWildcard = selectorWild.nonEmpty - - /** Complete list of names imported by a wildcard */ - def wildcardImportedNames: List[Name] = ( - for (tpe <- targetType ; if importsWildcard) yield - tpe.nonPrivateMembers filter (x => x.isMethod && x.isPublic) map (_.name) distinct - ).toList.flatten - - /** The individual names imported by this statement */ - /** XXX come back to this and see what can be done with wildcards now that - * we know how to enumerate the identifiers. - */ - val importedNames: List[Name] = - selectorRenames filterNot (_ == USCOREkw) flatMap (x => List(x.toTypeName, x.toTermName)) - - override def resultExtractionCode(req: Request, code: PrintWriter) = - code println codegenln(imp.toString) - } - - /** One line of code submitted by the user for interpretation */ - private class Request(val line: String, val lineName: String, val trees: List[Tree]) { - /** name to use for the object that will compute "line" */ - def objectName = lineName + INTERPRETER_WRAPPER_SUFFIX - - /** name of the object that retrieves the result from the above object */ - def resultObjectName = "RequestResult$" + objectName - - /** handlers for each tree in this request */ - val handlers: List[MemberHandler] = trees map chooseHandler - - /** all (public) names defined by these statements */ - val boundNames = handlers flatMap (_.boundNames) - - /** list of names used by this expression */ - val usedNames: List[Name] = handlers flatMap (_.usedNames) - - /** def and val names */ - def defNames = partialFlatMap(handlers) { case x: DefHandler => x.boundNames } - def valueNames = partialFlatMap(handlers) { - case x: AssignHandler => List(x.helperName) - case x: ValHandler => boundNames - case x: ModuleHandler => List(x.name) - } - - /** Code to import bound names from previous lines - accessPath is code to - * append to objectName to access anything bound by request. - */ - val ComputedImports(importsPreamble, importsTrailer, accessPath) = - importsCode(Set.empty ++ usedNames) - - /** Code to access a variable with the specified name */ - def fullPath(vname: String): String = "%s.`%s`".format(objectName + ".INSTANCE" + accessPath, vname) - - /** Code to access a variable with the specified name */ - def fullPath(vname: Name): String = fullPath(vname.toString) - - /** the line of code to compute */ - def toCompute = line - - /** generate the source code for the object that computes this request */ - def objectSourceCode: String = stringFromWriter { code => - val preamble = """ - |@serializable class %s { - | %s%s - """.stripMargin.format(objectName, importsPreamble, indentCode(toCompute)) - val postamble = importsTrailer + "\n}" - - code println preamble - handlers foreach { _.extraCodeToEvaluate(this, code) } - code println postamble - - //create an object - code.println("object " + objectName + " {") - code.println(" val INSTANCE = new " + objectName + "();") - code.println("}") - } - - /** generate source code for the object that retrieves the result - from objectSourceCode */ - def resultObjectSourceCode: String = stringFromWriter { code => - /** We only want to generate this code when the result - * is a value which can be referred to as-is. - */ - val valueExtractor = handlers.last.generatesValue match { - case Some(vname) if typeOf contains vname => - """ - |lazy val scala_repl_value = { - | scala_repl_result - | %s - |}""".stripMargin.format(fullPath(vname)) - case _ => "" - } - - // first line evaluates object to make sure constructor is run - // initial "" so later code can uniformly be: + etc - val preamble = """ - |object %s { - | %s - | val scala_repl_result: String = { - | %s - | ("" - """.stripMargin.format(resultObjectName, valueExtractor, objectName + ".INSTANCE" + accessPath) - - val postamble = """ - | ) - | } - |} - """.stripMargin - - code println preamble - if (printResults) { - handlers foreach { _.resultExtractionCode(this, code) } - } - code println postamble - } - - // compile the object containing the user's code - lazy val objRun = compileAndSaveRun("<console>", objectSourceCode) - - // compile the result-extraction object - lazy val extractionObjectRun = compileAndSaveRun("<console>", resultObjectSourceCode) - - lazy val loadedResultObject = loadByName(resultObjectName) - - def extractionValue(): Option[AnyRef] = { - // ensure it has run - extractionObjectRun - - // load it and retrieve the value - try Some(loadedResultObject getMethod "scala_repl_value" invoke loadedResultObject) - catch { case _: Exception => None } - } - - /** Compile the object file. Returns whether the compilation succeeded. - * If all goes well, the "types" map is computed. */ - def compile(): Boolean = { - // error counting is wrong, hence interpreter may overlook failure - so we reset - reporter.reset - - // compile the main object - objRun - - // bail on error - if (reporter.hasErrors) - return false - - // extract and remember types - typeOf - - // compile the result-extraction object - extractionObjectRun - - // success - !reporter.hasErrors - } - - def atNextPhase[T](op: => T): T = compiler.atPhase(objRun.typerPhase.next)(op) - - /** The outermost wrapper object */ - lazy val outerResObjSym: Symbol = getMember(EmptyPackage, newTermName(objectName).toTypeName) - - /** The innermost object inside the wrapper, found by - * following accessPath into the outer one. */ - lazy val resObjSym = - accessPath.split("\\.").foldLeft(outerResObjSym) { (sym, name) => - if (name == "") sym else - atNextPhase(sym.info member newTermName(name)) - } - - /* typeOf lookup with encoding */ - def typeOfEnc(vname: Name) = typeOf(compiler encode vname) - - /** Types of variables defined by this request. */ - lazy val typeOf: Map[Name, String] = { - def getTypes(names: List[Name], nameMap: Name => Name): Map[Name, String] = { - names.foldLeft(Map.empty[Name, String]) { (map, name) => - val rawType = atNextPhase(resObjSym.info.member(name).tpe) - // the types are all =>T; remove the => - val cleanedType = rawType match { - case compiler.PolyType(Nil, rt) => rt - case rawType => rawType - } - - map + (name -> atNextPhase(cleanedType.toString)) - } - } - - getTypes(valueNames, nme.getterToLocal(_)) ++ getTypes(defNames, identity) - } - - /** load and run the code using reflection */ - def loadAndRun: (String, Boolean) = { - val resultValMethod: reflect.Method = loadedResultObject getMethod "scala_repl_result" - // XXX if wrapperExceptions isn't type-annotated we crash scalac - val wrapperExceptions: List[Class[_ <: Throwable]] = - List(classOf[InvocationTargetException], classOf[ExceptionInInitializerError]) - - /** We turn off the binding to accomodate ticket #2817 */ - def onErr: Catcher[(String, Boolean)] = { - case t: Throwable if bindLastException => - withoutBindingLastException { - quietBind("lastException", "java.lang.Throwable", t) - (stringFromWriter(t.printStackTrace(_)), false) - } - } - - catching(onErr) { - unwrapping(wrapperExceptions: _*) { - (resultValMethod.invoke(loadedResultObject).toString, true) - } - } - } - - override def toString = "Request(line=%s, %s trees)".format(line, trees.size) - } - - /** A container class for methods to be injected into the repl - * in power mode. - */ - object power { - lazy val compiler: repl.compiler.type = repl.compiler - import compiler.{ phaseNames, atPhase, currentRun } - - def mkContext(code: String = "") = compiler.analyzer.rootContext(mkUnit(code)) - def mkAlias(name: String, what: String) = interpret("type %s = %s".format(name, what)) - def mkSourceFile(code: String) = new BatchSourceFile("<console>", code) - def mkUnit(code: String) = new CompilationUnit(mkSourceFile(code)) - - def mkTree(code: String): Tree = mkTrees(code).headOption getOrElse EmptyTree - def mkTrees(code: String): List[Tree] = parse(code) getOrElse Nil - def mkTypedTrees(code: String*): List[compiler.Tree] = { - class TyperRun extends compiler.Run { - override def stopPhase(name: String) = name == "superaccessors" - } - - reporter.reset - val run = new TyperRun - run compileSources (code.toList.zipWithIndex map { - case (s, i) => new BatchSourceFile("<console %d>".format(i), s) - }) - run.units.toList map (_.body) - } - def mkTypedTree(code: String) = mkTypedTrees(code).head - def mkType(id: String): compiler.Type = stringToCompilerType(id) - - def dump(): String = ( - ("Names used: " :: allUsedNames) ++ - ("\nIdentifiers: " :: unqualifiedIds) - ) mkString " " - - lazy val allPhases: List[Phase] = phaseNames map (currentRun phaseNamed _) - def atAllPhases[T](op: => T): List[(String, T)] = allPhases map (ph => (ph.name, atPhase(ph)(op))) - def showAtAllPhases(op: => Any): Unit = - atAllPhases(op.toString) foreach { case (ph, op) => Console.println("%15s -> %s".format(ph, op take 240)) } - } - - def unleash(): Unit = beQuietDuring { - interpret("import scala.tools.nsc._") - repl.bind("repl", "spark.repl.SparkInterpreter", this) - interpret("val global: repl.compiler.type = repl.compiler") - interpret("val power: repl.power.type = repl.power") - // interpret("val replVars = repl.replVars") - } - - /** Artificial object demonstrating completion */ - // lazy val replVars = CompletionAware( - // Map[String, CompletionAware]( - // "ids" -> CompletionAware(() => unqualifiedIds, completionAware _), - // "synthVars" -> CompletionAware(() => allBoundNames filter isSynthVarName map (_.toString)), - // "types" -> CompletionAware(() => allSeenTypes map (_.toString)), - // "implicits" -> CompletionAware(() => allImplicits map (_.toString)) - // ) - // ) - - /** Returns the name of the most recent interpreter result. - * Mostly this exists so you can conveniently invoke methods on - * the previous result. - */ - def mostRecentVar: String = - if (mostRecentlyHandledTree.isEmpty) "" - else mostRecentlyHandledTree.get match { - case x: ValOrDefDef => x.name - case Assign(Ident(name), _) => name - case ModuleDef(_, name, _) => name - case _ => onull(varNameCreator.mostRecent) - } - - private def requestForName(name: Name): Option[Request] = - prevRequests.reverse find (_.boundNames contains name) - - private def requestForIdent(line: String): Option[Request] = requestForName(newTermName(line)) - - def stringToCompilerType(id: String): compiler.Type = { - // if it's a recognized identifier, the type of that; otherwise treat the - // String like a value (e.g. scala.collection.Map) . - def findType = typeForIdent(id) match { - case Some(x) => definitions.getClass(newTermName(x)).tpe - case _ => definitions.getModule(newTermName(id)).tpe - } - - try findType catch { case _: MissingRequirementError => NoType } - } - - def typeForIdent(id: String): Option[String] = - requestForIdent(id) flatMap (x => x.typeOf get newTermName(id)) - - def methodsOf(name: String) = - evalExpr[List[String]](methodsCode(name)) map (x => NameTransformer.decode(getOriginalName(x))) - - def completionAware(name: String) = { - // XXX working around "object is not a value" crash, i.e. - // import java.util.ArrayList ; ArrayList.<tab> - clazzForIdent(name) flatMap (_ => evalExpr[Option[CompletionAware]](asCompletionAwareCode(name))) - } - - def extractionValueForIdent(id: String): Option[AnyRef] = - requestForIdent(id) flatMap (_.extractionValue) - - /** Executes code looking for a manifest of type T. - */ - def manifestFor[T: Manifest] = - evalExpr[Manifest[T]]("""manifest[%s]""".format(manifest[T])) - - /** Executes code looking for an implicit value of type T. - */ - def implicitFor[T: Manifest] = { - val s = manifest[T].toString - evalExpr[Option[T]]("{ def f(implicit x: %s = null): %s = x ; Option(f) }".format(s, s)) - // We don't use implicitly so as to fail without failing. - // evalExpr[T]("""implicitly[%s]""".format(manifest[T])) - } - /** Executes code looking for an implicit conversion from the type - * of the given identifier to CompletionAware. - */ - def completionAwareImplicit[T](id: String) = { - val f1string = "%s => %s".format(typeForIdent(id).get, classOf[CompletionAware].getName) - val code = """{ - | def f(implicit x: (%s) = null): %s = x - | val f1 = f - | if (f1 == null) None else Some(f1(%s)) - |}""".stripMargin.format(f1string, f1string, id) - - evalExpr[Option[CompletionAware]](code) - } - - def clazzForIdent(id: String): Option[Class[_]] = - extractionValueForIdent(id) flatMap (x => Option(x) map (_.getClass)) - - private def methodsCode(name: String) = - "%s.%s(%s)".format(classOf[ReflectionCompletion].getName, "methodsOf", name) - - private def asCompletionAwareCode(name: String) = - "%s.%s(%s)".format(classOf[CompletionAware].getName, "unapply", name) - - private def getOriginalName(name: String): String = - nme.originalName(newTermName(name)).toString - - case class InterpreterEvalException(msg: String) extends Exception(msg) - def evalError(msg: String) = throw InterpreterEvalException(msg) - - /** The user-facing eval in :power mode wraps an Option. - */ - def eval[T: Manifest](line: String): Option[T] = - try Some(evalExpr[T](line)) - catch { case InterpreterEvalException(msg) => out println indentString(msg) ; None } - - def evalExpr[T: Manifest](line: String): T = { - // Nothing means the type could not be inferred. - if (manifest[T] eq Manifest.Nothing) - evalError("Could not infer type: try 'eval[SomeType](%s)' instead".format(line)) - - val lhs = getSynthVarName - beQuietDuring { interpret("val " + lhs + " = { " + line + " } ") } - - // TODO - can we meaningfully compare the inferred type T with - // the internal compiler Type assigned to lhs? - // def assignedType = prevRequests.last.typeOf(newTermName(lhs)) - - val req = requestFromLine(lhs, true) match { - case Left(result) => evalError(result.toString) - case Right(req) => req - } - if (req == null || !req.compile || req.handlers.size != 1) - evalError("Eval error.") - - try req.extractionValue.get.asInstanceOf[T] catch { - case e: Exception => evalError(e.getMessage) - } - } - - def interpretExpr[T: Manifest](code: String): Option[T] = beQuietDuring { - interpret(code) match { - case IR.Success => - try prevRequests.last.extractionValue map (_.asInstanceOf[T]) - catch { case e: Exception => out println e ; None } - case _ => None - } - } - - /** Another entry point for tab-completion, ids in scope */ - private def unqualifiedIdNames() = partialFlatMap(allHandlers) { - case x: AssignHandler => List(x.helperName) - case x: ValHandler => List(x.vname) - case x: ModuleHandler => List(x.name) - case x: DefHandler => List(x.name) - case x: ImportHandler => x.importedNames - } filterNot isSynthVarName - - /** 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. - */ - def wildcardImportedTypes(): List[Type] = { - val xs = allHandlers collect { case x: ImportHandler if x.importsWildcard => x.targetType } - xs.flatten.reverse.distinct - } - - /** Another entry point for tab-completion, ids in scope */ - def unqualifiedIds() = (unqualifiedIdNames() map (_.toString)).distinct.sorted - - /** For static/object method completion */ - def getClassObject(path: String): Option[Class[_]] = //classLoader tryToLoadClass path - try { - Some(Class.forName(path, true, classLoader)) - } catch { - case e: Exception => None - } - - /** Parse the ScalaSig to find type aliases */ - def aliasForType(path: String) = ByteCode.aliasForType(path) - - // Coming soon - // implicit def string2liftedcode(s: String): LiftedCode = new LiftedCode(s) - // case class LiftedCode(code: String) { - // val lifted: String = { - // beQuietDuring { interpret(code) } - // eval2[String]("({ " + code + " }).toString") - // } - // def >> : String = lifted - // } - - // debugging - def isReplDebug = settings.Yrepldebug.value - def isCompletionDebug = settings.Ycompletion.value - def DBG(s: String) = if (isReplDebug) out println s else () -} - -/** Utility methods for the Interpreter. */ -object SparkInterpreter { - - import scala.collection.generic.CanBuildFrom - def partialFlatMap[A, B, CC[X] <: Traversable[X]] - (coll: CC[A]) - (pf: PartialFunction[A, CC[B]]) - (implicit bf: CanBuildFrom[CC[A], B, CC[B]]) = - { - val b = bf(coll) - for (x <- coll collect pf) - b ++= x - - b.result - } - - object DebugParam { - implicit def tuple2debugparam[T](x: (String, T))(implicit m: Manifest[T]): DebugParam[T] = - DebugParam(x._1, x._2) - - implicit def any2debugparam[T](x: T)(implicit m: Manifest[T]): DebugParam[T] = - DebugParam("p" + getCount(), x) - - private var counter = 0 - def getCount() = { counter += 1; counter } - } - case class DebugParam[T](name: String, param: T)(implicit m: Manifest[T]) { - val manifest = m - val typeStr = { - val str = manifest.toString - // I'm sure there are more to be discovered... - val regexp1 = """(.*?)\[(.*)\]""".r - val regexp2str = """.*\.type#""" - val regexp2 = (regexp2str + """(.*)""").r - - (str.replaceAll("""\n""", "")) match { - case regexp1(clazz, typeArgs) => "%s[%s]".format(clazz, typeArgs.replaceAll(regexp2str, "")) - case regexp2(clazz) => clazz - case _ => str - } - } - } - def breakIf(assertion: => Boolean, args: DebugParam[_]*): Unit = - if (assertion) break(args.toList) - - // start a repl, binding supplied args - def break(args: List[DebugParam[_]]): Unit = { - val intLoop = new SparkInterpreterLoop - intLoop.settings = new Settings(Console.println) - // XXX come back to the dot handling - intLoop.settings.classpath.value = "." - intLoop.createInterpreter - intLoop.in = SparkInteractiveReader.createDefault(intLoop.interpreter) - - // rebind exit so people don't accidentally call System.exit by way of predef - intLoop.interpreter.beQuietDuring { - intLoop.interpreter.interpret("""def exit = println("Type :quit to resume program execution.")""") - for (p <- args) { - intLoop.interpreter.bind(p.name, p.typeStr, p.param) - Console println "%s: %s".format(p.name, p.typeStr) - } - } - intLoop.repl() - intLoop.closeInterpreter - } - - def codegenln(leadingPlus: Boolean, xs: String*): String = codegen(leadingPlus, (xs ++ Array("\n")): _*) - def codegenln(xs: String*): String = codegenln(true, xs: _*) - - def codegen(xs: String*): String = codegen(true, xs: _*) - def codegen(leadingPlus: Boolean, xs: String*): String = { - val front = if (leadingPlus) "+ " else "" - front + (xs map string2codeQuoted mkString " + ") - } - - def string2codeQuoted(str: String) = "\"" + string2code(str) + "\"" - - /** Convert a string into code that can recreate the string. - * This requires replacing all special characters by escape - * codes. It does not add the surrounding " marks. */ - def string2code(str: String): String = { - val res = new StringBuilder - for (c <- str) c match { - case '"' | '\'' | '\\' => res += '\\' ; res += c - case _ if c.isControl => res ++= Chars.char2uescape(c) - case _ => res += c - } - res.toString - } -} - diff --git a/repl/src/main/scala/spark/repl/SparkInterpreterLoop.scala b/repl/src/main/scala/spark/repl/SparkInterpreterLoop.scala deleted file mode 100644 index a118abf3ca..0000000000 --- a/repl/src/main/scala/spark/repl/SparkInterpreterLoop.scala +++ /dev/null @@ -1,662 +0,0 @@ -/* NSC -- new Scala compiler - * Copyright 2005-2010 LAMP/EPFL - * @author Alexander Spoon - */ - -package spark.repl - -import scala.tools.nsc -import scala.tools.nsc._ - -import Predef.{ println => _, _ } -import java.io.{ BufferedReader, FileReader, PrintWriter } -import java.io.IOException - -import scala.tools.nsc.{ InterpreterResults => IR } -import scala.annotation.tailrec -import scala.collection.mutable.ListBuffer -import scala.concurrent.ops -import util.{ ClassPath } -import interpreter._ -import io.{ File, Process } - -import spark.SparkContext - -// Classes to wrap up interpreter commands and their results -// You can add new commands by adding entries to val commands -// inside InterpreterLoop. -trait InterpreterControl { - self: SparkInterpreterLoop => - - // the default result means "keep running, and don't record that line" - val defaultResult = Result(true, None) - - // a single interpreter command - sealed abstract class Command extends Function1[List[String], Result] { - def name: String - def help: String - def error(msg: String) = { - out.println(":" + name + " " + msg + ".") - Result(true, None) - } - def usage(): String - } - - case class NoArgs(name: String, help: String, f: () => Result) extends Command { - def usage(): String = ":" + name - def apply(args: List[String]) = if (args.isEmpty) f() else error("accepts no arguments") - } - - case class LineArg(name: String, help: String, f: (String) => Result) extends Command { - def usage(): String = ":" + name + " <line>" - def apply(args: List[String]) = f(args mkString " ") - } - - case class OneArg(name: String, help: String, f: (String) => Result) extends Command { - def usage(): String = ":" + name + " <arg>" - def apply(args: List[String]) = - if (args.size == 1) f(args.head) - else error("requires exactly one argument") - } - - case class VarArgs(name: String, help: String, f: (List[String]) => Result) extends Command { - def usage(): String = ":" + name + " [arg]" - def apply(args: List[String]) = f(args) - } - - // the result of a single command - case class Result(keepRunning: Boolean, lineToRecord: Option[String]) -} - -/** The - * <a href="http://scala-lang.org/" target="_top">Scala</a> - * interactive shell. It provides a read-eval-print loop around - * the Interpreter class. - * After instantiation, clients should call the <code>main()</code> method. - * - * <p>If no in0 is specified, then input will come from the console, and - * the class will attempt to provide input editing feature such as - * input history. - * - * @author Moez A. Abdel-Gawad - * @author Lex Spoon - * @version 1.2 - */ -class SparkInterpreterLoop( - in0: Option[BufferedReader], val out: PrintWriter, master: Option[String]) -extends InterpreterControl { - def this(in0: BufferedReader, out: PrintWriter, master: String) = - this(Some(in0), out, Some(master)) - - def this(in0: BufferedReader, out: PrintWriter) = - this(Some(in0), out, None) - - def this() = this(None, new PrintWriter(Console.out), None) - - /** The input stream from which commands come, set by main() */ - var in: SparkInteractiveReader = _ - - /** The context class loader at the time this object was created */ - protected val originalClassLoader = Thread.currentThread.getContextClassLoader - - var settings: Settings = _ // set by main() - var interpreter: SparkInterpreter = _ // set by createInterpreter() - - // classpath entries added via :cp - var addedClasspath: String = "" - - /** A reverse list of commands to replay if the user requests a :replay */ - var replayCommandStack: List[String] = Nil - - /** A list of commands to replay if the user requests a :replay */ - def replayCommands = replayCommandStack.reverse - - /** Record a command for replay should the user request a :replay */ - def addReplay(cmd: String) = replayCommandStack ::= cmd - - /** Close the interpreter and set the var to <code>null</code>. */ - def closeInterpreter() { - if (interpreter ne null) { - interpreter.close - interpreter = null - Thread.currentThread.setContextClassLoader(originalClassLoader) - } - } - - /** Create a new interpreter. */ - def createInterpreter() { - if (addedClasspath != "") - settings.classpath append addedClasspath - - interpreter = new SparkInterpreter(settings, out) { - override protected def parentClassLoader = - classOf[SparkInterpreterLoop].getClassLoader - } - interpreter.setContextClassLoader() - // interpreter.quietBind("settings", "spark.repl.SparkInterpreterSettings", interpreter.isettings) - } - - /** print a friendly help message */ - def printHelp() = { - out println "All commands can be abbreviated - for example :he instead of :help.\n" - val cmds = commands map (x => (x.usage, x.help)) - val width: Int = cmds map { case (x, _) => x.length } max - val formatStr = "%-" + width + "s %s" - cmds foreach { case (usage, help) => out println formatStr.format(usage, help) } - } - - /** Print a welcome message */ - def printWelcome() { - plushln("""Welcome to - ____ __ - / __/__ ___ _____/ /__ - _\ \/ _ \/ _ `/ __/ '_/ - /___/ .__/\_,_/_/ /_/\_\ version 0.0 - /_/ -""") - - import Properties._ - val welcomeMsg = "Using Scala %s (%s, Java %s)".format( - versionString, javaVmName, javaVersion) - plushln(welcomeMsg) - } - - /** Show the history */ - def printHistory(xs: List[String]) { - val defaultLines = 20 - - if (in.history.isEmpty) - return println("No history available.") - - val current = in.history.get.index - val count = try xs.head.toInt catch { case _: Exception => defaultLines } - val lines = in.historyList takeRight count - val offset = current - lines.size + 1 - - for ((line, index) <- lines.zipWithIndex) - println("%d %s".format(index + offset, line)) - } - - /** Some print conveniences */ - def println(x: Any) = out println x - def plush(x: Any) = { out print x ; out.flush() } - def plushln(x: Any) = { out println x ; out.flush() } - - /** Search the history */ - def searchHistory(_cmdline: String) { - val cmdline = _cmdline.toLowerCase - - if (in.history.isEmpty) - return println("No history available.") - - val current = in.history.get.index - val offset = current - in.historyList.size + 1 - - for ((line, index) <- in.historyList.zipWithIndex ; if line.toLowerCase contains cmdline) - println("%d %s".format(index + offset, line)) - } - - /** Prompt to print when awaiting input */ - val prompt = Properties.shellPromptString - - // most commands do not want to micromanage the Result, but they might want - // to print something to the console, so we accomodate Unit and String returns. - object CommandImplicits { - implicit def u2ir(x: Unit): Result = defaultResult - implicit def s2ir(s: String): Result = { - out println s - defaultResult - } - } - - /** Standard commands **/ - val standardCommands: List[Command] = { - import CommandImplicits._ - List( - OneArg("cp", "add an entry (jar or directory) to the classpath", addClasspath), - NoArgs("help", "print this help message", printHelp), - VarArgs("history", "show the history (optional arg: lines to show)", printHistory), - LineArg("h?", "search the history", searchHistory), - OneArg("load", "load and interpret a Scala file", load), - NoArgs("power", "enable power user mode", power), - NoArgs("quit", "exit the interpreter", () => Result(false, None)), - NoArgs("replay", "reset execution and replay all previous commands", replay), - LineArg("sh", "fork a shell and run a command", runShellCmd), - NoArgs("silent", "disable/enable automatic printing of results", verbosity) - ) - } - - /** Power user commands */ - var powerUserOn = false - val powerCommands: List[Command] = { - import CommandImplicits._ - List( - OneArg("completions", "generate list of completions for a given String", completions), - NoArgs("dump", "displays a view of the interpreter's internal state", () => interpreter.power.dump()) - - // VarArgs("tree", "displays ASTs for specified identifiers", - // (xs: List[String]) => interpreter dumpTrees xs) - // LineArg("meta", "given code which produces scala code, executes the results", - // (xs: List[String]) => ) - ) - } - - /** Available commands */ - def commands: List[Command] = standardCommands ::: (if (powerUserOn) powerCommands else Nil) - - def initializeSpark() { - interpreter.beQuietDuring { - command(""" - spark.repl.Main.interp.out.println("Registering with Mesos..."); - spark.repl.Main.interp.out.flush(); - @transient val sc = spark.repl.Main.interp.createSparkContext(); - sc.waitForRegister(); - spark.repl.Main.interp.out.println("Spark context available as sc."); - spark.repl.Main.interp.out.flush(); - """) - command("import spark.SparkContext._"); - } - plushln("Type in expressions to have them evaluated.") - plushln("Type :help for more information.") - } - - var sparkContext: SparkContext = null - - def createSparkContext(): SparkContext = { - val master = this.master match { - case Some(m) => m - case None => { - val prop = System.getenv("MASTER") - if (prop != null) prop else "local" - } - } - sparkContext = new SparkContext(master, "Spark shell") - sparkContext - } - - /** The main read-eval-print loop for the interpreter. It calls - * <code>command()</code> for each line of input, and stops when - * <code>command()</code> returns <code>false</code>. - */ - def repl() { - def readOneLine() = { - out.flush - in readLine prompt - } - // return false if repl should exit - def processLine(line: String): Boolean = - if (line eq null) false // assume null means EOF - else command(line) match { - case Result(false, _) => false - case Result(_, Some(finalLine)) => addReplay(finalLine) ; true - case _ => true - } - - while (processLine(readOneLine)) { } - } - - /** interpret all lines from a specified file */ - def interpretAllFrom(file: File) { - val oldIn = in - val oldReplay = replayCommandStack - - try file applyReader { reader => - in = new SparkSimpleReader(reader, out, false) - plushln("Loading " + file + "...") - repl() - } - finally { - in = oldIn - replayCommandStack = oldReplay - } - } - - /** create a new interpreter and replay all commands so far */ - def replay() { - closeInterpreter() - createInterpreter() - for (cmd <- replayCommands) { - plushln("Replaying: " + cmd) // flush because maybe cmd will have its own output - command(cmd) - out.println - } - } - - /** fork a shell and run a command */ - def runShellCmd(line: String) { - // we assume if they're using :sh they'd appreciate being able to pipeline - interpreter.beQuietDuring { - interpreter.interpret("import _root_.scala.tools.nsc.io.Process.Pipe._") - } - val p = Process(line) - // only bind non-empty streams - def add(name: String, it: Iterator[String]) = - if (it.hasNext) interpreter.bind(name, "scala.List[String]", it.toList) - - List(("stdout", p.stdout), ("stderr", p.stderr)) foreach (add _).tupled - } - - def withFile(filename: String)(action: File => Unit) { - val f = File(filename) - - if (f.exists) action(f) - else out.println("That file does not exist") - } - - def load(arg: String) = { - var shouldReplay: Option[String] = None - withFile(arg)(f => { - interpretAllFrom(f) - shouldReplay = Some(":load " + arg) - }) - Result(true, shouldReplay) - } - - def addClasspath(arg: String): Unit = { - val f = File(arg).normalize - if (f.exists) { - addedClasspath = ClassPath.join(addedClasspath, f.path) - val totalClasspath = ClassPath.join(settings.classpath.value, addedClasspath) - println("Added '%s'. Your new classpath is:\n%s".format(f.path, totalClasspath)) - replay() - } - else out.println("The path '" + f + "' doesn't seem to exist.") - } - - def completions(arg: String): Unit = { - val comp = in.completion getOrElse { return println("Completion unavailable.") } - val xs = comp completions arg - - injectAndName(xs) - } - - def power() { - val powerUserBanner = - """** Power User mode enabled - BEEP BOOP ** - |** scala.tools.nsc._ has been imported ** - |** New vals! Try repl, global, power ** - |** New cmds! :help to discover them ** - |** New defs! Type power.<tab> to reveal **""".stripMargin - - powerUserOn = true - interpreter.unleash() - injectOne("history", in.historyList) - in.completion foreach (x => injectOne("completion", x)) - out println powerUserBanner - } - - def verbosity() = { - val old = interpreter.printResults - interpreter.printResults = !old - out.println("Switched " + (if (old) "off" else "on") + " result printing.") - } - - /** Run one command submitted by the user. Two values are returned: - * (1) whether to keep running, (2) the line to record for replay, - * if any. */ - def command(line: String): Result = { - def withError(msg: String) = { - out println msg - Result(true, None) - } - def ambiguous(cmds: List[Command]) = "Ambiguous: did you mean " + cmds.map(":" + _.name).mkString(" or ") + "?" - - // not a command - if (!line.startsWith(":")) { - // Notice failure to create compiler - if (interpreter.compiler == null) return Result(false, None) - else return Result(true, interpretStartingWith(line)) - } - - val tokens = (line drop 1 split """\s+""").toList - if (tokens.isEmpty) - return withError(ambiguous(commands)) - - val (cmd :: args) = tokens - - // this lets us add commands willy-nilly and only requires enough command to disambiguate - commands.filter(_.name startsWith cmd) match { - case List(x) => x(args) - case Nil => withError("Unknown command. Type :help for help.") - case xs => withError(ambiguous(xs)) - } - } - - private val CONTINUATION_STRING = " | " - private val PROMPT_STRING = "scala> " - - /** If it looks like they're pasting in a scala interpreter - * transcript, remove all the formatting we inserted so we - * can make some sense of it. - */ - private var pasteStamp: Long = 0 - - /** Returns true if it's long enough to quit. */ - def updatePasteStamp(): Boolean = { - /* Enough milliseconds between readLines to call it a day. */ - val PASTE_FINISH = 1000 - - val prevStamp = pasteStamp - pasteStamp = System.currentTimeMillis - - (pasteStamp - prevStamp > PASTE_FINISH) - - } - /** TODO - we could look for the usage of resXX variables in the transcript. - * Right now backreferences to auto-named variables will break. - */ - - /** The trailing lines complication was an attempt to work around the introduction - * of newlines in e.g. email messages of repl sessions. It doesn't work because - * an unlucky newline can always leave you with a syntactically valid first line, - * which is executed before the next line is considered. So this doesn't actually - * accomplish anything, but I'm leaving it in case I decide to try harder. - */ - case class PasteCommand(cmd: String, trailing: ListBuffer[String] = ListBuffer[String]()) - - /** Commands start on lines beginning with "scala>" and each successive - * line which begins with the continuation string is appended to that command. - * Everything else is discarded. When the end of the transcript is spotted, - * all the commands are replayed. - */ - @tailrec private def cleanTranscript(lines: List[String], acc: List[PasteCommand]): List[PasteCommand] = lines match { - case Nil => acc.reverse - case x :: xs if x startsWith PROMPT_STRING => - val first = x stripPrefix PROMPT_STRING - val (xs1, xs2) = xs span (_ startsWith CONTINUATION_STRING) - val rest = xs1 map (_ stripPrefix CONTINUATION_STRING) - val result = (first :: rest).mkString("", "\n", "\n") - - cleanTranscript(xs2, PasteCommand(result) :: acc) - - case ln :: lns => - val newacc = acc match { - case Nil => Nil - case PasteCommand(cmd, trailing) :: accrest => - PasteCommand(cmd, trailing :+ ln) :: accrest - } - cleanTranscript(lns, newacc) - } - - /** The timestamp is for safety so it doesn't hang looking for the end - * of a transcript. Ad hoc parsing can't be too demanding. You can - * also use ctrl-D to start it parsing. - */ - @tailrec private def interpretAsPastedTranscript(lines: List[String]) { - val line = in.readLine("") - val finished = updatePasteStamp() - - if (line == null || finished || line.trim == PROMPT_STRING.trim) { - val xs = cleanTranscript(lines.reverse, Nil) - println("Replaying %d commands from interpreter transcript." format xs.size) - for (PasteCommand(cmd, trailing) <- xs) { - out.flush() - def runCode(code: String, extraLines: List[String]) { - (interpreter interpret code) match { - case IR.Incomplete if extraLines.nonEmpty => - runCode(code + "\n" + extraLines.head, extraLines.tail) - case _ => () - } - } - runCode(cmd, trailing.toList) - } - } - else - interpretAsPastedTranscript(line :: lines) - } - - /** Interpret expressions starting with the first line. - * Read lines until a complete compilation unit is available - * or until a syntax error has been seen. If a full unit is - * read, go ahead and interpret it. Return the full string - * to be recorded for replay, if any. - */ - def interpretStartingWith(code: String): Option[String] = { - // signal completion non-completion input has been received - in.completion foreach (_.resetVerbosity()) - - def reallyInterpret = interpreter.interpret(code) match { - case IR.Error => None - case IR.Success => Some(code) - case IR.Incomplete => - if (in.interactive && code.endsWith("\n\n")) { - out.println("You typed two blank lines. Starting a new command.") - None - } - else in.readLine(CONTINUATION_STRING) match { - case null => - // we know compilation is going to fail since we're at EOF and the - // parser thinks the input is still incomplete, but since this is - // a file being read non-interactively we want to fail. So we send - // it straight to the compiler for the nice error message. - interpreter.compileString(code) - None - - case line => interpretStartingWith(code + "\n" + line) - } - } - - /** Here we place ourselves between the user and the interpreter and examine - * the input they are ostensibly submitting. We intervene in several cases: - * - * 1) If the line starts with "scala> " it is assumed to be an interpreter paste. - * 2) If the line starts with "." (but not ".." or "./") it is treated as an invocation - * on the previous result. - * 3) If the Completion object's execute returns Some(_), we inject that value - * and avoid the interpreter, as it's likely not valid scala code. - */ - if (code == "") None - else if (code startsWith PROMPT_STRING) { - updatePasteStamp() - interpretAsPastedTranscript(List(code)) - None - } - else if (Completion.looksLikeInvocation(code) && interpreter.mostRecentVar != "") { - interpretStartingWith(interpreter.mostRecentVar + code) - } - else { - val result = for (comp <- in.completion ; res <- comp execute code) yield res - result match { - case Some(res) => injectAndName(res) ; None // completion took responsibility, so do not parse - case _ => reallyInterpret - } - } - } - - // runs :load <file> on any files passed via -i - def loadFiles(settings: Settings) = settings match { - case settings: GenericRunnerSettings => - for (filename <- settings.loadfiles.value) { - val cmd = ":load " + filename - command(cmd) - addReplay(cmd) - out.println() - } - case _ => - } - - def main(settings: Settings) { - this.settings = settings - createInterpreter() - - // sets in to some kind of reader depending on environmental cues - in = in0 match { - case Some(in0) => new SparkSimpleReader(in0, out, true) - case None => - // the interpreter is passed as an argument to expose tab completion info - if (settings.Xnojline.value || Properties.isEmacsShell) new SparkSimpleReader - else if (settings.noCompletion.value) SparkInteractiveReader.createDefault() - else SparkInteractiveReader.createDefault(interpreter) - } - - loadFiles(settings) - try { - // it is broken on startup; go ahead and exit - if (interpreter.reporter.hasErrors) return - - printWelcome() - - // this is about the illusion of snappiness. We call initialize() - // which spins off a separate thread, then print the prompt and try - // our best to look ready. Ideally the user will spend a - // couple seconds saying "wow, it starts so fast!" and by the time - // they type a command the compiler is ready to roll. - interpreter.initialize() - initializeSpark() - repl() - } - finally closeInterpreter() - } - - private def objClass(x: Any) = x.asInstanceOf[AnyRef].getClass - private def objName(x: Any) = { - val clazz = objClass(x) - val typeParams = clazz.getTypeParameters - val basename = clazz.getName - val tpString = if (typeParams.isEmpty) "" else "[%s]".format(typeParams map (_ => "_") mkString ", ") - - basename + tpString - } - - // injects one value into the repl; returns pair of name and class - def injectOne(name: String, obj: Any): Tuple2[String, String] = { - val className = objName(obj) - interpreter.quietBind(name, className, obj) - (name, className) - } - def injectAndName(obj: Any): Tuple2[String, String] = { - val name = interpreter.getVarName - val className = objName(obj) - interpreter.bind(name, className, obj) - (name, className) - } - - // injects list of values into the repl; returns summary string - def injectDebug(args: List[Any]): String = { - val strs = - for ((arg, i) <- args.zipWithIndex) yield { - val varName = "p" + (i + 1) - val (vname, vtype) = injectOne(varName, arg) - vname + ": " + vtype - } - - if (strs.size == 0) "Set no variables." - else "Variables set:\n" + strs.mkString("\n") - } - - /** process command-line arguments and do as they request */ - def main(args: Array[String]) { - def error1(msg: String) = out println ("scala: " + msg) - val command = new InterpreterCommand(args.toList, error1) - def neededHelp(): String = - (if (command.settings.help.value) command.usageMsg + "\n" else "") + - (if (command.settings.Xhelp.value) command.xusageMsg + "\n" else "") - - // if they asked for no help and command is valid, we call the real main - neededHelp() match { - case "" => if (command.ok) main(command.settings) // else nothing - case help => plush(help) - } - } -} - diff --git a/repl/src/main/scala/spark/repl/SparkInterpreterSettings.scala b/repl/src/main/scala/spark/repl/SparkInterpreterSettings.scala deleted file mode 100644 index ffa477785b..0000000000 --- a/repl/src/main/scala/spark/repl/SparkInterpreterSettings.scala +++ /dev/null @@ -1,112 +0,0 @@ -/* NSC -- new Scala compiler - * Copyright 2005-2010 LAMP/EPFL - * @author Alexander Spoon - */ - -package spark.repl - -import scala.tools.nsc -import scala.tools.nsc._ - -/** Settings for the interpreter - * - * @version 1.0 - * @author Lex Spoon, 2007/3/24 - **/ -class SparkInterpreterSettings(repl: SparkInterpreter) { - /** A list of paths where :load should look */ - var loadPath = List(".") - - /** The maximum length of toString to use when printing the result - * of an evaluation. 0 means no maximum. If a printout requires - * more than this number of characters, then the printout is - * truncated. - */ - var maxPrintString = 800 - - /** The maximum number of completion candidates to print for tab - * completion without requiring confirmation. - */ - var maxAutoprintCompletion = 250 - - /** String unwrapping can be disabled if it is causing issues. - * Settings this to false means you will see Strings like "$iw.$iw.". - */ - var unwrapStrings = true - - def deprecation_=(x: Boolean) = { - val old = repl.settings.deprecation.value - repl.settings.deprecation.value = x - if (!old && x) println("Enabled -deprecation output.") - else if (old && !x) println("Disabled -deprecation output.") - } - def deprecation: Boolean = repl.settings.deprecation.value - - def allSettings = Map( - "maxPrintString" -> maxPrintString, - "maxAutoprintCompletion" -> maxAutoprintCompletion, - "unwrapStrings" -> unwrapStrings, - "deprecation" -> deprecation - ) - - private def allSettingsString = - allSettings.toList sortBy (_._1) map { case (k, v) => " " + k + " = " + v + "\n" } mkString - - override def toString = """ - | SparkInterpreterSettings { - | %s - | }""".stripMargin.format(allSettingsString) -} - -/* Utilities for the InterpreterSettings class - * - * @version 1.0 - * @author Lex Spoon, 2007/5/24 - */ -object SparkInterpreterSettings { - /** Source code for the InterpreterSettings class. This is - * used so that the interpreter is sure to have the code - * available. - * - * XXX I'm not seeing why this degree of defensiveness is necessary. - * If files are missing the repl's not going to work, it's not as if - * we have string source backups for anything else. - */ - val sourceCodeForClass = -""" -package scala.tools.nsc - -/** Settings for the interpreter - * - * @version 1.0 - * @author Lex Spoon, 2007/3/24 - **/ -class SparkInterpreterSettings(repl: Interpreter) { - /** A list of paths where :load should look */ - var loadPath = List(".") - - /** The maximum length of toString to use when printing the result - * of an evaluation. 0 means no maximum. If a printout requires - * more than this number of characters, then the printout is - * truncated. - */ - var maxPrintString = 2400 - - def deprecation_=(x: Boolean) = { - val old = repl.settings.deprecation.value - repl.settings.deprecation.value = x - if (!old && x) println("Enabled -deprecation output.") - else if (old && !x) println("Disabled -deprecation output.") - } - def deprecation: Boolean = repl.settings.deprecation.value - - override def toString = - "SparkInterpreterSettings {\n" + -// " loadPath = " + loadPath + "\n" + - " maxPrintString = " + maxPrintString + "\n" + - "}" -} - -""" - -} diff --git a/repl/src/main/scala/spark/repl/SparkCompletion.scala b/repl/src/main/scala/spark/repl/SparkJLineCompletion.scala similarity index 60% rename from repl/src/main/scala/spark/repl/SparkCompletion.scala rename to repl/src/main/scala/spark/repl/SparkJLineCompletion.scala index c6ed1860f0..5d12898732 100644 --- a/repl/src/main/scala/spark/repl/SparkCompletion.scala +++ b/repl/src/main/scala/spark/repl/SparkJLineCompletion.scala @@ -1,62 +1,31 @@ /* NSC -- new Scala compiler - * Copyright 2005-2010 LAMP/EPFL + * Copyright 2005-2011 LAMP/EPFL * @author Paul Phillips */ - package spark.repl -import scala.tools.nsc import scala.tools.nsc._ -import scala.tools.nsc.interpreter import scala.tools.nsc.interpreter._ -import jline._ -import java.util.{ List => JList } -import util.returning - -object SparkCompletion { - def looksLikeInvocation(code: String) = ( - (code != null) - && (code startsWith ".") - && !(code == ".") - && !(code startsWith "./") - && !(code startsWith "..") - ) - - object Forwarder { - def apply(forwardTo: () => Option[CompletionAware]): CompletionAware = new CompletionAware { - def completions(verbosity: Int) = forwardTo() map (_ completions verbosity) getOrElse Nil - override def follow(s: String) = forwardTo() flatMap (_ follow s) - } - } -} -import SparkCompletion._ +import scala.tools.jline._ +import scala.tools.jline.console.completer._ +import Completion._ +import collection.mutable.ListBuffer // REPL completor - queries supplied interpreter for valid // completions based on current contents of buffer. -class SparkCompletion(val repl: SparkInterpreter) extends SparkCompletionOutput { - // verbosity goes up with consecutive tabs - private var verbosity: Int = 0 - def resetVerbosity() = verbosity = 0 - - def isCompletionDebug = repl.isCompletionDebug - def DBG(msg: => Any) = if (isCompletionDebug) println(msg.toString) - def debugging[T](msg: String): T => T = (res: T) => returning[T](res)(x => DBG(msg + x)) - - lazy val global: repl.compiler.type = repl.compiler +class JLineCompletion(val intp: SparkIMain) extends Completion with CompletionOutput { + val global: intp.global.type = intp.global import global._ import definitions.{ PredefModule, RootClass, AnyClass, AnyRefClass, ScalaPackage, JavaLangPackage } - - // XXX not yet used. - lazy val dottedPaths = { - def walk(tp: Type): scala.List[Symbol] = { - val pkgs = tp.nonPrivateMembers filter (_.isPackage) - pkgs ++ (pkgs map (_.tpe) flatMap walk) - } - walk(RootClass.tpe) - } + type ExecResult = Any + import intp.{ DBG, debugging, afterTyper } + // verbosity goes up with consecutive tabs + private var verbosity: Int = 0 + def resetVerbosity() = verbosity = 0 + def getType(name: String, isModule: Boolean) = { val f = if (isModule) definitions.getModule(_: Name) else definitions.getClass(_: Name) try Some(f(name).tpe) @@ -69,53 +38,74 @@ class SparkCompletion(val repl: SparkInterpreter) extends SparkCompletionOutput trait CompilerCompletion { def tp: Type def effectiveTp = tp match { - case MethodType(Nil, resType) => resType - case PolyType(Nil, resType) => resType - case _ => tp + case MethodType(Nil, resType) => resType + case NullaryMethodType(resType) => resType + case _ => tp } // for some reason any's members don't show up in subclasses, which // we need so 5.<tab> offers asInstanceOf etc. private def anyMembers = AnyClass.tpe.nonPrivateMembers - def anyRefMethodsToShow = List("isInstanceOf", "asInstanceOf", "toString") + def anyRefMethodsToShow = Set("isInstanceOf", "asInstanceOf", "toString") def tos(sym: Symbol) = sym.name.decode.toString def memberNamed(s: String) = members find (x => tos(x) == s) def hasMethod(s: String) = methods exists (x => tos(x) == s) - + // XXX we'd like to say "filterNot (_.isDeprecated)" but this causes the // compiler to crash for reasons not yet known. - def members = (effectiveTp.nonPrivateMembers ++ anyMembers) filter (_.isPublic) + def members = afterTyper((effectiveTp.nonPrivateMembers ++ anyMembers) filter (_.isPublic)) def methods = members filter (_.isMethod) def packages = members filter (_.isPackage) def aliases = members filter (_.isAliasType) - + def memberNames = members map tos def methodNames = methods map tos def packageNames = packages map tos def aliasNames = aliases map tos } - + object TypeMemberCompletion { + def apply(tp: Type, runtimeType: Type, param: NamedParam): TypeMemberCompletion = { + new TypeMemberCompletion(tp) { + var upgraded = false + lazy val upgrade = { + intp rebind param + intp.reporter.printMessage("\nRebinding stable value %s from %s to %s".format(param.name, tp, param.tpe)) + upgraded = true + new TypeMemberCompletion(runtimeType) + } + override def completions(verbosity: Int) = { + super.completions(verbosity) ++ ( + if (verbosity == 0) Nil + else upgrade.completions(verbosity) + ) + } + override def follow(s: String) = super.follow(s) orElse { + if (upgraded) upgrade.follow(s) + else None + } + override def alternativesFor(id: String) = super.alternativesFor(id) ++ ( + if (upgraded) upgrade.alternativesFor(id) + else Nil + ) distinct + } + } def apply(tp: Type): TypeMemberCompletion = { if (tp.typeSymbol.isPackageClass) new PackageCompletion(tp) else new TypeMemberCompletion(tp) } def imported(tp: Type) = new ImportCompletion(tp) } - - class TypeMemberCompletion(val tp: Type) extends CompletionAware with CompilerCompletion { + + class TypeMemberCompletion(val tp: Type) extends CompletionAware + with CompilerCompletion { def excludeEndsWith: List[String] = Nil def excludeStartsWith: List[String] = List("<") // <byname>, <repeated>, etc. - def excludeNames: List[String] = anyref.methodNames.filterNot(anyRefMethodsToShow.contains) ++ List("_root_") + def excludeNames: List[String] = (anyref.methodNames filterNot anyRefMethodsToShow) :+ "_root_" def methodSignatureString(sym: Symbol) = { - def asString = new MethodSymbolOutput(sym).methodString() - - if (isCompletionDebug) - repl.power.showAtAllPhases(asString) - - atPhase(currentRun.typerPhase)(asString) + SparkIMain stripString afterTyper(new MethodSymbolOutput(sym).methodString()) } def exclude(name: String): Boolean = ( @@ -139,7 +129,7 @@ class SparkCompletion(val repl: SparkInterpreter) extends SparkCompletionOutput if (alts.nonEmpty) "" :: alts else Nil } - override def toString = "TypeMemberCompletion(%s)".format(tp) + override def toString = "%s (%d members)".format(tp, members.size) } class PackageCompletion(tp: Type) extends TypeMemberCompletion(tp) { @@ -165,32 +155,36 @@ class SparkCompletion(val repl: SparkInterpreter) extends SparkCompletionOutput // the unqualified vals/defs/etc visible in the repl object ids extends CompletionAware { - override def completions(verbosity: Int) = repl.unqualifiedIds ::: List("classOf") - // we try to use the compiler and fall back on reflection if necessary - // (which at present is for anything defined in the repl session.) - override def follow(id: String) = + override def completions(verbosity: Int) = intp.unqualifiedIds ++ List("classOf") //, "_root_") + // now we use the compiler for everything. + override def follow(id: String) = { if (completions(0) contains id) { - for (clazz <- repl clazzForIdent id) yield { - // XXX The isMemberClass check is a workaround for the crasher described - // in the comments of #3431. The issue as described by iulian is: - // - // Inner classes exist as symbols - // inside their enclosing class, but also inside their package, with a mangled - // name (A$B). The mangled names should never be loaded, and exist only for the - // optimizer, which sometimes cannot get the right symbol, but it doesn't care - // and loads the bytecode anyway. - // - // So this solution is incorrect, but in the short term the simple fix is - // to skip the compiler any time completion is requested on a nested class. - if (clazz.isMemberClass) new InstanceCompletion(clazz) - else (typeOf(clazz.getName) map TypeMemberCompletion.apply) getOrElse new InstanceCompletion(clazz) + intp typeOfExpression id map { tpe => + def default = TypeMemberCompletion(tpe) + + // only rebinding vals in power mode for now. + if (!isReplPower) default + else intp runtimeClassAndTypeOfTerm id match { + case Some((clazz, runtimeType)) => + val sym = intp.symbolOfTerm(id) + if (sym.isStable) { + val param = new NamedParam.Untyped(id, intp valueOfTerm id getOrElse null) + TypeMemberCompletion(tpe, runtimeType, param) + } + else default + case _ => + default + } } } - else None + else + None + } + override def toString = "<repl ids> (%s)".format(completions(0).size) } - // wildcard imports in the repl like "import global._" or "import String._" - private def imported = repl.wildcardImportedTypes map TypeMemberCompletion.imported + // user-issued wildcard imports like "import global._" or "import String._" + private def imported = intp.sessionWildcards map TypeMemberCompletion.imported // literal Ints, Strings, etc. object literals extends CompletionAware { @@ -211,7 +205,13 @@ class SparkCompletion(val repl: SparkInterpreter) extends SparkCompletionOutput } // top level packages - object rootClass extends TypeMemberCompletion(RootClass.tpe) { } + object rootClass extends TypeMemberCompletion(RootClass.tpe) { + override def completions(verbosity: Int) = super.completions(verbosity) :+ "_root_" + override def follow(id: String) = id match { + case "_root_" => Some(this) + case _ => super.follow(id) + } + } // members of Predef object predef extends TypeMemberCompletion(PredefModule.tpe) { override def excludeEndsWith = super.excludeEndsWith ++ List("Wrapper", "ArrayOps") @@ -252,14 +252,25 @@ class SparkCompletion(val repl: SparkInterpreter) extends SparkCompletionOutput } // the list of completion aware objects which should be consulted + // for top level unqualified, it's too noisy to let much in. lazy val topLevelBase: List[CompletionAware] = List(ids, rootClass, predef, scalalang, javalang, literals) def topLevel = topLevelBase ++ imported + def topLevelThreshold = 50 // the first tier of top level objects (doesn't include file completion) - def topLevelFor(parsed: Parsed) = topLevel flatMap (_ completionsFor parsed) + def topLevelFor(parsed: Parsed): List[String] = { + val buf = new ListBuffer[String] + topLevel foreach { ca => + buf ++= (ca completionsFor parsed) + + if (buf.size > topLevelThreshold) + return buf.toList.sorted + } + buf.toList + } // the most recent result - def lastResult = Forwarder(() => ids follow repl.mostRecentVar) + def lastResult = Forwarder(() => ids follow intp.mostRecentVar) def lastResultFor(parsed: Parsed) = { /** The logic is a little tortured right now because normally '.' is @@ -268,9 +279,9 @@ class SparkCompletion(val repl: SparkInterpreter) extends SparkCompletionOutput val xs = lastResult completionsFor parsed if (parsed.isEmpty) xs map ("." + _) else xs } - + // chasing down results which won't parse - def execute(line: String): Option[Any] = { + def execute(line: String): Option[ExecResult] = { val parsed = Parsed(line) def noDotOrSlash = line forall (ch => ch != '.' && ch != '/') @@ -286,9 +297,7 @@ class SparkCompletion(val repl: SparkInterpreter) extends SparkCompletionOutput def completions(buf: String): List[String] = topLevelFor(Parsed.dotted(buf + ".", buf.length + 1)) - // jline's entry point - lazy val jline: ArgumentCompletor = - returning(new ArgumentCompletor(new JLineCompletion, new JLineDelimiter))(_ setStrict false) + def completer(): ScalaCompleter = new JLineTabCompletion /** This gets a little bit hairy. It's no small feat delegating everything * and also keeping track of exactly where the cursor is and where it's supposed @@ -296,44 +305,47 @@ class SparkCompletion(val repl: SparkInterpreter) extends SparkCompletionOutput * string in the list of completions, that means we are expanding a unique * completion, so don't update the "last" buffer because it'll be wrong. */ - class JLineCompletion extends Completor { + class JLineTabCompletion extends ScalaCompleter { // For recording the buffer on the last tab hit private var lastBuf: String = "" private var lastCursor: Int = -1 // Does this represent two consecutive tabs? - def isConsecutiveTabs(buf: String, cursor: Int) = cursor == lastCursor && buf == lastBuf - + def isConsecutiveTabs(buf: String, cursor: Int) = + cursor == lastCursor && buf == lastBuf + // Longest common prefix - def commonPrefix(xs: List[String]) = - if (xs.isEmpty) "" - else xs.reduceLeft(_ zip _ takeWhile (x => x._1 == x._2) map (_._1) mkString) + def commonPrefix(xs: List[String]): String = { + if (xs.isEmpty || xs.contains("")) "" + else xs.head.head match { + case ch => + if (xs.tail forall (_.head == ch)) "" + ch + commonPrefix(xs map (_.tail)) + else "" + } + } // This is jline's entry point for completion. - override def complete(_buf: String, cursor: Int, candidates: java.util.List[java.lang.String]): Int = { - val buf = onull(_buf) + override def complete(buf: String, cursor: Int): Candidates = { verbosity = if (isConsecutiveTabs(buf, cursor)) verbosity + 1 else 0 - DBG("complete(%s, %d) last = (%s, %d), verbosity: %s".format(buf, cursor, lastBuf, lastCursor, verbosity)) + DBG("\ncomplete(%s, %d) last = (%s, %d), verbosity: %s".format(buf, cursor, lastBuf, lastCursor, verbosity)) // we don't try lower priority completions unless higher ones return no results. - def tryCompletion(p: Parsed, completionFunction: Parsed => List[String]): Option[Int] = { - completionFunction(p) match { - case Nil => None - case xs => - // modify in place and return the position - xs.foreach(x => candidates.add(x)) - - // update the last buffer unless this is an alternatives list - if (xs contains "") Some(p.cursor) - else { - val advance = commonPrefix(xs) - lastCursor = p.position + advance.length - lastBuf = (buf take p.position) + advance - - DBG("tryCompletion(%s, _) lastBuf = %s, lastCursor = %s, p.position = %s".format(p, lastBuf, lastCursor, p.position)) - Some(p.position) - } - } + def tryCompletion(p: Parsed, completionFunction: Parsed => List[String]): Option[Candidates] = { + val winners = completionFunction(p) + if (winners.isEmpty) + return None + val newCursor = + if (winners contains "") p.cursor + else { + val advance = commonPrefix(winners) + lastCursor = p.position + advance.length + lastBuf = (buf take p.position) + advance + DBG("tryCompletion(%s, _) lastBuf = %s, lastCursor = %s, p.position = %s".format( + p, lastBuf, lastCursor, p.position)) + p.position + } + + Some(Candidates(newCursor, winners)) } def mkDotted = Parsed.dotted(buf, cursor) withVerbosity verbosity @@ -345,9 +357,23 @@ class SparkCompletion(val repl: SparkInterpreter) extends SparkCompletionOutput else tryCompletion(Parsed.dotted(buf drop 1, cursor), lastResultFor) def regularCompletion = tryCompletion(mkDotted, topLevelFor) - def fileCompletion = tryCompletion(mkUndelimited, FileCompletion completionsFor _.buffer) + def fileCompletion = + if (!looksLikePath(buf)) None + else tryCompletion(mkUndelimited, FileCompletion completionsFor _.buffer) - (lastResultCompletion orElse regularCompletion orElse fileCompletion) getOrElse cursor + /** This is the kickoff point for all manner of theoretically possible compiler + * unhappiness - fault may be here or elsewhere, but we don't want to crash the + * repl regardless. Hopefully catching Exception is enough, but because the + * compiler still throws some Errors it may not be. + */ + try { + (lastResultCompletion orElse regularCompletion orElse fileCompletion) getOrElse Candidates(cursor, Nil) + } + catch { + case ex: Exception => + DBG("Error: complete(%s, %s) provoked %s".format(buf, cursor, ex)) + Candidates(cursor, List(" ", "<completion error: " + ex.getMessage + ">")) + } } } } diff --git a/repl/src/main/scala/spark/repl/SparkJLineReader.scala b/repl/src/main/scala/spark/repl/SparkJLineReader.scala index 9d761c06fc..f7b0261ad0 100644 --- a/repl/src/main/scala/spark/repl/SparkJLineReader.scala +++ b/repl/src/main/scala/spark/repl/SparkJLineReader.scala @@ -1,38 +1,79 @@ /* NSC -- new Scala compiler - * Copyright 2005-2010 LAMP/EPFL + * Copyright 2005-2011 LAMP/EPFL * @author Stepan Koltsov */ package spark.repl -import scala.tools.nsc import scala.tools.nsc._ -import scala.tools.nsc.interpreter import scala.tools.nsc.interpreter._ -import java.io.File -import jline.{ ConsoleReader, ArgumentCompletor, History => JHistory } +import scala.tools.jline.console.ConsoleReader +import scala.tools.jline.console.completer._ +import session._ +import scala.collection.JavaConverters._ +import Completion._ +import io.Streamable.slurp /** Reads from the console using JLine */ -class SparkJLineReader(interpreter: SparkInterpreter) extends SparkInteractiveReader { - def this() = this(null) - - override lazy val history = Some(History(consoleReader)) - override lazy val completion = Option(interpreter) map (x => new SparkCompletion(x)) +class SparkJLineReader(val completion: Completion) extends InteractiveReader { + val interactive = true + lazy val history: JLineHistory = JLineHistory() + lazy val keyBindings = + try KeyBinding parse slurp(term.getDefaultBindings) + catch { case _: Exception => Nil } + + private def term = consoleReader.getTerminal() + def reset() = term.reset() + def init() = term.init() - val consoleReader = { - val r = new jline.ConsoleReader() - r setHistory (History().jhistory) - r setBellEnabled false - completion foreach { c => - r addCompletor c.jline - r setAutoprintThreshhold 250 + def scalaToJline(tc: ScalaCompleter): Completer = new Completer { + def complete(_buf: String, cursor: Int, candidates: JList[CharSequence]): Int = { + val buf = if (_buf == null) "" else _buf + val Candidates(newCursor, newCandidates) = tc.complete(buf, cursor) + newCandidates foreach (candidates add _) + newCursor + } + } + + class JLineConsoleReader extends ConsoleReader with ConsoleReaderHelper { + // working around protected/trait/java insufficiencies. + def goBack(num: Int): Unit = back(num) + def readOneKey(prompt: String) = { + this.print(prompt) + this.flush() + this.readVirtualKey() + } + def eraseLine() = consoleReader.resetPromptLine("", "", 0) + def redrawLineAndFlush(): Unit = { flush() ; drawLine() ; flush() } + + this setBellEnabled false + if (history ne NoHistory) + this setHistory history + + if (completion ne NoCompletion) { + val argCompletor: ArgumentCompleter = + new ArgumentCompleter(new JLineDelimiter, scalaToJline(completion.completer())) + argCompletor setStrict false + + this addCompleter argCompletor + this setAutoprintThreshold 400 // max completion candidates without warning } - - r } + val consoleReader: JLineConsoleReader = new JLineConsoleReader() + + def currentLine: String = consoleReader.getCursorBuffer.buffer.toString + def redrawLine() = consoleReader.redrawLineAndFlush() + def eraseLine() = { + while (consoleReader.delete()) { } + // consoleReader.eraseLine() + } def readOneLine(prompt: String) = consoleReader readLine prompt - val interactive = true + def readOneKey(prompt: String) = consoleReader readOneKey prompt } +object JLineReader { + def apply(intp: SparkIMain): JLineReader = apply(new JLineCompletion(intp)) + def apply(comp: Completion): JLineReader = new JLineReader(comp) +} diff --git a/repl/src/main/scala/spark/repl/SparkMemberHandlers.scala b/repl/src/main/scala/spark/repl/SparkMemberHandlers.scala new file mode 100644 index 0000000000..2980dfcd76 --- /dev/null +++ b/repl/src/main/scala/spark/repl/SparkMemberHandlers.scala @@ -0,0 +1,207 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Martin Odersky + */ + +package spark.repl + +import scala.tools.nsc._ +import scala.tools.nsc.interpreter._ + +import scala.collection.{ mutable, immutable } +import scala.PartialFunction.cond +import scala.reflect.NameTransformer +import util.Chars + +trait SparkMemberHandlers { + val intp: SparkIMain + + import intp.{ Request, global, naming, atPickler } + import global._ + import naming._ + + private def codegenln(leadingPlus: Boolean, xs: String*): String = codegen(leadingPlus, (xs ++ Array("\n")): _*) + private def codegenln(xs: String*): String = codegenln(true, xs: _*) + + private def codegen(xs: String*): String = codegen(true, xs: _*) + private def codegen(leadingPlus: Boolean, xs: String*): String = { + val front = if (leadingPlus) "+ " else "" + front + (xs map string2codeQuoted mkString " + ") + } + private implicit def name2string(name: Name) = name.toString + + /** A traverser that finds all mentioned identifiers, i.e. things + * that need to be imported. It might return extra names. + */ + private class ImportVarsTraverser extends Traverser { + val importVars = new mutable.HashSet[Name]() + + override def traverse(ast: Tree) = ast match { + case Ident(name) => + // XXX this is obviously inadequate but it's going to require some effort + // to get right. + if (name.toString startsWith "x$") () + else importVars += name + case _ => super.traverse(ast) + } + } + private object ImportVarsTraverser { + def apply(member: Tree) = { + val ivt = new ImportVarsTraverser() + ivt traverse member + ivt.importVars.toList + } + } + + def chooseHandler(member: Tree): MemberHandler = member match { + case member: DefDef => new DefHandler(member) + case member: ValDef => new ValHandler(member) + case member@Assign(Ident(_), _) => new AssignHandler(member) + case member: ModuleDef => new ModuleHandler(member) + case member: ClassDef => new ClassHandler(member) + case member: TypeDef => new TypeAliasHandler(member) + case member: Import => new ImportHandler(member) + case DocDef(_, documented) => chooseHandler(documented) + case member => new GenericHandler(member) + } + + sealed abstract class MemberDefHandler(override val member: MemberDef) extends MemberHandler(member) { + def name: Name = member.name + def mods: Modifiers = member.mods + def keyword = member.keyword + def prettyName = NameTransformer.decode(name) + + override def definesImplicit = member.mods.isImplicit + override def definesTerm: Option[TermName] = Some(name.toTermName) filter (_ => name.isTermName) + override def definesType: Option[TypeName] = Some(name.toTypeName) filter (_ => name.isTypeName) + } + + /** Class to handle one member among all the members included + * in a single interpreter request. + */ + sealed abstract class MemberHandler(val member: Tree) { + def definesImplicit = false + def definesValue = false + def isLegalTopLevel = member match { + case _: ModuleDef | _: ClassDef | _: Import => true + case _ => false + } + + def definesTerm = Option.empty[TermName] + def definesType = Option.empty[TypeName] + + lazy val referencedNames = ImportVarsTraverser(member) + def importedNames = List[Name]() + def definedNames = definesTerm.toList ++ definesType.toList + def definedOrImported = definedNames ++ importedNames + + def extraCodeToEvaluate(req: Request): String = "" + def resultExtractionCode(req: Request): String = "" + + private def shortName = this.getClass.toString split '.' last + override def toString = shortName + referencedNames.mkString(" (refs: ", ", ", ")") + } + + class GenericHandler(member: Tree) extends MemberHandler(member) + + class ValHandler(member: ValDef) extends MemberDefHandler(member) { + val maxStringElements = 1000 // no need to mkString billions of elements + override def definesValue = true + + override def resultExtractionCode(req: Request): String = { + val isInternal = isUserVarName(name) && req.lookupTypeOf(name) == "Unit" + if (!mods.isPublic || isInternal) "" + else { + // if this is a lazy val we avoid evaluating it here + val resultString = + if (mods.isLazy) codegenln(false, "<lazy>") + else any2stringOf(req fullPath name, maxStringElements) + + """ + "%s: %s = " + %s""".format(prettyName, string2code(req typeOf name), resultString) + } + } + } + + class DefHandler(member: DefDef) extends MemberDefHandler(member) { + private def vparamss = member.vparamss + // true if 0-arity + override def definesValue = vparamss.isEmpty || vparamss.head.isEmpty + override def resultExtractionCode(req: Request) = + if (mods.isPublic) codegenln(name, ": ", req.typeOf(name)) else "" + } + + class AssignHandler(member: Assign) extends MemberHandler(member) { + val lhs = member.lhs.asInstanceOf[Ident] // an unfortunate limitation + val name = newTermName(freshInternalVarName()) + + override def definesTerm = Some(name) + override def definesValue = true + override def extraCodeToEvaluate(req: Request) = + """val %s = %s""".format(name, lhs) + + /** Print out lhs instead of the generated varName */ + override def resultExtractionCode(req: Request) = { + val lhsType = string2code(req lookupTypeOf name) + val res = string2code(req fullPath name) + + """ + "%s: %s = " + %s + "\n" """.format(lhs, lhsType, res) + "\n" + } + } + + class ModuleHandler(module: ModuleDef) extends MemberDefHandler(module) { + override def definesTerm = Some(name) + override def definesValue = true + + override def resultExtractionCode(req: Request) = codegenln("defined module ", name) + } + + class ClassHandler(member: ClassDef) extends MemberDefHandler(member) { + override def definesType = Some(name.toTypeName) + override def definesTerm = Some(name.toTermName) filter (_ => mods.isCase) + + override def resultExtractionCode(req: Request) = + codegenln("defined %s %s".format(keyword, name)) + } + + class TypeAliasHandler(member: TypeDef) extends MemberDefHandler(member) { + private def isAlias = mods.isPublic && treeInfo.isAliasTypeDef(member) + override def definesType = Some(name.toTypeName) filter (_ => isAlias) + + override def resultExtractionCode(req: Request) = + codegenln("defined type alias ", name) + "\n" + } + + class ImportHandler(imp: Import) extends MemberHandler(imp) { + val Import(expr, selectors) = imp + def targetType = intp.typeOfExpression("" + expr) + + // wildcard imports, e.g. import foo._ + private def selectorWild = selectors filter (_.name == nme.USCOREkw) + // renamed imports, e.g. import foo.{ bar => baz } + private def selectorRenames = selectors map (_.rename) filterNot (_ == null) + + /** Whether this import includes a wildcard import */ + val importsWildcard = selectorWild.nonEmpty + + def implicitSymbols = importedSymbols filter (_.isImplicit) + def importedSymbols = individualSymbols ++ wildcardSymbols + + lazy val individualSymbols: List[Symbol] = + atPickler(targetType.toList flatMap (tp => individualNames map (tp nonPrivateMember _))) + + lazy val wildcardSymbols: List[Symbol] = + if (importsWildcard) atPickler(targetType.toList flatMap (_.nonPrivateMembers)) + else Nil + + /** Complete list of names imported by a wildcard */ + lazy val wildcardNames: List[Name] = wildcardSymbols map (_.name) + lazy val individualNames: List[Name] = selectorRenames filterNot (_ == nme.USCOREkw) flatMap (_.bothNames) + + /** The names imported by this statement */ + override lazy val importedNames: List[Name] = wildcardNames ++ individualNames + lazy val importsSymbolNamed: Set[String] = importedNames map (_.toString) toSet + + def importString = imp.toString + override def resultExtractionCode(req: Request) = codegenln(importString) + "\n" + } +} diff --git a/repl/src/main/scala/spark/repl/SparkSimpleReader.scala b/repl/src/main/scala/spark/repl/SparkSimpleReader.scala deleted file mode 100644 index 2b24c4bf63..0000000000 --- a/repl/src/main/scala/spark/repl/SparkSimpleReader.scala +++ /dev/null @@ -1,33 +0,0 @@ -/* NSC -- new Scala compiler - * Copyright 2005-2010 LAMP/EPFL - * @author Stepan Koltsov - */ - -package spark.repl - -import scala.tools.nsc -import scala.tools.nsc._ -import scala.tools.nsc.interpreter -import scala.tools.nsc.interpreter._ - -import java.io.{ BufferedReader, PrintWriter } -import io.{ Path, File, Directory } - -/** Reads using standard JDK API */ -class SparkSimpleReader( - in: BufferedReader, - out: PrintWriter, - val interactive: Boolean) -extends SparkInteractiveReader { - def this() = this(Console.in, new PrintWriter(Console.out), true) - def this(in: File, out: PrintWriter, interactive: Boolean) = this(in.bufferedReader(), out, interactive) - - def close() = in.close() - def readOneLine(prompt: String): String = { - if (interactive) { - out.print(prompt) - out.flush() - } - in.readLine() - } -} diff --git a/repl/src/test/scala/spark/repl/ReplSuite.scala b/repl/src/test/scala/spark/repl/ReplSuite.scala index 829b1d934e..a9b1bee7e0 100644 --- a/repl/src/test/scala/spark/repl/ReplSuite.scala +++ b/repl/src/test/scala/spark/repl/ReplSuite.scala @@ -22,7 +22,7 @@ class ReplSuite extends FunSuite { } } } - val interp = new SparkInterpreterLoop(in, new PrintWriter(out), master) + val interp = new SparkILoop(in, new PrintWriter(out), master) spark.repl.Main.interp = interp val separator = System.getProperty("path.separator") interp.main(Array("-classpath", paths.mkString(separator))) -- GitLab