diff options
4 files changed, 48 insertions, 33 deletions
diff --git a/src/compiler/scala/tools/nsc/interpreter/ILoop.scala b/src/compiler/scala/tools/nsc/interpreter/ILoop.scala index 5dfd5da76c..e0a49554ed 100644 --- a/src/compiler/scala/tools/nsc/interpreter/ILoop.scala +++ b/src/compiler/scala/tools/nsc/interpreter/ILoop.scala @@ -111,31 +111,33 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) } } + class ILoopInterpreter extends IMain(settings, out) { + override lazy val formatting = new Formatting { + def prompt = ILoop.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 + + println(template.format(line.thread, line.code)) + // XXX no way to suppress the deprecation warning + line.thread.stop() + in.redrawLine() + } + } + override protected def parentClassLoader = + settings.explicitParentLoader.getOrElse( classOf[ILoop].getClassLoader ) + } + /** Create a new interpreter. */ def createInterpreter() { if (addedClasspath != "") settings.classpath append addedClasspath - intp = new IMain(settings, out) { - override lazy val formatting = new Formatting { - def prompt = ILoop.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 - - println(template.format(line.thread, line.code)) - // XXX no way to suppress the deprecation warning - line.thread.stop() - in.redrawLine() - } - } - override protected def parentClassLoader = - settings.explicitParentLoader.getOrElse( classOf[ILoop].getClassLoader ) - } + intp = new ILoopInterpreter intp.setContextClassLoader() installSigIntHandler() } diff --git a/src/compiler/scala/tools/nsc/interpreter/IMain.scala b/src/compiler/scala/tools/nsc/interpreter/IMain.scala index 21c9dd735e..8c02296904 100644 --- a/src/compiler/scala/tools/nsc/interpreter/IMain.scala +++ b/src/compiler/scala/tools/nsc/interpreter/IMain.scala @@ -948,8 +948,15 @@ class IMain(val settings: Settings, protected val out: PrintWriter) { def symbolOfTerm(id: String): Symbol = requestForIdent(id) flatMap (_.definedSymbols get newTermName(id)) getOrElse NoSymbol - def runtimeClassAndTypeOfTerm(id: String): Option[(Class[_], Type)] = - for (clazz <- classOfTerm(id) ; tpe <- runtimeTypeOfTerm(id)) yield ((clazz, tpe)) + def runtimeClassAndTypeOfTerm(id: String): Option[(Class[_], Type)] = { + for { + clazz <- classOfTerm(id) + tpe <- runtimeTypeOfTerm(id) + nonAnon <- clazz.supers find (!_.isScalaAnonymous) + } yield { + (nonAnon, tpe) + } + } def runtimeTypeOfTerm(id: String): Option[Type] = { for { diff --git a/src/compiler/scala/tools/nsc/interpreter/RichClass.scala b/src/compiler/scala/tools/nsc/interpreter/RichClass.scala index cbeee9c056..5edc8fd202 100644 --- a/src/compiler/scala/tools/nsc/interpreter/RichClass.scala +++ b/src/compiler/scala/tools/nsc/interpreter/RichClass.scala @@ -10,6 +10,11 @@ class RichClass[T](val clazz: Class[T]) { def toManifest: Manifest[T] = Manifest.classType(clazz) def toTypeString: String = TypeStrings.fromClazz(clazz) + // Sadly isAnonymousClass does not return true for scala anonymous + // classes because our naming scheme is not doing well against the + // jvm's many assumptions. + def isScalaAnonymous = clazz.isAnonymousClass || (clazz.getName contains "$anon$") + /** It's not easy... to be... me... */ def supermans: List[Manifest[_]] = supers map (_.toManifest) def superNames: List[String] = supers map (_.getName) diff --git a/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala b/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala index 4bc2246468..e377a140af 100644 --- a/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala +++ b/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala @@ -41,17 +41,18 @@ trait TypeStrings { else if (primitives(s)) "scala." + s.capitalize else primitiveMap.getOrElse(s, NameTransformer decode s) } - def scalaName(clazz: JClass): String = { - val name = clazz.getName - scalaName(clazz.getEnclosingClass match { - case null => name - case encl => - val enclName = encl.getName - if (name startsWith (enclName + "$")) - enclName + "." + (name stripPrefix (enclName + "$")) - else - name - }) + // Trying to put humpty dumpty back together again. + def scalaName(clazz: JClass): String = { + val name = clazz.getName + val isAnon = clazz.isScalaAnonymous + val enclClass = clazz.getEnclosingClass + def enclPre = enclClass.getName + "$" + def enclMatch = name startsWith enclPre + + scalaName( + if (enclClass == null || isAnon || !enclMatch) name + else enclClass.getName + "." + (name stripPrefix enclPre) + ) } def scalaName(m: ClassManifest[_]): String = scalaName(m.erasure) def anyClass(x: Any): JClass = if (x == null) null else x.asInstanceOf[AnyRef].getClass |