summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-05-16 21:09:48 +0000
committerPaul Phillips <paulp@improving.org>2011-05-16 21:09:48 +0000
commit1e5194b41cdc5563237381b80a9f948abbf96e6e (patch)
treec79e1e712b8085e3d255e6185466b998fd471eaf /src
parent6d2b5e14f8b4cc25fca8067fd09106f1474966f4 (diff)
downloadscala-1e5194b41cdc5563237381b80a9f948abbf96e6e.tar.gz
scala-1e5194b41cdc5563237381b80a9f948abbf96e6e.tar.bz2
scala-1e5194b41cdc5563237381b80a9f948abbf96e6e.zip
Phase and Error handling code, no review.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/reflect/common/FatalError.scala6
-rw-r--r--src/compiler/scala/reflect/common/MissingRequirementError.scala18
-rw-r--r--src/compiler/scala/reflect/common/Phase.scala53
-rw-r--r--src/compiler/scala/tools/nsc/Phases.scala44
-rw-r--r--src/compiler/scala/tools/nsc/package.scala11
-rw-r--r--src/compiler/scala/tools/nsc/symtab/package.scala7
6 files changed, 138 insertions, 1 deletions
diff --git a/src/compiler/scala/reflect/common/FatalError.scala b/src/compiler/scala/reflect/common/FatalError.scala
new file mode 100644
index 0000000000..0d4cd6e338
--- /dev/null
+++ b/src/compiler/scala/reflect/common/FatalError.scala
@@ -0,0 +1,6 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2011 LAMP/EPFL
+ * @author Martin Odersky
+ */
+package scala.reflect.common
+case class FatalError(msg: String) extends Throwable(msg)
diff --git a/src/compiler/scala/reflect/common/MissingRequirementError.scala b/src/compiler/scala/reflect/common/MissingRequirementError.scala
new file mode 100644
index 0000000000..a580cfc2dc
--- /dev/null
+++ b/src/compiler/scala/reflect/common/MissingRequirementError.scala
@@ -0,0 +1,18 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2011 LAMP/EPFL
+ * @author Martin Odersky
+ */
+
+package scala.reflect
+package common
+
+class MissingRequirementError(val req: String) extends FatalError(req + " not found.")
+
+object MissingRequirementError {
+ def unapply(x: Throwable) = x match {
+ case x: MissingRequirementError => Some(x.req)
+ case _ => None
+ }
+}
+
+
diff --git a/src/compiler/scala/reflect/common/Phase.scala b/src/compiler/scala/reflect/common/Phase.scala
new file mode 100644
index 0000000000..e351b3f676
--- /dev/null
+++ b/src/compiler/scala/reflect/common/Phase.scala
@@ -0,0 +1,53 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2011 LAMP/EPFL
+ * @author Martin Odersky
+ */
+
+package scala.reflect
+package common
+
+abstract class Phase(val prev: Phase) {
+
+ type Id = Int
+
+ val id: Id = if (prev eq null) 0 else prev.id + 1
+
+ /** New flags visible after this phase has completed */
+ def nextFlags: Long = 0l
+
+ /** New flags visible once this phase has started */
+ def newFlags: Long = 0l
+
+ private var fmask: Long =
+ if (prev eq null) Flags.InitialFlags else prev.flagMask | prev.nextFlags | newFlags
+ def flagMask: Long = fmask
+
+ private var nx: Phase = this
+ if ((prev ne null) && (prev ne NoPhase)) prev.nx = this
+
+ def next: Phase = nx
+
+ def name: String
+ def description: String = name
+ // Will running with -Ycheck:name work?
+ def checkable: Boolean = true
+ // def devirtualized: Boolean = false
+ def specialized: Boolean = false
+ def erasedTypes: Boolean = false
+ def flatClasses: Boolean = false
+ def refChecked: Boolean = false
+ def keepsTypeParams = true
+ def run(): Unit
+
+ override def toString() = name
+ override def hashCode = id.## + name.##
+ override def equals(other: Any) = other match {
+ case x: Phase => id == x.id && name == x.name
+ case _ => false
+ }
+}
+
+object NoPhase extends Phase(null) {
+ def name = "<no phase>"
+ def run() { throw new Error("NoPhase.run") }
+}
diff --git a/src/compiler/scala/tools/nsc/Phases.scala b/src/compiler/scala/tools/nsc/Phases.scala
new file mode 100644
index 0000000000..d18495458c
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/Phases.scala
@@ -0,0 +1,44 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2011 LAMP/EPFL
+ * @author Martin Odersky
+ */
+
+package scala.tools.nsc
+
+import symtab.Flags
+import util.TableDef
+
+object Phases {
+ val MaxPhases = 64
+
+ /** A class for tracking something about each phase.
+ */
+ class Model[T: Manifest] {
+ case class Cell(ph: Phase, value: T) {
+ def name = ph.name
+ def id = ph.id
+ }
+ val values = new Array[Cell](MaxPhases + 1)
+ def results = values filterNot (_ == null)
+ def apply(ph: Phase): T = values(ph.id).value
+ def update(ph: Phase, value: T): Unit = values(ph.id) = Cell(ph, value)
+ }
+ /** A class for recording the elapsed time of each phase in the
+ * interests of generating a classy and informative table.
+ */
+ class TimingModel extends Model[Long] {
+ var total: Long = 0
+ def table() = {
+ total = results map (_.value) sum;
+ new Format.Table(results sortBy (-_.value))
+ }
+ object Format extends TableDef[Cell] {
+ >> ("phase" -> (_.name)) >+ " "
+ << ("id" -> (_.id)) >+ " "
+ >> ("ms" -> (_.value)) >+ " "
+ << ("share" -> (_.value.toDouble * 100 / total formatted "%.2f"))
+ }
+ def formatted = "" + table()
+ }
+}
+
diff --git a/src/compiler/scala/tools/nsc/package.scala b/src/compiler/scala/tools/nsc/package.scala
index 9b9cfe7280..11d9f6723f 100644
--- a/src/compiler/scala/tools/nsc/package.scala
+++ b/src/compiler/scala/tools/nsc/package.scala
@@ -10,4 +10,13 @@ package object nsc {
type InterpreterSettings = interpreter.ISettings
@deprecated("Use a class in the scala.tools.nsc.interpreter package.", "2.9.0")
val InterpreterResults = interpreter.Results
-} \ No newline at end of file
+
+ type Phase = scala.reflect.common.Phase
+ val NoPhase = scala.reflect.common.NoPhase
+
+ type FatalError = scala.reflect.common.FatalError
+ val FatalError = scala.reflect.common.FatalError
+
+ type MissingRequirementError = scala.reflect.common.MissingRequirementError
+ val MissingRequirementError = scala.reflect.common.MissingRequirementError
+}
diff --git a/src/compiler/scala/tools/nsc/symtab/package.scala b/src/compiler/scala/tools/nsc/symtab/package.scala
new file mode 100644
index 0000000000..30de9c75bf
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/symtab/package.scala
@@ -0,0 +1,7 @@
+package scala.tools.nsc
+
+package object symtab {
+
+ val Flags = reflect.common.Flags
+
+}