summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-03-04 05:22:57 +0000
committerPaul Phillips <paulp@improving.org>2010-03-04 05:22:57 +0000
commit34b8e8fcbbb1b11ce81bf69b730abcb78b6699ec (patch)
treeb2ae69f2731acde0ec4b921cf2e1a73295ea3250 /src
parent65520ac86f5362bfa438c0b9e1a84f1f558e2618 (diff)
downloadscala-34b8e8fcbbb1b11ce81bf69b730abcb78b6699ec.tar.gz
scala-34b8e8fcbbb1b11ce81bf69b730abcb78b6699ec.tar.bz2
scala-34b8e8fcbbb1b11ce81bf69b730abcb78b6699ec.zip
A few yards short of the goal posts attempt at ...
A few yards short of the goal posts attempt at making our usage of Throwable subclasses more consistent. This patch eliminates a lot of ad hoc Exception/Error/etc. creation and various arbitrary choices are rendered slightly less arbitrary. From now on let's try not to use the word "Exception" or "Error" in the names of Throwable subclasses unless they actually derive (and make sense to derive) from Exception or Error. Review by community.
Diffstat (limited to 'src')
-rw-r--r--src/actors/scala/actors/Actor.scala12
-rw-r--r--src/actors/scala/actors/Combinators.scala2
-rw-r--r--src/actors/scala/actors/Reaction.scala4
-rw-r--r--src/actors/scala/actors/Reactor.scala12
-rw-r--r--src/actors/scala/actors/ReactorTask.scala4
-rw-r--r--src/actors/scala/actors/scheduler/ForkJoinScheduler.scala8
-rw-r--r--src/actors/scala/actors/scheduler/ResizableThreadPoolScheduler.scala8
-rw-r--r--src/actors/scala/actors/scheduler/SchedulerService.scala12
-rw-r--r--src/actors/scala/actors/scheduler/TerminationService.scala6
-rw-r--r--src/actors/scala/actors/scheduler/ThreadPoolScheduler.scala4
-rw-r--r--src/compiler/scala/tools/nsc/FatalError.scala4
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala35
-rw-r--r--src/compiler/scala/tools/nsc/ScriptRunner.scala2
-rw-r--r--src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/ast/TreeGen.scala2
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala48
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/CheckerError.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/Checkers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/GenICode.scala3
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/analysis/CompleteLattice.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala4
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/analysis/LubException.scala (renamed from src/compiler/scala/tools/nsc/backend/icode/analysis/LubError.scala)2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala6
-rw-r--r--src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala6
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala4
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala1
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala6
-rw-r--r--src/compiler/scala/tools/nsc/interactive/CompilerControl.scala18
-rw-r--r--src/compiler/scala/tools/nsc/interactive/Global.scala32
-rw-r--r--src/compiler/scala/tools/nsc/interactive/RangePositions.scala4
-rw-r--r--src/compiler/scala/tools/nsc/io/AbstractFile.scala3
-rw-r--r--src/compiler/scala/tools/nsc/io/VirtualDirectory.scala11
-rw-r--r--src/compiler/scala/tools/nsc/io/VirtualFile.scala13
-rw-r--r--src/compiler/scala/tools/nsc/io/ZipArchive.scala11
-rw-r--r--src/compiler/scala/tools/nsc/javac/JavaParsers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/MatchSupport.scala1
-rw-r--r--src/compiler/scala/tools/nsc/models/SemanticTokens.scala10
-rw-r--r--src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala15
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Definitions.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Scopes.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/StdNames.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/SymbolTable.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Symbols.scala12
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala33
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala3
-rw-r--r--src/compiler/scala/tools/nsc/symtab/clr/TypeParser.scala2
-rw-r--r--src/compiler/scala/tools/nsc/transform/AddInterfaces.scala2
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala20
-rw-r--r--src/compiler/scala/tools/nsc/transform/LiftCode.scala4
-rw-r--r--src/compiler/scala/tools/nsc/transform/UnCurry.scala8
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Contexts.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/DeVirtualize.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Infer.scala4
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala13
-rw-r--r--src/compiler/scala/tools/nsc/util/CommandLineParser.scala4
-rw-r--r--src/compiler/scala/tools/nsc/util/WorkScheduler.scala14
-rw-r--r--src/intellij/scala-lang.ipr2
-rw-r--r--src/library/scala/NotDefinedError.scala1
-rw-r--r--src/library/scala/runtime/NonLocalReturnControl.scala16
-rw-r--r--src/library/scala/runtime/NonLocalReturnException.scala7
-rw-r--r--src/library/scala/runtime/ScalaRunTime.scala4
-rw-r--r--src/library/scala/util/control/Breaks.scala6
-rw-r--r--src/library/scala/util/control/ControlThrowable.scala (renamed from src/library/scala/util/control/ControlException.scala)8
-rw-r--r--src/library/scala/xml/parsing/FatalError.scala7
-rw-r--r--src/library/scala/xml/parsing/MarkupParserCommon.scala2
67 files changed, 252 insertions, 259 deletions
diff --git a/src/actors/scala/actors/Actor.scala b/src/actors/scala/actors/Actor.scala
index aeda4a4670..6c8647daaa 100644
--- a/src/actors/scala/actors/Actor.scala
+++ b/src/actors/scala/actors/Actor.scala
@@ -10,7 +10,7 @@
package scala.actors
-import scala.util.control.ControlException
+import scala.util.control.ControlThrowable
import java.util.{Timer, TimerTask}
import java.util.concurrent.{ExecutionException, Callable}
@@ -29,7 +29,7 @@ object Actor extends Combinators {
// timer thread runs as daemon
private[actors] val timer = new Timer(true)
- private[actors] val suspendException = new SuspendActorException
+ private[actors] val suspendException = new SuspendActorControl
/**
* Returns the currently executing actor. Should be used instead
@@ -623,7 +623,7 @@ trait Actor extends AbstractActor with ReplyReactor with ReplyableActor {
}
// guarded by lock of this
- // never throws SuspendActorException
+ // never throws SuspendActorControl
private[actors] override def scheduleActor(f: PartialFunction[Any, Any], msg: Any) =
if (f eq null) {
// do nothing (timeout is handled instead)
@@ -800,12 +800,12 @@ trait Actor extends AbstractActor with ReplyReactor with ReplyableActor {
resumeActor()
else if (waitingFor ne Reactor.waitingForNone) {
scheduleActor(waitingFor, null)
- /* Here we should not throw a SuspendActorException,
+ /* Here we should not throw a SuspendActorControl,
since the current method is called from an actor that
is in the process of exiting.
Therefore, the contract for scheduleActor is that
- it never throws a SuspendActorException.
+ it never throws a SuspendActorControl.
*/
}
}
@@ -851,4 +851,4 @@ case class Exit(from: AbstractActor, reason: AnyRef)
* @version 0.9.8
* @author Philipp Haller
*/
-private[actors] class SuspendActorException extends Throwable with ControlException
+private[actors] class SuspendActorControl extends ControlThrowable
diff --git a/src/actors/scala/actors/Combinators.scala b/src/actors/scala/actors/Combinators.scala
index 073247827c..3c0be7ed15 100644
--- a/src/actors/scala/actors/Combinators.scala
+++ b/src/actors/scala/actors/Combinators.scala
@@ -34,6 +34,6 @@ private[actors] trait Combinators {
if (cond) { body andThen loopWhile(cond)(body) }
else continue
- def continue: Unit = throw new KillActorException
+ def continue: Unit = throw new KillActorControl
}
diff --git a/src/actors/scala/actors/Reaction.scala b/src/actors/scala/actors/Reaction.scala
index a8364bc8fb..7ff9204363 100644
--- a/src/actors/scala/actors/Reaction.scala
+++ b/src/actors/scala/actors/Reaction.scala
@@ -11,10 +11,10 @@
package scala.actors
-import scala.util.control.ControlException
+import scala.util.control.ControlThrowable
import java.lang.{InterruptedException, Runnable}
-private[actors] class KillActorException extends Throwable with ControlException
+private[actors] class KillActorControl extends ControlThrowable
/** <p>
* The abstract class <code>Reaction</code> associates
diff --git a/src/actors/scala/actors/Reactor.scala b/src/actors/scala/actors/Reactor.scala
index a6007a6cd8..a71368e6b2 100644
--- a/src/actors/scala/actors/Reactor.scala
+++ b/src/actors/scala/actors/Reactor.scala
@@ -119,11 +119,11 @@ trait Reactor extends OutputChannel[Any] with Combinators {
handler(item._1)
else {
scheduleActor(handler, item._1)
- /* Here, we throw a SuspendActorException to avoid
+ /* Here, we throw a SuspendActorControl to avoid
terminating this actor when the current ReactorTask
is finished.
- The SuspendActorException skips the termination code
+ The SuspendActorControl skips the termination code
in ReactorTask.
*/
throw Actor.suspendException
@@ -163,11 +163,11 @@ trait Reactor extends OutputChannel[Any] with Combinators {
// keep going
} else {
waitingFor = handler
- /* Here, we throw a SuspendActorException to avoid
+ /* Here, we throw a SuspendActorControl to avoid
terminating this actor when the current ReactorTask
is finished.
- The SuspendActorException skips the termination code
+ The SuspendActorControl skips the termination code
in ReactorTask.
*/
throw Actor.suspendException
@@ -191,7 +191,7 @@ trait Reactor extends OutputChannel[Any] with Combinators {
*
* assume handler != null
*
- * never throws SuspendActorException
+ * never throws SuspendActorControl
*/
private[actors] def scheduleActor(handler: PartialFunction[Any, Any], msg: Any) = {
val fun = () => handler(msg): Unit
@@ -228,7 +228,7 @@ trait Reactor extends OutputChannel[Any] with Combinators {
throw Actor.suspendException
}
first
- throw new KillActorException
+ throw new KillActorControl
}
protected[this] def exit(): Nothing = {
diff --git a/src/actors/scala/actors/ReactorTask.scala b/src/actors/scala/actors/ReactorTask.scala
index 3e64eab7a2..87ec7834fa 100644
--- a/src/actors/scala/actors/ReactorTask.scala
+++ b/src/actors/scala/actors/ReactorTask.scala
@@ -35,12 +35,12 @@ private[actors] class ReactorTask[T >: Null <: Reactor](var reactor: T, var fun:
reactor.exceptionHandler(e)
}
} catch {
- case _: KillActorException =>
+ case _: KillActorControl =>
}
reactor.kill()
}
catch {
- case _: SuspendActorException =>
+ case _: SuspendActorControl =>
// do nothing (continuation is already saved)
case e: Exception =>
diff --git a/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala b/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala
index e2537511ac..ab4fca04ca 100644
--- a/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala
+++ b/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala
@@ -67,12 +67,12 @@ class ForkJoinScheduler(val initCoreSize: Int, val maxSize: Int, daemon: Boolean
}
if (terminating)
- throw new QuitException
+ throw new QuitControl
if (allActorsTerminated) {
Debug.info(this+": all actors terminated")
terminating = true
- throw new QuitException
+ throw new QuitControl
}
if (!snapshoting) {
@@ -83,12 +83,12 @@ class ForkJoinScheduler(val initCoreSize: Int, val maxSize: Int, daemon: Boolean
Debug.info(this+": drained "+num+" tasks")
drainedTasks = list
terminating = true
- throw new QuitException
+ throw new QuitControl
}
}
}
} catch {
- case _: QuitException =>
+ case _: QuitControl =>
Debug.info(this+": initiating shutdown...")
while (!pool.isQuiescent()) {
try {
diff --git a/src/actors/scala/actors/scheduler/ResizableThreadPoolScheduler.scala b/src/actors/scala/actors/scheduler/ResizableThreadPoolScheduler.scala
index ff74d0bc8b..3687138e0e 100644
--- a/src/actors/scala/actors/scheduler/ResizableThreadPoolScheduler.scala
+++ b/src/actors/scala/actors/scheduler/ResizableThreadPoolScheduler.scala
@@ -112,7 +112,7 @@ class ResizableThreadPoolScheduler(protected val terminate: Boolean,
}
if (terminating)
- throw new QuitException
+ throw new QuitControl
if (!suspending) {
gc()
@@ -129,19 +129,19 @@ class ResizableThreadPoolScheduler(protected val terminate: Boolean,
Debug.info(this+": corePoolSize = "+coreSize+", maxPoolSize = "+maxSize)
terminating = true
- throw new QuitException
+ throw new QuitControl
}
}
} else {
drainedTasks = executor.shutdownNow()
Debug.info(this+": drained "+drainedTasks.size()+" tasks")
terminating = true
- throw new QuitException
+ throw new QuitControl
}
} // sync
}
} catch {
- case _: QuitException =>
+ case _: QuitControl =>
executor.shutdown()
// allow thread to exit
}
diff --git a/src/actors/scala/actors/scheduler/SchedulerService.scala b/src/actors/scala/actors/scheduler/SchedulerService.scala
index dca8bb5b9c..1f886dbae9 100644
--- a/src/actors/scala/actors/scheduler/SchedulerService.scala
+++ b/src/actors/scala/actors/scheduler/SchedulerService.scala
@@ -11,7 +11,7 @@
package scala.actors
package scheduler
-import scala.util.control.ControlException
+import scala.util.control.ControlThrowable
import java.lang.{Runnable, Thread, InterruptedException}
/**
@@ -46,16 +46,16 @@ abstract class SchedulerService(daemon: Boolean) extends Thread with IScheduler
case _: InterruptedException =>
}
if (terminating)
- throw new QuitException
+ throw new QuitControl
gc()
if (allActorsTerminated)
- throw new QuitException
+ throw new QuitControl
}
}
} catch {
- case _: QuitException =>
+ case _: QuitControl =>
Debug.info(this+": initiating shutdown...")
// invoke shutdown hook
onShutdown()
@@ -71,10 +71,10 @@ abstract class SchedulerService(daemon: Boolean) extends Thread with IScheduler
}
/**
- * The <code>QuitException</code> class is used to manage control flow
+ * The <code>QuitControl</code> class is used to manage control flow
* of certain schedulers and worker threads.
*
* @version 0.9.8
* @author Philipp Haller
*/
-private[actors] class QuitException extends Throwable with ControlException
+private[actors] class QuitControl extends ControlThrowable
diff --git a/src/actors/scala/actors/scheduler/TerminationService.scala b/src/actors/scala/actors/scheduler/TerminationService.scala
index b6f03f11e5..da71b6ac2b 100644
--- a/src/actors/scala/actors/scheduler/TerminationService.scala
+++ b/src/actors/scala/actors/scheduler/TerminationService.scala
@@ -40,14 +40,14 @@ abstract class TerminationService(terminate: Boolean)
case _: InterruptedException =>
}
if (terminating)
- throw new QuitException
+ throw new QuitControl
if (terminate && allActorsTerminated)
- throw new QuitException
+ throw new QuitControl
}
}
} catch {
- case _: QuitException =>
+ case _: QuitControl =>
Debug.info(this+": initiating shutdown...")
// invoke shutdown hook
onShutdown()
diff --git a/src/actors/scala/actors/scheduler/ThreadPoolScheduler.scala b/src/actors/scala/actors/scheduler/ThreadPoolScheduler.scala
index 2eb18645ff..2061207ee1 100644
--- a/src/actors/scala/actors/scheduler/ThreadPoolScheduler.scala
+++ b/src/actors/scala/actors/scheduler/ThreadPoolScheduler.scala
@@ -58,13 +58,13 @@ class ThreadPoolScheduler(protected var executor: ThreadPoolExecutor,
}
if (terminating || (terminate && allActorsTerminated))
- throw new QuitException
+ throw new QuitControl
gc()
}
}
} catch {
- case _: QuitException =>
+ case _: QuitControl =>
Debug.info(this+": initiating shutdown...")
// invoke shutdown hook
onShutdown()
diff --git a/src/compiler/scala/tools/nsc/FatalError.scala b/src/compiler/scala/tools/nsc/FatalError.scala
index 7bc1bc52d8..aee083fa14 100644
--- a/src/compiler/scala/tools/nsc/FatalError.scala
+++ b/src/compiler/scala/tools/nsc/FatalError.scala
@@ -6,7 +6,9 @@
package scala.tools.nsc
-case class FatalError(msg: String) extends Exception(msg)
+import scala.util.control.ControlThrowable
+
+case class FatalError(msg: String) extends Throwable(msg) with ControlThrowable
class MissingRequirementError(val req: String) extends FatalError(req + " not found.")
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala
index 92c72b1549..bf75c8d121 100644
--- a/src/compiler/scala/tools/nsc/Global.scala
+++ b/src/compiler/scala/tools/nsc/Global.scala
@@ -154,29 +154,26 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable
if (settings.log contains phase.name) inform("[log " + phase + "] " + msg)
}
- class ErrorWithPosition(val pos: Int, val error: Throwable) extends Error
-
- def tryWith[T](pos: Int, body: => T): T = try {
- body
- } catch {
- case e : ErrorWithPosition => throw e
- case te: TypeError => throw te
- case e : Error => throw new ErrorWithPosition(pos, e)
- case e : RuntimeException => throw new ErrorWithPosition(pos, e)
- }
+ class ThrowableWithPosition(val pos: Int, val error: Throwable) extends Throwable
+
+ def tryWith[T](pos: Int, body: => T): T =
+ try body
+ catch {
+ case e : ThrowableWithPosition => throw e
+ case te: TypeError => throw te
+ case e : RuntimeException => throw new ThrowableWithPosition(pos, e)
+ }
- def catchWith[T](source : SourceFile, body : => T) : T = try {
- body
- } catch {
- case e : ErrorWithPosition =>
- logError("POS: " + source.dbg(e.pos), e)
- throw e.error
- }
+ def catchWith[T](source : SourceFile, body : => T) : T =
+ try body
+ catch {
+ case e : ThrowableWithPosition =>
+ logError("POS: " + source.dbg(e.pos), e)
+ throw e.error
+ }
def logError(msg: String, t: Throwable): Unit = ()
- def abort(msg: String) = throw new Error(msg)
-
// ------------ File interface -----------------------------------------
private val reader: SourceReader = {
diff --git a/src/compiler/scala/tools/nsc/ScriptRunner.scala b/src/compiler/scala/tools/nsc/ScriptRunner.scala
index 7be39aa27c..51e85eaf95 100644
--- a/src/compiler/scala/tools/nsc/ScriptRunner.scala
+++ b/src/compiler/scala/tools/nsc/ScriptRunner.scala
@@ -112,7 +112,7 @@ object ScriptRunner
jar.close
}
catch {
- case _: Error => jarFile.delete() // XXX what errors to catch?
+ case _: Exception => jarFile.delete()
}
}
diff --git a/src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala b/src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala
index 42428c7d8f..eaad12c0ed 100644
--- a/src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala
+++ b/src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala
@@ -680,7 +680,7 @@ abstract class TreeBrowsers {
toDocument(thistpe) :/: ", " :/:
toDocument(supertpe) ::")"))
case _ =>
- throw new Error("Unknown case: " + t.toString() +", "+ t.getClass)
+ Predef.error("Unknown case: " + t.toString() +", "+ t.getClass)
}
}
diff --git a/src/compiler/scala/tools/nsc/ast/TreeGen.scala b/src/compiler/scala/tools/nsc/ast/TreeGen.scala
index 104e00a03d..ccb60bc886 100644
--- a/src/compiler/scala/tools/nsc/ast/TreeGen.scala
+++ b/src/compiler/scala/tools/nsc/ast/TreeGen.scala
@@ -98,7 +98,7 @@ abstract class TreeGen
mkAttributedQualifier(firstStable.get)
case _ =>
- throw new Error("bad qualifier: " + tpe)
+ abort("bad qualifier: " + tpe)
}
/** Builds a reference to given symbol with given stable prefix. */
diff --git a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala
index 53fc6542b2..e918489446 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala
@@ -9,7 +9,7 @@ package ast.parser
import scala.collection.mutable
import mutable.{ Buffer, ArrayBuffer, ListBuffer, HashMap }
-import scala.util.control.ControlException
+import scala.util.control.ControlThrowable
import scala.tools.nsc.util.{SourceFile,CharArrayReader}
import scala.xml.{ Text, TextBuffer }
import scala.xml.Utility.{ isNameStart, isNameChar, isSpace }
@@ -35,15 +35,15 @@ trait MarkupParsers
{
self: Parsers =>
- case object MissingEndTagException extends RuntimeException with ControlException {
+ case object MissingEndTagControl extends ControlThrowable {
override def getMessage = "start tag was here: "
}
- case object ConfusedAboutBracesException extends RuntimeException with ControlException {
+ case object ConfusedAboutBracesControl extends ControlThrowable {
override def getMessage = " I encountered a '}' where I didn't expect one, maybe this tag isn't closed <"
}
- case object TruncatedXML extends RuntimeException with ControlException {
+ case object TruncatedXMLControl extends ControlThrowable {
override def getMessage = "input ended while parsing XML"
}
@@ -63,9 +63,9 @@ trait MarkupParsers
val eof = false
- def truncatedError(msg: String): Nothing = throw TruncatedXML
+ def truncatedError(msg: String): Nothing = throw TruncatedXMLControl
def xHandleError(that: Char, msg: String) =
- if (ch == SU) throw TruncatedXML
+ if (ch == SU) throw TruncatedXMLControl
else reportSyntaxError(msg)
var input : CharArrayReader = _
@@ -92,11 +92,11 @@ trait MarkupParsers
private def errorBraces() = {
reportSyntaxError("in XML content, please use '}}' to express '}'")
- throw ConfusedAboutBracesException
+ throw ConfusedAboutBracesControl
}
def errorNoEnd(tag: String) = {
reportSyntaxError("expected closing tag of " + tag)
- throw MissingEndTagException
+ throw MissingEndTagControl
}
/** checks whether next character starts a Scala block, if yes, skip it.
@@ -137,7 +137,7 @@ trait MarkupParsers
nextch
xEmbeddedExpr
case SU =>
- throw TruncatedXML
+ throw TruncatedXMLControl
case _ =>
errorAndResult("' or \" delimited attribute value or '{' scala-expr '}' expected", Literal(Constant("<syntax-error>")))
}
@@ -307,23 +307,21 @@ trait MarkupParsers
}
/** Some try/catch/finally logic used by xLiteral and xLiteralPattern. */
- private def xLiteralCommon(f: () => Tree, ifTruncated: Exception => Unit): Tree =
- try f()
+ private def xLiteralCommon(f: () => Tree, ifTruncated: String => Unit): Tree = {
+ try return f()
catch {
- case ex: RuntimeException =>
- ex match {
- case c @ TruncatedXML =>
- ifTruncated(c)
- case c @ (MissingEndTagException | ConfusedAboutBracesException) =>
- parser.syntaxError(debugLastPos, c.getMessage + debugLastElem + ">")
- case _: ArrayIndexOutOfBoundsException =>
- parser.syntaxError(debugLastPos, "missing end tag in XML literal for <%s>" format debugLastElem)
- case _ => throw ex
- }
- EmptyTree
+ case c @ TruncatedXMLControl =>
+ ifTruncated(c.getMessage)
+ case c @ (MissingEndTagControl | ConfusedAboutBracesControl) =>
+ parser.syntaxError(debugLastPos, c.getMessage + debugLastElem + ">")
+ case _: ArrayIndexOutOfBoundsException =>
+ parser.syntaxError(debugLastPos, "missing end tag in XML literal for <%s>" format debugLastElem)
}
finally parser.in resume Tokens.XMLSTART
+ EmptyTree
+ }
+
/** Use a lookahead parser to run speculative body, and return the first char afterward. */
private def charComingAfter(body: => Unit): Char = {
input = input.lookaheadReader
@@ -361,7 +359,7 @@ trait MarkupParsers
ts(0)
}
},
- ex => parser.incompleteInputError(ex.getMessage)
+ msg => parser.incompleteInputError(msg)
)
/** @see xmlPattern. resynchronizes after successful parse
@@ -377,7 +375,7 @@ trait MarkupParsers
tree
}
},
- ex => parser.syntaxError(curOffset, ex.getMessage)
+ msg => parser.syntaxError(curOffset, msg)
)
def escapeToScala[A](op: => A, kind: String) = {
@@ -436,7 +434,7 @@ trait MarkupParsers
assert(!xEmbeddedBlock, "problem with embedded block")
case SU =>
- throw TruncatedXML
+ throw TruncatedXMLControl
case _ => // text
appendText(r2p(start1, start1, curOffset), ts, xText)
diff --git a/src/compiler/scala/tools/nsc/backend/icode/CheckerError.scala b/src/compiler/scala/tools/nsc/backend/icode/CheckerError.scala
index 1e6b8abafc..9d102eef28 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/CheckerError.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/CheckerError.scala
@@ -9,5 +9,5 @@ package scala.tools.nsc
package backend
package icode
-class CheckerError(s: String) extends Exception(s)
+class CheckerException(s: String) extends Exception(s)
diff --git a/src/compiler/scala/tools/nsc/backend/icode/Checkers.scala b/src/compiler/scala/tools/nsc/backend/icode/Checkers.scala
index cbbd92a69b..63ccb12495 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/Checkers.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/Checkers.scala
@@ -151,7 +151,7 @@ abstract class Checkers {
else if (s2 eq emptyStack) s1
else {
if (s1.length != s2.length)
- throw new CheckerError("Incompatible stacks: " + s1 + " and " + s2 + " in " + method + " at entry to block: " + bl);
+ throw new CheckerException("Incompatible stacks: " + s1 + " and " + s2 + " in " + method + " at entry to block: " + bl);
new TypeStack((s1.types, s2.types).zipped map lub)
}
}
diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
index 35a5f80d1f..e13c72a8a5 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
@@ -836,8 +836,7 @@ abstract class GenICode extends SubComponent {
generatedType = l.kind
} catch {
case ex: MatchError =>
- throw new Error("symbol " + tree.symbol +
- " does not exist in " + ctx.method)
+ abort("symbol " + tree.symbol + " does not exist in " + ctx.method)
}
}
}
diff --git a/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala b/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala
index d83659f477..4b53a5e2ae 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala
@@ -138,7 +138,7 @@ trait TypeKinds { self: ICodes =>
(b.isReferenceType || b.isArrayType))
toTypeKind(lub0(a.toType, b.toType))
else
- throw new CheckerError("Incompatible types: " + a + " with " + b)
+ throw new CheckerException("Incompatible types: " + a + " with " + b)
}
}
diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/CompleteLattice.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/CompleteLattice.scala
index c26030cdb6..95f4418759 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/analysis/CompleteLattice.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/CompleteLattice.scala
@@ -40,7 +40,7 @@ trait CompleteLattice {
def lub(xs: List[Elem], exceptional: Boolean): Elem = try {
if (xs == Nil) bottom else xs reduceLeft lub2(exceptional)
} catch {
- case e: LubError =>
+ case e: LubException =>
Console.println("Lub on blocks: " + xs)
throw e
}
diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala
index d71fa8420d..1fbbc10c3d 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala
@@ -184,14 +184,14 @@ abstract class CopyPropagation {
if (exceptional) exceptionHandlerStack
else {
// if (a.stack.length != b.stack.length)
-// throw new LubError(a, b, "Invalid stacks in states: ");
+// throw new LubException(a, b, "Invalid stacks in states: ");
(a.stack, b.stack).zipped map { (v1, v2) =>
if (v1 == v2) v1 else Unknown
}
}
/* if (a.stack.length != b.stack.length)
- throw new LubError(a, b, "Invalid stacks in states: ");
+ throw new LubException(a, b, "Invalid stacks in states: ");
val resStack = List.map2(a.stack, b.stack) { (v1, v2) =>
if (v1 == v2) v1 else Unknown
}
diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/LubError.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/LubException.scala
index ae0991f60a..0474d12a8b 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/analysis/LubError.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/LubException.scala
@@ -8,6 +8,6 @@
package scala.tools.nsc
package backend.icode.analysis
-class LubError(a: Any, b: Any, msg: String) extends Exception {
+class LubException(a: Any, b: Any, msg: String) extends Exception {
override def toString() = "Lub error: " + msg + a + b
}
diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala
index 132e85f6d3..858512c9b1 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala
@@ -52,7 +52,7 @@ abstract class TypeFlowAnalysis {
else if ((s1 eq exceptionHandlerStack) || (s2 eq exceptionHandlerStack)) Predef.error("merging with exhan stack")
else {
// if (s1.length != s2.length)
-// throw new CheckerError("Incompatible stacks: " + s1 + " and " + s2);
+// throw new CheckerException("Incompatible stacks: " + s1 + " and " + s2);
new TypeStack((s1.types, s2.types).zipped map icodes.lub)
}
}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
index 16f87bd024..0b5028980e 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
@@ -1015,7 +1015,7 @@ abstract class GenJVM extends SubComponent {
varsInBlock.clear
for (instr <- b) {
- class CompilationError(msg: String) extends Error {
+ class CompilationException(msg: String) extends Exception(msg) {
override def toString: String = {
msg +
"\nCurrent method: " + method +
@@ -1025,7 +1025,7 @@ abstract class GenJVM extends SubComponent {
method.dump
}
}
- def assert(cond: Boolean, msg: String) = if (!cond) throw new CompilationError(msg);
+ def assert(cond: Boolean, msg: String) = if (!cond) throw new CompilationException(msg)
instr match {
case THIS(clasz) =>
@@ -1840,7 +1840,7 @@ abstract class GenJVM extends SubComponent {
def assert(cond: Boolean, msg: => String) = if (!cond) {
method.dump
- throw new Error(msg + "\nMethod: " + method)
+ abort(msg + "\nMethod: " + method)
}
def assert(cond: Boolean) { assert(cond, "Assertion failed.") }
diff --git a/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala b/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala
index 4177cddd3f..c7b1fc1dd8 100644
--- a/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala
+++ b/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala
@@ -1690,7 +1690,7 @@ abstract class GenMSIL extends SubComponent {
val name = typeString(sym)
val typ = clrTypes.getType(name)
if (typ == null)
- throw new Error(showsym(sym) + " with name " + name)
+ abort(showsym(sym) + " with name " + name)
else {
clrTypes.types(sym) = typ
typ
@@ -2046,7 +2046,7 @@ abstract class GenMSIL extends SubComponent {
if (constr eq null) {
System.out.println("Cannot find constructor " + sym.owner + "::" + sym.name)
System.out.println("scope = " + sym.owner.tpe.decls)
- throw new Error(sym.fullName)
+ abort(sym.fullName)
}
else {
mapConstructor(sym, constr)
@@ -2080,7 +2080,7 @@ abstract class GenMSIL extends SubComponent {
if (method eq null) {
System.out.println("Cannot find method " + sym.owner + "::" + msilName(sym))
System.out.println("scope = " + sym.owner.tpe.decls)
- throw new Error(sym.fullName)
+ abort(sym.fullName)
}
else {
mapMethod(sym, method)
diff --git a/src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala b/src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala
index b05061b0f6..1812753ccd 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala
@@ -9,7 +9,7 @@ package scala.tools.nsc
package backend.opt;
import scala.collection.mutable.{Map, HashMap};
-import scala.tools.nsc.backend.icode.analysis.LubError;
+import scala.tools.nsc.backend.icode.analysis.LubException;
import scala.tools.nsc.symtab._;
/**
@@ -181,7 +181,7 @@ abstract class ClosureElimination extends SubComponent {
}
}
}} catch {
- case e: LubError =>
+ case e: LubException =>
Console.println("In method: " + m)
Console.println(e)
e.printStackTrace
diff --git a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
index ba51c13d7c..b9d4b8d5a4 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
@@ -10,7 +10,6 @@ package backend.opt
import scala.collection._
import scala.collection.immutable.{Map, HashMap, Set, HashSet}
-import scala.tools.nsc.backend.icode.analysis.LubError
import scala.tools.nsc.symtab._
/**
diff --git a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
index 5fdfe85c7e..8a646d2288 100644
--- a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
+++ b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
@@ -21,7 +21,7 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { extractor =
/** */
def makeModel: Package =
- makePackage(RootPackage, null) getOrElse { throw new Error("no documentable class found in compilation units") }
+ makePackage(RootPackage, null) getOrElse abort("no documentable class found in compilation units")
object commentator {
@@ -278,7 +278,7 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { extractor =
val bSym = normalizeTemplate(aSym)
if (bSym.isPackage) inTpl match {
case inPkg: PackageImpl => makePackage(bSym, inPkg) getOrElse (new NoDocTemplateImpl(bSym, inPkg))
- case _ => throw new Error("'" + bSym + "' must be in a package")
+ case _ => abort("'" + bSym + "' must be in a package")
}
else if ((bSym.sourceFile != null) && bSym.isPublic && !bSym.isLocal) inTpl match {
case inDTpl: DocTemplateImpl => makeDocTemplate(bSym, inDTpl)
@@ -317,7 +317,7 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { extractor =
def isCaseClass = sym.isClass && sym.hasFlag(Flags.CASE)
}
else
- throw new Error("'" + bSym + "' that isn't a class, trait or object cannot be built as a documentable template")
+ abort("'" + bSym + "' that isn't a class, trait or object cannot be built as a documentable template")
}
/** */
diff --git a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala
index ab02ae7460..5c16bb4465 100644
--- a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala
+++ b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala
@@ -2,7 +2,7 @@ package scala.tools.nsc
package interactive
import scala.concurrent.SyncVar
-import scala.util.control.ControlException
+import scala.util.control.ControlThrowable
import scala.tools.nsc.io.AbstractFile
import scala.tools.nsc.util.{SourceFile, Position, WorkScheduler}
import scala.tools.nsc.symtab._
@@ -124,23 +124,19 @@ trait CompilerControl { self: Global =>
}
/** Cancel currently pending high-priority jobs */
- def askCancel() =
- scheduler.raise(new CancelActionReq)
+ def askCancel() = scheduler raise CancelActionReq
/** Cancel current compiler run and start a fresh one where everything will be re-typechecked
* (but not re-loaded).
*/
- def askReset() =
- scheduler.raise(new FreshRunReq)
+ def askReset() = scheduler raise FreshRunReq
/** Tell the compile server to shutdown, and do not restart again */
- def askShutdown() =
- scheduler.raise(new ShutdownReq)
+ def askShutdown() = scheduler raise ShutdownReq
// ---------------- Interpreted exeptions -------------------
- class CancelActionReq extends Exception with ControlException
- class FreshRunReq extends Exception with ControlException
- class ShutdownReq extends Exception with ControlException
-
+ object CancelActionReq extends ControlThrowable
+ object FreshRunReq extends ControlThrowable
+ object ShutdownReq extends ControlThrowable
}
diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala
index 1f2a606e6b..c4fec12667 100644
--- a/src/compiler/scala/tools/nsc/interactive/Global.scala
+++ b/src/compiler/scala/tools/nsc/interactive/Global.scala
@@ -5,7 +5,7 @@ import java.io.{ PrintWriter, StringWriter }
import scala.collection.mutable.{LinkedHashMap, SynchronizedMap}
import scala.concurrent.SyncVar
-import scala.util.control.ControlException
+import scala.util.control.ControlThrowable
import scala.tools.nsc.io.AbstractFile
import scala.tools.nsc.util.{SourceFile, Position, RangePosition, OffsetPosition, NoPosition, WorkScheduler}
import scala.tools.nsc.reporters._
@@ -91,10 +91,10 @@ self =>
// it will still be null now?
if (context.unit != null)
integrateNew()
- throw new FreshRunReq
- } catch {
- case ex : ValidateError => // Ignore, this will have been reported elsewhere
- case t : Throwable => throw t
+ throw FreshRunReq
+ }
+ catch {
+ case ex : ValidateException => // Ignore, this will have been reported elsewhere
}
}
}
@@ -114,9 +114,9 @@ self =>
* Poll for work reload/typedTreeAt/doFirst commands during background checking.
*/
def pollForWork() {
- scheduler.pollException() match {
- case Some(ex: CancelActionReq) => if (acting) throw ex
- case Some(ex: FreshRunReq) =>
+ scheduler.pollThrowable() match {
+ case Some(ex @ CancelActionReq) => if (acting) throw ex
+ case Some(ex @ FreshRunReq) =>
currentTyperRun = newTyperRun
minRunId = currentRunId
if (outOfDate) throw ex
@@ -132,7 +132,7 @@ self =>
action()
if (debugIDE) println("done with work item: "+action)
} catch {
- case ex: CancelActionReq =>
+ case CancelActionReq =>
if (debugIDE) println("cancelled work item: "+action)
} finally {
if (debugIDE) println("quitting work item: "+action)
@@ -195,19 +195,19 @@ self =>
backgroundCompile()
outOfDate = false
} catch {
- case ex: FreshRunReq =>
+ case FreshRunReq =>
}
}
}
} catch {
- case ex: ShutdownReq =>
+ case ShutdownReq =>
;
case ex =>
outOfDate = false
compileRunner = newRunnerThread
ex match {
- case _ : FreshRunReq => // This shouldn't be reported
- case _ : ValidateError => // This will have been reported elsewhere
+ case FreshRunReq => // This shouldn't be reported
+ case _ : ValidateException => // This will have been reported elsewhere
case _ => ex.printStackTrace(); inform("Fatal Error: "+ex)
}
}
@@ -276,7 +276,7 @@ self =>
result set Left(op)
return
} catch {
- case ex : FreshRunReq =>
+ case ex @ FreshRunReq =>
scheduler.postWorkItem(() => respond(result)(op))
throw ex
case ex =>
@@ -298,7 +298,7 @@ self =>
/** Make sure a set of compilation units is loaded and parsed */
def reload(sources: List[SourceFile], result: Response[Unit]) {
respond(result)(reloadSources(sources))
- if (outOfDate) throw new FreshRunReq
+ if (outOfDate) throw FreshRunReq
else outOfDate = true
}
@@ -534,7 +534,7 @@ self =>
def newTyperRun = new TyperRun
- class TyperResult(val tree: Tree) extends Exception with ControlException
+ class TyperResult(val tree: Tree) extends ControlThrowable
assert(globalPhase.id == 0)
}
diff --git a/src/compiler/scala/tools/nsc/interactive/RangePositions.scala b/src/compiler/scala/tools/nsc/interactive/RangePositions.scala
index 49fc8be185..0186103aa1 100644
--- a/src/compiler/scala/tools/nsc/interactive/RangePositions.scala
+++ b/src/compiler/scala/tools/nsc/interactive/RangePositions.scala
@@ -199,7 +199,7 @@ self: scala.tools.nsc.Global =>
inform(tree.toString)
inform("")
inform("=======")
- throw new ValidateError(msg)
+ throw new ValidateException(msg)
}
def validate(tree: Tree, encltree: Tree): Unit = {
@@ -238,7 +238,7 @@ self: scala.tools.nsc.Global =>
validate(tree, tree)
}
- class ValidateError(msg : String) extends Exception(msg)
+ class ValidateException(msg : String) extends Exception(msg)
// ---------------- Locating trees ----------------------------------
diff --git a/src/compiler/scala/tools/nsc/io/AbstractFile.scala b/src/compiler/scala/tools/nsc/io/AbstractFile.scala
index 1f9e6c55f0..04aa661bd6 100644
--- a/src/compiler/scala/tools/nsc/io/AbstractFile.scala
+++ b/src/compiler/scala/tools/nsc/io/AbstractFile.scala
@@ -244,6 +244,9 @@ abstract class AbstractFile extends AnyRef with Iterable[AbstractFile] {
Option(lookupName(name, true)) getOrElse new PlainFile((sfile.get / name).createDirectory())
}
+ protected def unsupported(): Nothing = unsupported(null)
+ protected def unsupported(msg: String): Nothing = throw new UnsupportedOperationException(msg)
+
/** Returns the path of this abstract file. */
override def toString() = path
diff --git a/src/compiler/scala/tools/nsc/io/VirtualDirectory.scala b/src/compiler/scala/tools/nsc/io/VirtualDirectory.scala
index 5675b264ac..f7e6832109 100644
--- a/src/compiler/scala/tools/nsc/io/VirtualDirectory.scala
+++ b/src/compiler/scala/tools/nsc/io/VirtualDirectory.scala
@@ -31,20 +31,15 @@ extends AbstractFile {
override def output = error("directories cannot be written")
/** Does this abstract file denote an existing file? */
- def create {
- throw new UnsupportedOperationException
- }
+ def create { unsupported }
/** Delete the underlying file or directory (recursively). */
- def delete {
- throw new UnsupportedOperationException
- }
+ def delete { unsupported }
/** Returns an abstract file with the given name. It does not
* check that it exists.
*/
- def lookupNameUnchecked(name: String, directory: Boolean): AbstractFile =
- throw new UnsupportedOperationException()
+ def lookupNameUnchecked(name: String, directory: Boolean): AbstractFile = unsupported
private val files = mutable.Map.empty[String, AbstractFile]
diff --git a/src/compiler/scala/tools/nsc/io/VirtualFile.scala b/src/compiler/scala/tools/nsc/io/VirtualFile.scala
index 256d02c5a5..6e3ad7ead6 100644
--- a/src/compiler/scala/tools/nsc/io/VirtualFile.scala
+++ b/src/compiler/scala/tools/nsc/io/VirtualFile.scala
@@ -62,7 +62,7 @@ class VirtualFile(val name: String, _path: String) extends AbstractFile
}
}
- def container: AbstractFile = throw new Error("not supported")
+ def container: AbstractFile = unsupported
/** Is this abstract file a directory? */
def isDirectory: Boolean = false
@@ -77,14 +77,10 @@ class VirtualFile(val name: String, _path: String) extends AbstractFile
}
/** Does this abstract file denote an existing file? */
- def create {
- throw new UnsupportedOperationException
- }
+ def create { unsupported }
/** Delete the underlying file or directory (recursively). */
- def delete {
- throw new UnsupportedOperationException
- }
+ def delete { unsupported }
/**
* Returns the abstract file in this abstract directory with the
@@ -104,8 +100,7 @@ class VirtualFile(val name: String, _path: String) extends AbstractFile
/** Returns an abstract file with the given name. It does not
* check that it exists.
*/
- def lookupNameUnchecked(name: String, directory: Boolean): AbstractFile =
- throw new UnsupportedOperationException()
+ def lookupNameUnchecked(name: String, directory: Boolean) = unsupported
//########################################################################
}
diff --git a/src/compiler/scala/tools/nsc/io/ZipArchive.scala b/src/compiler/scala/tools/nsc/io/ZipArchive.scala
index aa92b896db..9d062a45f1 100644
--- a/src/compiler/scala/tools/nsc/io/ZipArchive.scala
+++ b/src/compiler/scala/tools/nsc/io/ZipArchive.scala
@@ -157,8 +157,7 @@ private[io] trait ZipContainer extends AbstractFile
/** Returns an abstract file with the given name. It does not
* check that it exists.
*/
- override def lookupNameUnchecked(name: String, directory: Boolean): AbstractFile =
- throw new UnsupportedOperationException()
+ override def lookupNameUnchecked(name: String, directory: Boolean) = unsupported
/** Returns all abstract subfiles of this abstract directory. */
override def iterator: Iterator[AbstractFile] = root.iterator
@@ -274,10 +273,10 @@ final class URLZipArchive(url: URL) extends AbstractFile with ZipContainer
/** Methods we don't support but have to implement because of the design */
def file: JFile = null
- def create: Unit = throw new UnsupportedOperationException
- def delete: Unit = throw new UnsupportedOperationException
- def output = throw new Error("unsupported")
- def container = throw new Error("unsupported")
+ def create: Unit = unsupported
+ def delete: Unit = unsupported
+ def output = unsupported
+ def container = unsupported
abstract class Entry(name: String, path: String) extends VirtualFile(name, path) {
final override def path = "%s(%s)".format(URLZipArchive.this, super.path)
diff --git a/src/compiler/scala/tools/nsc/javac/JavaParsers.scala b/src/compiler/scala/tools/nsc/javac/JavaParsers.scala
index 16430b0a42..92dbc97965 100644
--- a/src/compiler/scala/tools/nsc/javac/JavaParsers.scala
+++ b/src/compiler/scala/tools/nsc/javac/JavaParsers.scala
@@ -429,7 +429,7 @@ trait JavaParsers extends JavaScanners {
return Modifiers(flags, privateWithin)
}
}
- throw new Error("should not be here")
+ abort("should not be here")
}
def typeParams(): List[TypeDef] =
diff --git a/src/compiler/scala/tools/nsc/matching/MatchSupport.scala b/src/compiler/scala/tools/nsc/matching/MatchSupport.scala
index 374e974170..2f50435db6 100644
--- a/src/compiler/scala/tools/nsc/matching/MatchSupport.scala
+++ b/src/compiler/scala/tools/nsc/matching/MatchSupport.scala
@@ -22,7 +22,6 @@ trait MatchSupport extends ast.TreeDSL { self: ParallelMatching =>
private final def trace = settings.Ypmatdebug.value
def impossible: Nothing = abort("this never happens")
- def abort(msg: String): Nothing = Predef.error(msg)
object Types {
import definitions._
diff --git a/src/compiler/scala/tools/nsc/models/SemanticTokens.scala b/src/compiler/scala/tools/nsc/models/SemanticTokens.scala
index 577452194b..4da23b358b 100644
--- a/src/compiler/scala/tools/nsc/models/SemanticTokens.scala
+++ b/src/compiler/scala/tools/nsc/models/SemanticTokens.scala
@@ -262,7 +262,6 @@ class SemanticTokens(val compiler: Global) {
build(arg.tpt);
}
}
- try {
//TPT=scala.Iterator[DocGenerator.this.compiler0.CompilationUnit] 260 class scala.tools.nsc.ast.Trees$TypeTree scala.Iterator[DocGenerator.this.compiler0.CompilationUnit] class scala.tools.nsc.symtab.Types$$anon$5
if ((tree.tpt eq null) || (tree.tpt.tpe eq null)) {
//Console.err.println("BAD: " + tree.tpt + " in " + tree);
@@ -270,11 +269,6 @@ class SemanticTokens(val compiler: Global) {
//Console.err.println("TPT=" + tree.tpt + " " + tree.tpt.pos + " " + tree.tpt.getClass() + " " + tree.tpt.tpe + " " + tree.tpt.tpe.getClass() + " " + tree.tpt.tpe.getClass().getSuperclass());
build(tree.tpt);
}
- } catch {
- case e: Error =>
- Console.err.println("VALDEF: " + tree + " " + tree.tpt + " " + tree.pos + " " + tree.tpt.pos);
- throw e;
- }
//Console.err.println("RHS: " + tree.rhs + " " + tree.rhs.getClass() + " " + tree.rhs.getClass().getSuperclass());
build(tree.rhs);
}
@@ -554,7 +548,7 @@ class SemanticTokens(val compiler: Global) {
Console.err.println("" + tree + "@" + tree.pos + " not in " +
unit.source.file.name + "[" + buf.length + "]");
Thread.dumpStack()
- throw new Error()
+ abort()
}
return 0
}
@@ -621,7 +615,7 @@ class SemanticTokens(val compiler: Global) {
Console.err.println("OFFSET=" + offset + " " + tok + " " + tok.length);
Console.err.println(" " + cursor.offset + " " + gap.length);
gap.length0 = offset - cursor.offset + tok.length
- //throw new Error();
+ //abort();
}
if (offset == cursor.offset) {
// replace or prepend
diff --git a/src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala b/src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala
index 6564cf881f..f7d380c975 100644
--- a/src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala
+++ b/src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala
@@ -103,18 +103,21 @@ class ConsoleReporter(val settings: Settings, reader: BufferedReader, writer: Pr
writer.flush()
var line = reader.readLine()
if (line ne null) {
- line = line.toLowerCase()
- if ("abort" startsWith line)
- throw new Error("user abort")
- if ("resume" startsWith line) continue = false
+ line = line.toLowerCase()
+ if ("abort" startsWith line)
+ abort("user abort")
+ if ("resume" startsWith line)
+ continue = false
}
}
- } catch {
+ }
+ catch {
case ex: IOException => {
ex.printStackTrace()
- throw new Error("input read error")
+ abort("input read error")
}
}
+ private def abort(msg: String) = throw new Error(msg)
override def flush() { writer.flush() }
}
diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala
index 0ea34235b2..edf2e49f5a 100644
--- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala
@@ -103,7 +103,7 @@ trait Definitions extends reflect.generic.StandardDefinitions {
// exceptions and other throwables
lazy val ThrowableClass = getClass(sn.Throwable)
lazy val NullPointerExceptionClass = getClass(sn.NPException)
- lazy val NonLocalReturnExceptionClass = getClass(sn.NLRException)
+ lazy val NonLocalReturnControlClass = getClass(sn.NLRControl)
lazy val IndexOutOfBoundsExceptionClass = getClass(sn.IOOBException)
lazy val UninitializedErrorClass = getClass("scala.UninitializedFieldError")
lazy val MatchErrorClass = getClass("scala.MatchError")
diff --git a/src/compiler/scala/tools/nsc/symtab/Scopes.scala b/src/compiler/scala/tools/nsc/symtab/Scopes.scala
index a66e5b6cc3..ca6c93bd1c 100644
--- a/src/compiler/scala/tools/nsc/symtab/Scopes.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Scopes.scala
@@ -326,7 +326,7 @@ trait Scopes {
*/
object EmptyScope extends Scope {
override def enter(e: ScopeEntry) {
- throw new Error("EmptyScope.enter")
+ abort("EmptyScope.enter")
}
}
diff --git a/src/compiler/scala/tools/nsc/symtab/StdNames.scala b/src/compiler/scala/tools/nsc/symtab/StdNames.scala
index 295dba2b46..98f87ca362 100644
--- a/src/compiler/scala/tools/nsc/symtab/StdNames.scala
+++ b/src/compiler/scala/tools/nsc/symtab/StdNames.scala
@@ -416,7 +416,7 @@ trait StdNames extends reflect.generic.StdNames { self: SymbolTable =>
val String : Name
val Throwable : Name
val NPException : Name // NullPointerException
- val NLRException : Name = newTermName("scala.runtime.NonLocalReturnException")
+ val NLRControl : Name = newTermName("scala.runtime.NonLocalReturnControl")
val ValueType : Name
val Serializable : Name
val BeanProperty : Name
diff --git a/src/compiler/scala/tools/nsc/symtab/SymbolTable.scala b/src/compiler/scala/tools/nsc/symtab/SymbolTable.scala
index 618c601b8f..75902568fa 100644
--- a/src/compiler/scala/tools/nsc/symtab/SymbolTable.scala
+++ b/src/compiler/scala/tools/nsc/symtab/SymbolTable.scala
@@ -31,6 +31,8 @@ abstract class SymbolTable extends reflect.generic.Universe
def settings: Settings
def rootLoader: LazyType
def log(msg: AnyRef)
+ def abort(msg: String) = throw new Error(msg)
+ def abort() = throw new Error()
/** Are we compiling for Java SE ? */
def forJVM: Boolean
diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
index 30f006201f..328b9c2311 100644
--- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
@@ -740,7 +740,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable =>
cnt += 1
// allow for two completions:
// one: sourceCompleter to LazyType, two: LazyType to completed type
- if (cnt == 3) throw new Error("no progress in completing " + this + ":" + tp)
+ if (cnt == 3) abort("no progress in completing " + this + ":" + tp)
}
val result = rawInfo
result
@@ -882,7 +882,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable =>
* Not applicable for term symbols.
*/
def typeConstructor: Type =
- throw new Error("typeConstructor inapplicable for " + this)
+ abort("typeConstructor inapplicable for " + this)
/** @M -- tpe vs tpeHK:
* Symbol::tpe creates a TypeRef that has dummy type arguments to get a type of kind *
@@ -963,7 +963,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable =>
else if (this.isTerm)
TypeBounds(NothingClass.tpe, intersectionType(List(this.tpe, SingletonClass.tpe)))
else
- throw new Error("unexpected alias type: "+this)
+ abort("unexpected alias type: "+this)
/** Reset symbol to initial state
*/
@@ -1421,7 +1421,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable =>
(if (isModule) moduleClass else toplevelClass).sourceFile
def sourceFile_=(f: AbstractFile) {
- throw new Error("sourceFile_= inapplicable for " + this)
+ abort("sourceFile_= inapplicable for " + this)
}
def isFromClassFile: Boolean =
@@ -2000,7 +2000,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable =>
override def enclClass: Symbol = this
override def toplevelClass: Symbol = this
override def enclMethod: Symbol = this
- override def owner: Symbol = throw new Error("no-symbol does not have owner")
+ override def owner: Symbol = abort("no-symbol does not have owner")
override def sourceFile: AbstractFile = null
override def ownerChain: List[Symbol] = List()
override def ownersIterator: Iterator[Symbol] = Iterator.empty
@@ -2010,7 +2010,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable =>
override def rawInfo: Type = NoType
protected def doCookJavaRawInfo() {}
override def accessBoundary(base: Symbol): Symbol = RootClass
- def cloneSymbolImpl(owner: Symbol): Symbol = throw new Error()
+ def cloneSymbolImpl(owner: Symbol): Symbol = abort()
}
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala
index 10bebc40f8..855e6951d0 100644
--- a/src/compiler/scala/tools/nsc/symtab/Types.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Types.scala
@@ -13,6 +13,7 @@ import ast.TreeGen
import util.{HashSet, Position, NoPosition}
import util.Statistics._
import Flags._
+import scala.util.control.ControlThrowable
/* A standard type pattern match:
case ErrorType =>
@@ -709,7 +710,7 @@ trait Types extends reflect.generic.Types { self: SymbolTable =>
if (sym == btssym) return mid
else if (sym isLess btssym) hi = mid - 1
else if (btssym isLess sym) lo = mid + 1
- else throw new Error()
+ else abort()
}
-1
}
@@ -2531,7 +2532,7 @@ A type's typeSymbol should never be inspected directly.
case tv@TypeVar(_, constr) => tv.applyArgs(args)
case ErrorType => tycon
case WildcardType => tycon // needed for neg/t0226
- case _ => throw new Error(debugString(tycon))
+ case _ => abort(debugString(tycon))
}
/** A creator for type parameterizations
@@ -3128,9 +3129,7 @@ A type's typeSymbol should never be inspected directly.
if ((pre eq NoType) || (pre eq NoPrefix) || !clazz.isClass) mapOver(tp)
//@M! see test pos/tcpoly_return_overriding.scala why mapOver is necessary
else {
- def throwError : Nothing = throw new Error(
- "" + tp + sym.locationString + " cannot be instantiated from " + pre.widen
- )
+ def throwError = abort("" + tp + sym.locationString + " cannot be instantiated from " + pre.widen)
def instParam(ps: List[Symbol], as: List[Type]): Type =
if (ps.isEmpty) throwError
@@ -3547,9 +3546,9 @@ A type's typeSymbol should never be inspected directly.
}
}
- class MissingAliasException extends Exception
- val missingAliasException = new MissingAliasException
- class MissingTypeException extends Exception
+ class MissingAliasControl extends ControlThrowable
+ val missingAliasException = new MissingAliasControl
+ class MissingTypeControl extends ControlThrowable
object adaptToNewRunMap extends TypeMap {
private def adaptToNewRun(pre: Type, sym: Symbol): Symbol = {
@@ -3561,7 +3560,7 @@ A type's typeSymbol should never be inspected directly.
var rebind0 = pre.findMember(sym.name, BRIDGE, 0, true)
if (rebind0 == NoSymbol) {
if (sym.isAliasType) throw missingAliasException
- throw new MissingTypeException // For build manager purposes
+ throw new MissingTypeControl // For build manager purposes
//assert(false, pre+"."+sym+" does no longer exist, phase = "+phase)
}
/** The two symbols have the same fully qualified name */
@@ -3606,9 +3605,9 @@ A type's typeSymbol should never be inspected directly.
if ((pre1 eq pre) && (sym1 eq sym) && (args1 eq args)/* && sym.isExternal*/) tp
else typeRef(pre1, sym1, args1)
} catch {
- case ex: MissingAliasException =>
+ case ex: MissingAliasControl =>
apply(tp.dealias)
- case _: MissingTypeException =>
+ case _: MissingTypeControl =>
NoType
}
}
@@ -4742,7 +4741,7 @@ A type's typeSymbol should never be inspected directly.
res
case TypeVar(_, constr) =>
if (constr.instValid) constr.inst
- else throw new Error("trying to do lub/glb of typevar "+tp)
+ else abort("trying to do lub/glb of typevar "+tp)
case t => t
}
val strippedTypes = ts mapConserve (stripType)
@@ -5119,15 +5118,15 @@ A type's typeSymbol should never be inspected directly.
// Errors and Diagnostics -----------------------------------------------------
- /** An exception signalling a type error */
- class TypeError(var pos: Position, val msg: String) extends java.lang.Error(msg) {
+ /** A throwable signalling a type error */
+ class TypeError(var pos: Position, val msg: String) extends Throwable(msg) with ControlThrowable {
def this(msg: String) = this(NoPosition, msg)
}
- class NoCommonType(tps: List[Type]) extends java.lang.Error(
- "lub/glb of incompatible types: " + tps.mkString("", " and ", ""))
+ class NoCommonType(tps: List[Type]) extends Throwable(
+ "lub/glb of incompatible types: " + tps.mkString("", " and ", "")) with ControlThrowable
- /** An exception signalling a malformed type */
+ /** A throwable signalling a malformed type */
class MalformedType(msg: String) extends TypeError(msg) {
def this(pre: Type, tp: String) = this("malformed type: " + pre + "#" + tp)
}
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
index 745761a065..edf81a97ad 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
@@ -95,7 +95,8 @@ abstract class ClassfileParser {
parseHeader
this.pool = new ConstantPool
parseClass()
- } catch {
+ }
+ catch {
case e: MissingRequirementError => handleMissing(e)
case e: RuntimeException => handleError(e)
}
diff --git a/src/compiler/scala/tools/nsc/symtab/clr/TypeParser.scala b/src/compiler/scala/tools/nsc/symtab/clr/TypeParser.scala
index a1a4545894..92ff741b20 100644
--- a/src/compiler/scala/tools/nsc/symtab/clr/TypeParser.scala
+++ b/src/compiler/scala/tools/nsc/symtab/clr/TypeParser.scala
@@ -42,7 +42,7 @@ abstract class TypeParser {
def parse(typ: MSILType, root: Symbol) {
- def handleError(e: Exception) = {
+ def handleError(e: Throwable) = {
if (settings.debug.value) e.printStackTrace() //debug
throw new IOException("type '" + typ.FullName + "' is broken\n(" + e.getMessage() + ")")
}
diff --git a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala
index 956db2767e..f55afdb2b0 100644
--- a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala
+++ b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala
@@ -243,7 +243,7 @@ abstract class AddInterfaces extends InfoTransform {
tree.symbol = implMethod
new ChangeOwnerAndReturnTraverser(ifaceMethod, implMethod)(tree)
case None =>
- throw new Error("implMethod missing for " + ifaceMethod)
+ abort("implMethod missing for " + ifaceMethod)
}
private def implMemberDef(tree: Tree): Tree =
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index 79bc6bbba5..f37b809744 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -10,6 +10,7 @@ package transform
import scala.tools.nsc.symtab.classfile.ClassfileConstants._
import scala.collection.mutable.{HashMap,ListBuffer}
import scala.collection.immutable.Set
+import scala.util.control.ControlThrowable
import symtab._
import Flags._
@@ -633,7 +634,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast.
Console.println("exception when typing " + tree)
Console.println(er.msg + " in file " + context.owner.sourceFile)
er.printStackTrace
- throw new Error
+ abort()
}
def adaptCase(cdef: CaseDef): CaseDef = {
val body1 = adaptToType(cdef.body, tree1.tpe)
@@ -1036,18 +1037,13 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast.
tpt.tpe = erasure(tree.symbol.tpe).resultType
result
case _ =>
- case class MyError(count : Int, ex : AssertionError) extends Error(ex.getMessage)
- try {
- super.transform(tree1) setType null
- } catch {
- case e @ MyError(n, ex) if n > 5 => throw e
- case MyError(n,ex) =>
+ case class LoopControl(count: Int, ex : AssertionError) extends Throwable(ex.getMessage) with ControlThrowable
+
+ try super.transform(tree1) setType null
+ catch {
+ case LoopControl(n, ex) if n <= 5 =>
Console.println(tree1)
- throw MyError(n + 1, ex)
-// case ex : AssertionError =>
-// Console.println(tree1)
-// throw MyError(0, ex)
-// case ex => throw ex
+ throw LoopControl(n + 1, ex)
}
}
}
diff --git a/src/compiler/scala/tools/nsc/transform/LiftCode.scala b/src/compiler/scala/tools/nsc/transform/LiftCode.scala
index 574ec23cdb..951fa53041 100644
--- a/src/compiler/scala/tools/nsc/transform/LiftCode.scala
+++ b/src/compiler/scala/tools/nsc/transform/LiftCode.scala
@@ -79,7 +79,7 @@ abstract class LiftCode extends Transform with Reifiers {
gen.mkAttributedRef(definitions.getModule(name))
else {
val name = className(c)
- if (name.length() == 0) throw new Error("don't know how to inject " + value)
+ if (name.length() == 0) abort("don't know how to inject " + value)
val injectedArgs = new ListBuffer[Tree]
for (i <- 0 until c.productArity)
injectedArgs += inject(c.productElement(i))
@@ -103,7 +103,7 @@ abstract class LiftCode extends Transform with Reifiers {
case null =>
gen.mkAttributedRef(definitions.getModule("scala.reflect.NoType"))
case _ =>
- throw new Error("don't know how to inject " + value)
+ abort("don't know how to inject " + value)
}
}
} // Injector
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
index c9c7548e6d..c22eae60c5 100644
--- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala
+++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
@@ -196,7 +196,7 @@ abstract class UnCurry extends InfoTransform with TypingTransformers {
/** The type of a non-local return expression with given argument type */
private def nonLocalReturnExceptionType(argtype: Type) =
- appliedType(NonLocalReturnExceptionClass.typeConstructor, List(argtype))
+ appliedType(NonLocalReturnControlClass.typeConstructor, List(argtype))
/** A hashmap from method symbols to non-local return keys */
private val nonLocalReturnKeys = new HashMap[Symbol, Symbol]
@@ -214,7 +214,7 @@ abstract class UnCurry extends InfoTransform with TypingTransformers {
/** Generate a non-local return throw with given return expression from given method.
* I.e. for the method's non-local return key, generate:
*
- * throw new NonLocalReturnException(key, expr)
+ * throw new NonLocalReturnControl(key, expr)
* todo: maybe clone a pre-existing exception instead?
* (but what to do about excaptions that miss their targets?)
*/
@@ -233,7 +233,7 @@ abstract class UnCurry extends InfoTransform with TypingTransformers {
* try {
* body
* } catch {
- * case ex: NonLocalReturnException[_] =>
+ * case ex: NonLocalReturnControl[_] =>
* if (ex.key().eq(key)) ex.value()
* else throw ex
* }
@@ -245,7 +245,7 @@ abstract class UnCurry extends InfoTransform with TypingTransformers {
val ex = meth.newValue(body.pos, nme.ex) setInfo extpe
val pat = Bind(ex,
Typed(Ident(nme.WILDCARD),
- AppliedTypeTree(Ident(NonLocalReturnExceptionClass),
+ AppliedTypeTree(Ident(NonLocalReturnControlClass),
List(Bind(nme.WILDCARD.toTypeName,
EmptyTree)))))
val rhs =
diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
index 7ca4dcf885..614879b137 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
@@ -263,7 +263,7 @@ trait Contexts { self: Analyzer =>
if (diagnostic.isEmpty) ""
else diagnostic.mkString("\n","\n", "")
- def error(pos: Position, err: Error) {
+ def error(pos: Position, err: Throwable) {
val msg = err.getMessage() + diagString
if (reportGeneralErrors)
unit.error(pos, if (checking) "**** ERROR DURING INTERNAL CHECKING ****\n" + msg else msg)
diff --git a/src/compiler/scala/tools/nsc/typechecker/DeVirtualize.scala b/src/compiler/scala/tools/nsc/typechecker/DeVirtualize.scala
index 8a5df0f610..71078ca564 100644
--- a/src/compiler/scala/tools/nsc/typechecker/DeVirtualize.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/DeVirtualize.scala
@@ -297,7 +297,7 @@ abstract class DeVirtualize extends InfoTransform with TypingTransformers {
private def copyType(tpe: Type): Type = tpe match {
case MethodType(formals, restpe) => MethodType(formals, copyType(restpe))
case PolyType(List(), restpe) => PolyType(List(), copyType(restpe))
- case PolyType(_, _) => throw new Error("bad case: "+tpe)
+ case PolyType(_, _) => abort("bad case: "+tpe)
case _ => owner.thisType.memberType(abstractType(clazz))
}
def getInfo = copyType(clazz.primaryConstructor.tpe)
diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
index 3738e9a5ec..e773dedba3 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
@@ -8,7 +8,7 @@ package scala.tools.nsc
package typechecker
import scala.collection.mutable.ListBuffer
-import scala.util.control.ControlException
+import scala.util.control.ControlThrowable
import symtab.Flags._
/** This trait ...
@@ -79,7 +79,7 @@ trait Infer {
// error when built with scalac
/*private*/
- class NoInstance(msg: String) extends RuntimeException(msg) with ControlException
+ class NoInstance(msg: String) extends Throwable(msg) with ControlThrowable
/*private*/
class DeferredNoInstance(getmsg: () => String) extends NoInstance("") {
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index f557cf7b10..a41dcc24f7 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -12,7 +12,7 @@ package scala.tools.nsc
package typechecker
import scala.collection.mutable.{HashMap, ListBuffer}
-import scala.util.control.ControlException
+import scala.util.control.ControlThrowable
import scala.tools.nsc.interactive.RangePositions
import scala.tools.nsc.util.{Set, SourceFile, BatchSourceFile}
import symtab.Flags._
@@ -4082,7 +4082,7 @@ trait Typers { self: Analyzer =>
assert(onlyPresentation) // should not happen in normal circumstances.
tree setType tree.symbol.tpe
case _ =>
- throw new Error("unexpected tree: " + tree.getClass + "\n" + tree)//debug
+ abort("unexpected tree: " + tree.getClass + "\n" + tree)//debug
}
}
@@ -4133,7 +4133,6 @@ trait Typers { self: Analyzer =>
if (phase.id <= currentRun.typerPhase.id) signalDone(context.asInstanceOf[analyzer.Context], tree, result)
result
} catch {
- case ex: ControlException => throw ex
case ex: TypeError =>
tree.tpe = null
if (printTypings) println("caught "+ex+" in typed: "+tree);//DEBUG
@@ -4145,13 +4144,9 @@ trait Typers { self: Analyzer =>
if ((context ne null) && (context.unit ne null) &&
(context.unit.source ne null) && (tree ne null))
logError("AT: " + (tree.pos).dbgString, ex);
- throw(ex)
-/*
- case ex: java.lang.Error =>
- Console.println("exception when typing "+tree+", pt = "+pt)
throw ex
-*/ //debug
- } finally {
+ }
+ finally {
if (Statistics.enabled) {
val t = currentTime()
microsByType(pendingTreeTypes.head) += ((t - typerTime) / 1000).toInt
diff --git a/src/compiler/scala/tools/nsc/util/CommandLineParser.scala b/src/compiler/scala/tools/nsc/util/CommandLineParser.scala
index c3c99b1e1f..680c2130d7 100644
--- a/src/compiler/scala/tools/nsc/util/CommandLineParser.scala
+++ b/src/compiler/scala/tools/nsc/util/CommandLineParser.scala
@@ -100,9 +100,9 @@ object CommandLineParser extends RegexParsers with ParserUtil {
lazy val argument: Parser[String] = squoted | dquoted | token
lazy val commandLine: Parser[List[String]] = phrase(repsep(argument, whiteSpace))
- class ParseError(msg: String) extends RuntimeException(msg)
+ class ParseException(msg: String) extends RuntimeException(msg)
- def tokenize(line: String): List[String] = tokenize(line, x => throw new ParseError(x))
+ def tokenize(line: String): List[String] = tokenize(line, x => throw new ParseException(x))
def tokenize(line: String, errorFn: String => Unit): List[String] = {
parse(commandLine, line.trim) match {
case Success(args, _) => args
diff --git a/src/compiler/scala/tools/nsc/util/WorkScheduler.scala b/src/compiler/scala/tools/nsc/util/WorkScheduler.scala
index b4ecbf8a71..e309b19b76 100644
--- a/src/compiler/scala/tools/nsc/util/WorkScheduler.scala
+++ b/src/compiler/scala/tools/nsc/util/WorkScheduler.scala
@@ -8,7 +8,7 @@ class WorkScheduler {
type Action = () => Unit
private var todo = new Queue[Action]
- private var except = new Queue[Exception]
+ private var throwables = new Queue[Throwable]
/** Called from server: block until todo list is nonempty */
def waitForMoreWork() = synchronized {
@@ -30,12 +30,12 @@ class WorkScheduler {
/** Called from server: return optional exception posted by client
* Reset to no exception.
*/
- def pollException(): Option[Exception] = synchronized {
- if (except.isEmpty)
+ def pollThrowable(): Option[Throwable] = synchronized {
+ if (throwables.isEmpty)
None
else {
- val result = Some(except.dequeue())
- if (!except.isEmpty)
+ val result = Some(throwables.dequeue())
+ if (!throwables.isEmpty)
postWorkItem { () => }
result
}
@@ -55,8 +55,8 @@ class WorkScheduler {
/** Called from client:
* Require an exception to be thrown on next poll.
*/
- def raise(exc: Exception) = synchronized {
- except enqueue exc
+ def raise(exc: Throwable) = synchronized {
+ throwables enqueue exc
postWorkItem { () => }
}
}
diff --git a/src/intellij/scala-lang.ipr b/src/intellij/scala-lang.ipr
index 8a801be5db..45af31680c 100644
--- a/src/intellij/scala-lang.ipr
+++ b/src/intellij/scala-lang.ipr
@@ -999,7 +999,7 @@
<file url="file://$PROJECT_DIR$/../dotnet-library/scala/reflect/Manifest.scala" />
<file url="file://$PROJECT_DIR$/../dotnet-library/scala/reflect/ScalaBeanInfo.scala" />
<file url="file://$PROJECT_DIR$/../dotnet-library/scala/runtime/MethodCache.scala" />
- <file url="file://$PROJECT_DIR$/../dotnet-library/scala/runtime/NonLocalReturnException.scala" />
+ <file url="file://$PROJECT_DIR$/../dotnet-library/scala/runtime/NonLocalReturnControl.scala" />
<file url="file://$PROJECT_DIR$/../dotnet-library/scala/runtime/RichChar.scala" />
<file url="file://$PROJECT_DIR$/../dotnet-library/scala/runtime/RichClass.scala" />
<file url="file://$PROJECT_DIR$/../dotnet-library/scala/runtime/RichDouble.scala" />
diff --git a/src/library/scala/NotDefinedError.scala b/src/library/scala/NotDefinedError.scala
index c1939a4e9a..a47613fb9a 100644
--- a/src/library/scala/NotDefinedError.scala
+++ b/src/library/scala/NotDefinedError.scala
@@ -14,4 +14,5 @@ package scala
/**
* @since 2.0
*/
+@deprecated("Use a custom Error class instead")
final class NotDefinedError(msg: String) extends Error("not defined: " + msg)
diff --git a/src/library/scala/runtime/NonLocalReturnControl.scala b/src/library/scala/runtime/NonLocalReturnControl.scala
new file mode 100644
index 0000000000..5591d4871b
--- /dev/null
+++ b/src/library/scala/runtime/NonLocalReturnControl.scala
@@ -0,0 +1,16 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+// $Id$
+
+
+package scala.runtime
+
+import scala.util.control.ControlThrowable
+
+class NonLocalReturnControl[T](val key: AnyRef, val value: T) extends ControlThrowable
diff --git a/src/library/scala/runtime/NonLocalReturnException.scala b/src/library/scala/runtime/NonLocalReturnException.scala
index 4bd8ceb058..19a216be7c 100644
--- a/src/library/scala/runtime/NonLocalReturnException.scala
+++ b/src/library/scala/runtime/NonLocalReturnException.scala
@@ -11,6 +11,9 @@
package scala.runtime
-import scala.util.control.ControlException
+import scala.util.control.ControlThrowable
-class NonLocalReturnException[T](val key: AnyRef, val value: T) extends RuntimeException with ControlException
+/** !!! This class has been replaced by NonLocalReturnControl and should be deleted.
+ * But, it can't be deleted until starr is updated to use the new name.
+ */
+class NonLocalReturnException[T](val key: AnyRef, val value: T) extends ControlThrowable
diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala
index a65ec05401..82573bf4b1 100644
--- a/src/library/scala/runtime/ScalaRunTime.scala
+++ b/src/library/scala/runtime/ScalaRunTime.scala
@@ -16,7 +16,7 @@ import scala.collection.{ Seq, IndexedSeq }
import scala.collection.mutable.WrappedArray
import scala.collection.immutable.{ List, Stream, Nil, :: }
import scala.xml.{ Node, MetaData }
-import scala.util.control.ControlException
+import scala.util.control.ControlThrowable
/* The object <code>ScalaRunTime</code> provides ...
*/
@@ -124,7 +124,7 @@ object ScalaRunTime {
private var exception: Throwable =
try { run() ; null }
catch {
- case e: ControlException => throw e // don't catch non-local returns etc
+ case e: ControlThrowable => throw e // don't catch non-local returns etc
case e: Throwable => e
}
diff --git a/src/library/scala/util/control/Breaks.scala b/src/library/scala/util/control/Breaks.scala
index 7ae4cba63a..1f06f04418 100644
--- a/src/library/scala/util/control/Breaks.scala
+++ b/src/library/scala/util/control/Breaks.scala
@@ -28,14 +28,14 @@ package scala.util.control
*/
class Breaks {
- private val breakException = new BreakException
+ private val breakException = new BreakControl
/** A block from which one can exit with a `break''. */
def breakable(op: => Unit) {
try {
op
} catch {
- case ex: BreakException =>
+ case ex: BreakControl =>
if (ex ne breakException) throw ex
}
}
@@ -61,5 +61,5 @@ class Breaks {
*/
object Breaks extends Breaks
-private class BreakException extends RuntimeException with ControlException
+private class BreakControl extends ControlThrowable
diff --git a/src/library/scala/util/control/ControlException.scala b/src/library/scala/util/control/ControlThrowable.scala
index 73f2b31e89..090bec4e98 100644
--- a/src/library/scala/util/control/ControlException.scala
+++ b/src/library/scala/util/control/ControlThrowable.scala
@@ -21,19 +21,19 @@ package scala.util.control
*
* <p>Instances of <code>Throwable</code> subclasses marked in
* this way should not normally be caught. Where catch-all behaviour is
- * required <code>ControlException</code>s should be propagated, for
+ * required <code>ControlThrowable</code>s should be propagated, for
* example,</p>
*
* <pre>
- * import scala.util.control.ControlException
+ * import scala.util.control.ControlThrowable
*
* try {
* // Body might throw arbitrarily
* } catch {
- * case ce : ControlException => throw ce // propagate
+ * case ce : ControlThrowable => throw ce // propagate
* case t : Exception => log(t) // log and suppress
* </pre>
*
* @author Miles Sabin
*/
-trait ControlException extends Throwable with NoStackTrace
+trait ControlThrowable extends Throwable with NoStackTrace
diff --git a/src/library/scala/xml/parsing/FatalError.scala b/src/library/scala/xml/parsing/FatalError.scala
index 01b68f6591..73634298fa 100644
--- a/src/library/scala/xml/parsing/FatalError.scala
+++ b/src/library/scala/xml/parsing/FatalError.scala
@@ -10,7 +10,8 @@
package scala.xml
-package parsing;
+package parsing
-
-case class FatalError(msg:String) extends java.lang.RuntimeException(msg);
+/** !!! This is poorly named, but I guess it's in the API.
+ */
+case class FatalError(msg: String) extends java.lang.RuntimeException(msg)
diff --git a/src/library/scala/xml/parsing/MarkupParserCommon.scala b/src/library/scala/xml/parsing/MarkupParserCommon.scala
index ba1402d55f..936515852b 100644
--- a/src/library/scala/xml/parsing/MarkupParserCommon.scala
+++ b/src/library/scala/xml/parsing/MarkupParserCommon.scala
@@ -241,7 +241,7 @@ private[scala] trait MarkupParserCommon extends TokenTests {
if (ch == head && peek(rest))
return handler(positioner(), sb.toString)
else if (ch == SU)
- truncatedError("") // throws TruncatedXML in compiler
+ truncatedError("") // throws TruncatedXMLControl in compiler
sb append ch
nextch