diff options
author | Paul Phillips <paulp@improving.org> | 2011-05-29 20:20:17 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-05-29 20:20:17 +0000 |
commit | 4c7d23b470b71e730024d1f7797f742dc97207fa (patch) | |
tree | 65b6ef8d67bd7b4dba4ed341df3323cad9a30215 | |
parent | 1125a9cfab5c5bacfd10bf1a559b97437339dbaf (diff) | |
download | scala-4c7d23b470b71e730024d1f7797f742dc97207fa.tar.gz scala-4c7d23b470b71e730024d1f7797f742dc97207fa.tar.bz2 scala-4c7d23b470b71e730024d1f7797f742dc97207fa.zip |
Give some feedback on invalid :type expressions.
-rw-r--r-- | src/compiler/scala/tools/nsc/interpreter/ILoop.scala | 8 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/interpreter/IMain.scala | 28 | ||||
-rw-r--r-- | test/files/run/bug4556.check | 17 | ||||
-rw-r--r-- | test/files/run/bug4556.scala | 9 |
4 files changed, 52 insertions, 10 deletions
diff --git a/src/compiler/scala/tools/nsc/interpreter/ILoop.scala b/src/compiler/scala/tools/nsc/interpreter/ILoop.scala index 7884a7ac47..d83076f0be 100644 --- a/src/compiler/scala/tools/nsc/interpreter/ILoop.scala +++ b/src/compiler/scala/tools/nsc/interpreter/ILoop.scala @@ -419,10 +419,14 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter) try newJavap() catch { case _: Exception => null } + // TODO: unsolved types shouldn't make it out of this alive. + // + // scala> :t Some(Set(1)) getOrElse Set("abc") + // scala.collection.immutable.Set[_ >: ? <: ?] private def typeCommand(line: String): Result = { - intp.typeOfExpression(line) match { + intp.typeOfExpression(line, false) match { case Some(tp) => tp.toString - case _ => "Failed to determine type." + case _ => "" // the error message was already printed } } diff --git a/src/compiler/scala/tools/nsc/interpreter/IMain.scala b/src/compiler/scala/tools/nsc/interpreter/IMain.scala index 517e6ee6d0..3f91f3c0d6 100644 --- a/src/compiler/scala/tools/nsc/interpreter/IMain.scala +++ b/src/compiler/scala/tools/nsc/interpreter/IMain.scala @@ -978,7 +978,7 @@ class IMain(val settings: Settings, protected val out: PrintWriter) extends Impo // 2) A path loadable via getModule. // 3) Try interpreting it as an expression. private var typeOfExpressionDepth = 0 - def typeOfExpression(expr: String): Option[Type] = { + def typeOfExpression(expr: String, silent: Boolean = true): Option[Type] = { repldbg("typeOfExpression(" + expr + ")") if (typeOfExpressionDepth > 2) { repldbg("Terminating typeOfExpression recursion for expression: " + expr) @@ -988,23 +988,35 @@ class IMain(val settings: Settings, protected val out: PrintWriter) extends Impo def asQualifiedImport = { val name = expr.takeWhile(_ != '.') importedTermNamed(name) flatMap { sym => - typeOfExpression(sym.fullName + expr.drop(name.length)) + typeOfExpression(sym.fullName + expr.drop(name.length), true) } } def asModule = safeModule(expr) map (_.tpe) - def asExpr = beSilentDuring { + def asExpr = { val lhs = freshInternalVarName() - val line = "lazy val " + lhs + " = { " + expr + " } " + val line = "lazy val " + lhs + " =\n" + expr interpret(line, true) match { - case IR.Success => typeOfExpression(lhs) + case IR.Success => typeOfExpression(lhs, true) case _ => None } } + def evaluate() = { + typeOfExpressionDepth += 1 + try typeOfTerm(expr) orElse asModule orElse asExpr orElse asQualifiedImport + finally typeOfExpressionDepth -= 1 + } + + // Don't presently have a good way to suppress undesirable success output + // while letting errors through, so it is first trying it silently: if there + // is an error, and errors are desired, then it re-evaluates non-silently + // to induce the error message. + beSilentDuring(evaluate()) orElse { + if (!silent) + evaluate() - typeOfExpressionDepth += 1 - try typeOfTerm(expr) orElse asModule orElse asExpr orElse asQualifiedImport - finally typeOfExpressionDepth -= 1 + None + } } // def compileAndTypeExpr(expr: String): Option[Typer] = { // class TyperRun extends Run { diff --git a/test/files/run/bug4556.check b/test/files/run/bug4556.check new file mode 100644 index 0000000000..69d0b4fda1 --- /dev/null +++ b/test/files/run/bug4556.check @@ -0,0 +1,17 @@ +Type in expressions to have them evaluated. +Type :help for more information. + +scala> + +scala> :type [List(1, 2, 3)] +<console>:2: error: illegal start of simple expression + [List(1, 2, 3)] + ^ + + +scala> :type List(1, 2, 3) +List[Int] + +scala> + +scala> diff --git a/test/files/run/bug4556.scala b/test/files/run/bug4556.scala new file mode 100644 index 0000000000..8f682ce7df --- /dev/null +++ b/test/files/run/bug4556.scala @@ -0,0 +1,9 @@ +import scala.tools.partest.ReplTest + +object Test extends ReplTest { + def code = """ + |:type [List(1, 2, 3)] + |:type List(1, 2, 3) + """.stripMargin +} + |