summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-06-08 19:03:56 +0000
committerPaul Phillips <paulp@improving.org>2010-06-08 19:03:56 +0000
commite045a3ff33793e1d5bb61797f1afdcc3aba9e4c7 (patch)
treec0e4169ae8340106feefdd6eb3f1a946e823181e
parent22ea4e87f72a8fb549811474ef38ed97aa17012a (diff)
downloadscala-e045a3ff33793e1d5bb61797f1afdcc3aba9e4c7.tar.gz
scala-e045a3ff33793e1d5bb61797f1afdcc3aba9e4c7.tar.bz2
scala-e045a3ff33793e1d5bb61797f1afdcc3aba9e4c7.zip
Put in some long overdue soft padding around re...
Put in some long overdue soft padding around repl completion so when it pokes around the compiler in a way which surprises something, we don't lose the repl. Closes #3548, no review.
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Completion.scala18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/interpreter/Completion.scala b/src/compiler/scala/tools/nsc/interpreter/Completion.scala
index 58ce85f1f6..c163960f86 100644
--- a/src/compiler/scala/tools/nsc/interpreter/Completion.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/Completion.scala
@@ -309,7 +309,7 @@ class Completion(val repl: Interpreter) extends CompletionOutput {
override def complete(_buf: String, cursor: Int, candidates: JList[String]): Int = {
val buf = onull(_buf)
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] = {
@@ -343,7 +343,21 @@ class Completion(val repl: Interpreter) extends CompletionOutput {
def regularCompletion = tryCompletion(mkDotted, topLevelFor)
def fileCompletion = 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 cursor
+ }
+ catch {
+ case ex: Exception =>
+ DBG("Error: complete(%s, %s, _) provoked %s".format(_buf, cursor, ex))
+ candidates add " "
+ candidates add "<completion error>"
+ cursor
+ }
}
}
}