aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Phases.scala
diff options
context:
space:
mode:
authorDmitry Petrashko <dark@d-d.me>2014-04-02 17:43:34 +0200
committerDmitry Petrashko <dark@d-d.me>2014-04-02 17:43:34 +0200
commitc8feb0ccb543b01ac27da788050b12c0a0221e36 (patch)
tree859c35428cb54ac914f1517d5e1ac3515aa03c80 /src/dotty/tools/dotc/core/Phases.scala
parente52fa5086c413e6fceb10d8650fc7becdc5c04a9 (diff)
parentf651ca5ed1caf70aabe0d803949f430d08bf3915 (diff)
downloaddotty-c8feb0ccb543b01ac27da788050b12c0a0221e36.tar.gz
dotty-c8feb0ccb543b01ac27da788050b12c0a0221e36.tar.bz2
dotty-c8feb0ccb543b01ac27da788050b12c0a0221e36.zip
Merge pull request #105 from DarkDimius/docs
Documentation and a bit of cleanup.
Diffstat (limited to 'src/dotty/tools/dotc/core/Phases.scala')
-rw-r--r--src/dotty/tools/dotc/core/Phases.scala58
1 files changed, 33 insertions, 25 deletions
diff --git a/src/dotty/tools/dotc/core/Phases.scala b/src/dotty/tools/dotc/core/Phases.scala
index 8b5606da2..eb3b1d7fc 100644
--- a/src/dotty/tools/dotc/core/Phases.scala
+++ b/src/dotty/tools/dotc/core/Phases.scala
@@ -67,6 +67,38 @@ object Phases {
override def lastPhaseId(implicit ctx: Context) = id
}
+ /** Squash TreeTransform's beloning to same sublist to a single TreeTransformer
+ * Each TreeTransform gets own period,
+ * whereas a combined TreeTransformer gets period equal to union of periods of it's TreeTransforms
+ * first TreeTransformer emitted is PostTyperTransformer that simplifies trees, see it's documentation
+ */
+ private def squashPhases(phasess: List[List[Phase]]): Array[Phase] = {
+ val squashedPhases = ListBuffer[Phase]()
+ var postTyperEmmited = false
+ var i = 0
+ while (i < phasess.length) {
+ if (phasess(i).length > 1) {
+ assert(phasess(i).forall(x => x.isInstanceOf[TreeTransform]), "Only tree transforms can be squashed")
+
+ val transforms = phasess(i).asInstanceOf[List[TreeTransform]]
+ val block =
+ if (!postTyperEmmited) {
+ postTyperEmmited = true
+ new PostTyperTransformer {
+ override def name: String = transformations.map(_.name).mkString("TreeTransform:{", ", ", "}")
+ override def transformations: Array[TreeTransform] = transforms.toArray
+ }
+ } else new TreeTransformer {
+ override def name: String = transformations.map(_.name).mkString("TreeTransform:{", ", ", "}")
+ override def transformations: Array[TreeTransform] = transforms.toArray
+ }
+ squashedPhases += block
+ block.init(this, phasess(i).head.id, phasess(i).last.id)
+ } else squashedPhases += phasess(i).head
+ i += 1
+ }
+ (NoPhase :: squashedPhases.toList ::: new TerminalPhase :: Nil).toArray
+ }
/** Use the following phases in the order they are given.
* The list should never contain NoPhase.
@@ -94,31 +126,7 @@ object Phases {
}
if (squash) {
- val squashedPhases = ListBuffer[Phase]()
- var postTyperEmmited = false
- var i = 0
- while (i < phasess.length) {
- if (phasess(i).length > 1) {
- assert(phasess(i).forall(x => x.isInstanceOf[TreeTransform]), "Only tree transforms can be squashed")
-
- val transforms = phasess(i).asInstanceOf[List[TreeTransform]]
- val block =
- if (!postTyperEmmited) {
- postTyperEmmited = true
- new PostTyperTransformer {
- override def name: String = transformations.map(_.name).mkString("TreeTransform:{", ", ", "}")
- override def transformations: Array[TreeTransform] = transforms.toArray
- }
- } else new TreeTransformer {
- override def name: String = transformations.map(_.name).mkString("TreeTransform:{", ", ", "}")
- override def transformations: Array[TreeTransform] = transforms.toArray
- }
- squashedPhases += block
- block.init(this, phasess(i).head.id, phasess(i).last.id)
- } else squashedPhases += phasess(i).head
- i += 1
- }
- this.squashedPhases = (NoPhase::squashedPhases.toList :::new TerminalPhase :: Nil).toArray
+ this.squashedPhases = squashPhases(phasess)
} else {
this.squashedPhases = this.phases
}