aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Phases.scala
diff options
context:
space:
mode:
authorDmitry Petrashko <dmitry.petrashko@gmail.com>2014-03-31 21:29:28 +0200
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2014-04-01 14:24:05 +0200
commitf651ca5ed1caf70aabe0d803949f430d08bf3915 (patch)
treeeb98347f653f47d6bb8e6e67f10af54410c65c24 /src/dotty/tools/dotc/core/Phases.scala
parent2033b5607a41b77590b8d23bf5c40c906a0b42e7 (diff)
downloaddotty-f651ca5ed1caf70aabe0d803949f430d08bf3915.tar.gz
dotty-f651ca5ed1caf70aabe0d803949f430d08bf3915.tar.bz2
dotty-f651ca5ed1caf70aabe0d803949f430d08bf3915.zip
Documentation and a bit of cleanup.
Added documentation for non-trivial logic in Contexts, Phases and TreeTransforms. Removed redundant vars and casts
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
}