summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-02-04 04:31:38 +0000
committerPaul Phillips <paulp@improving.org>2011-02-04 04:31:38 +0000
commit4d862deb3a8ed81f9d084d1be41b617f074a2af5 (patch)
treea18f60f1333e7b76d27dd8e0a72e54d76c8272d6 /src/compiler
parentf61020bb96c06f8da1f57e89703b233d01ec254c (diff)
downloadscala-4d862deb3a8ed81f9d084d1be41b617f074a2af5.tar.gz
scala-4d862deb3a8ed81f9d084d1be41b617f074a2af5.tar.bz2
scala-4d862deb3a8ed81f9d084d1be41b617f074a2af5.zip
Ignore anonymous and synthetic classes when ass...
Ignore anonymous and synthetic classes when assessing the "runtime type" of an object. No review.
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ILoop.scala42
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/IMain.scala11
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/RichClass.scala5
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala23
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