diff options
author | Paul Phillips <paulp@improving.org> | 2010-02-04 17:15:18 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2010-02-04 17:15:18 +0000 |
commit | 67b215e9746dcd1f1ceeb54017eb1deeffbed940 (patch) | |
tree | cc7f8ba1612ee452423b58adb0dae4d9ae354a52 /src | |
parent | 429da0c3c7105510a29fcacd746916431e86d3e2 (diff) | |
download | scala-67b215e9746dcd1f1ceeb54017eb1deeffbed940.tar.gz scala-67b215e9746dcd1f1ceeb54017eb1deeffbed940.tar.bz2 scala-67b215e9746dcd1f1ceeb54017eb1deeffbed940.zip |
Some hardening in the repl, and removing some f...
Some hardening in the repl, and removing some functions which now exist
in the standard library. No review.
Diffstat (limited to 'src')
6 files changed, 29 insertions, 17 deletions
diff --git a/src/compiler/scala/tools/nsc/Interpreter.scala b/src/compiler/scala/tools/nsc/Interpreter.scala index 4ae0540d8b..49ce29a7ff 100644 --- a/src/compiler/scala/tools/nsc/Interpreter.scala +++ b/src/compiler/scala/tools/nsc/Interpreter.scala @@ -220,16 +220,16 @@ class Interpreter(val settings: Settings, out: PrintWriter) { private val boundNameMap = new HashMap[Name, Request]() private def allHandlers = prevRequests.toList flatMap (_.handlers) - /** Most recent handler which wasn't wholly synthetic. */ - private def mostRecentHandler: MemberHandler = { + /** 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 handler + } return Some(handler.member) - error("No handlers found.") + None } def recordRequest(req: Request) { @@ -503,7 +503,8 @@ class Interpreter(val settings: Settings, out: PrintWriter) { } private[nsc] val powerMkImports = List( - "mkContext", "mkTree", "mkTrees", "mkAlias", "mkSourceFile", "mkUnit", "mkType", "mkTypedTree", "mkTypedTrees" + "mkContext", "mkTree", "mkTrees", "mkAlias", "mkSourceFile", "mkUnit", "mkType", "mkTypedTree", "mkTypedTrees", + "treeWrapper" ) /** Compile an nsc SourceFile. Returns true if there are @@ -1022,12 +1023,14 @@ class Interpreter(val settings: Settings, out: PrintWriter) { * Mostly this exists so you can conveniently invoke methods on * the previous result. */ - def mostRecentVar: String = mostRecentHandler.member match { - case x: ValOrDefDef => x.name - case Assign(Ident(name), _) => name - case ModuleDef(_, name, _) => name - case _ => varNameCreator.mostRecent - } + 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) diff --git a/src/compiler/scala/tools/nsc/Settings.scala b/src/compiler/scala/tools/nsc/Settings.scala index edfae44a1f..c5261f8c10 100644 --- a/src/compiler/scala/tools/nsc/Settings.scala +++ b/src/compiler/scala/tools/nsc/Settings.scala @@ -16,8 +16,8 @@ class Settings(errorFn: String => Unit) extends ScalacSettings { def this() = this(Console.println) // optionizes a system property - private def syspropopt(name: String): Option[String] = onull(System.getProperty(name)) - private def sysenvopt(name: String): Option[String] = onull(System.getenv(name)) + private def syspropopt(name: String): Option[String] = Option(System.getProperty(name)) + private def sysenvopt(name: String): Option[String] = Option(System.getenv(name)) // given any number of possible path segments, flattens down to a // :-separated style path @@ -43,9 +43,8 @@ class Settings(errorFn: String => Unit) extends ScalacSettings { protected def pluginsDirDefault = guess(List("misc", "scala-devel", "plugins"), _.isDirectory) getOrElse "" - def onull[T <: AnyRef](x: T): Option[T] = if (x eq null) None else Some(x) def mkPath(base: String, segments: String*) = new File(base, segments.mkString(File.separator)) - def scalaHome: Option[String] = onull(Properties.scalaHome) + def scalaHome: Option[String] = Option(Properties.scalaHome) // examine path relative to scala home and return Some(path) if it meets condition private def guess(xs: List[String], cond: (File) => Boolean): Option[String] = { diff --git a/src/compiler/scala/tools/nsc/interpreter/Parsed.scala b/src/compiler/scala/tools/nsc/interpreter/Parsed.scala index 05cb2641cd..b130396cc6 100644 --- a/src/compiler/scala/tools/nsc/interpreter/Parsed.scala +++ b/src/compiler/scala/tools/nsc/interpreter/Parsed.scala @@ -51,7 +51,6 @@ class Parsed private ( } object Parsed { - def onull(s: String) = if (s == null) "" else s def apply(s: String): Parsed = apply(onull(s), onull(s).length) def apply(s: String, cursor: Int): Parsed = apply(onull(s), cursor, "(){},`; \t" contains _) def apply(s: String, cursor: Int, delimited: Char => Boolean): Parsed = diff --git a/src/compiler/scala/tools/nsc/interpreter/package.scala b/src/compiler/scala/tools/nsc/interpreter/package.scala index 767bc9ca2f..2ded3a7900 100644 --- a/src/compiler/scala/tools/nsc/interpreter/package.scala +++ b/src/compiler/scala/tools/nsc/interpreter/package.scala @@ -12,6 +12,12 @@ package object interpreter { /** Tracing */ def tracing[T](msg: String)(x: T): T = { println("(" + msg + ") " + x) ; x } + /** Frequency counter */ + def freq[T](seq: Seq[T]) = seq groupBy identity mapValues (_.length) + + /** null becomes "", otherwise identity */ + def onull(s: String) = if (s == null) "" else s + /** Class objects */ def classForName(name: String): Option[Class[_]] = try Some(Class forName name) diff --git a/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala b/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala index 95110d6b81..9d65a3b2aa 100644 --- a/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala +++ b/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala @@ -91,6 +91,7 @@ object ScalaClassLoader { search(getContextLoader()) } + /** The actual bytes for a class file, or an empty array if it can't be found. */ def findBytesForClassName(s: String): Array[Byte] = { val name = s.replaceAll("""\.""", "/") + ".class" val url = getSystemLoader.getResource(name) @@ -98,4 +99,9 @@ object ScalaClassLoader { if (url == null) Array() else new io.Streamable.Bytes { def inputStream() = url.openStream } . toByteArray() } + + /** Finding what jar a clazz or instance came from */ + def origin(x: Any): Option[URL] = originOfClass(x.asInstanceOf[AnyRef].getClass) + def originOfClass(x: Class[_]): Option[URL] = + Option(x.getProtectionDomain.getCodeSource) flatMap (x => Option(x.getLocation)) } diff --git a/src/library/scala/util/Properties.scala b/src/library/scala/util/Properties.scala index 450738b21d..ee3e68ed76 100644 --- a/src/library/scala/util/Properties.scala +++ b/src/library/scala/util/Properties.scala @@ -30,7 +30,6 @@ private[scala] trait PropertiesTrait props } - protected def onull[T <: AnyRef](x: T) = if (x eq null) None else Some(x) private def quietlyDispose(action: => Unit, disposal: => Unit) = try { action } finally { |