aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Transformers.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-03-14 18:44:03 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2014-03-18 16:06:33 +0100
commit164ecb70593728ce218e04f4e316a32ae346e4b7 (patch)
tree684f352e6360cd92464e5b8d40e8480671cdc878 /src/dotty/tools/dotc/core/Transformers.scala
parenta30efa6426474e7cb097be1bb4e05933c213fe90 (diff)
downloaddotty-164ecb70593728ce218e04f4e316a32ae346e4b7.tar.gz
dotty-164ecb70593728ce218e04f4e316a32ae346e4b7.tar.bz2
dotty-164ecb70593728ce218e04f4e316a32ae346e4b7.zip
Reorg of info transformer framework
Diffstat (limited to 'src/dotty/tools/dotc/core/Transformers.scala')
-rw-r--r--src/dotty/tools/dotc/core/Transformers.scala63
1 files changed, 29 insertions, 34 deletions
diff --git a/src/dotty/tools/dotc/core/Transformers.scala b/src/dotty/tools/dotc/core/Transformers.scala
index 90df3a274..9b8bb65a4 100644
--- a/src/dotty/tools/dotc/core/Transformers.scala
+++ b/src/dotty/tools/dotc/core/Transformers.scala
@@ -9,19 +9,10 @@ import Denotations._
import java.lang.AssertionError
import dotty.tools.dotc.util.DotClass
-trait Transformers
-
object Transformers {
trait TransformerBase { self: ContextBase =>
-
- def transformersFor(ref: SingleDenotation): TransformerGroup = ref match {
- case _: SymDenotation => symTransformers
- case _ => refTransformers
- }
-
- val symTransformers = new TransformerGroup
- val refTransformers = new TransformerGroup
+ val infoTransformers = new TransformerGroup
}
/** A transformer group contains a sequence of transformers,
@@ -35,40 +26,44 @@ object Transformers {
*/
class TransformerGroup {
- /** A transformer transforms denotations at a given phase */
- abstract class Transformer extends DotClass {
-
- /** The phase at the start of which the denotations are transformed */
- val phaseId: Int
-
- /** The last phase during which the transformed denotations are valid */
- def lastPhaseId = nextTransformer(phaseId).phaseId - 1
+ private val nxTransformer =
+ Array.fill[Transformer](MaxPossiblePhaseId + 1)(NoTransformer)
- /** The validity period of the transformer in the given context */
- def validFor(implicit ctx: Context): Period =
- Period(ctx.runId, phaseId, lastPhaseId)
+ def nextTransformer(pid: PhaseId) = nxTransformer(pid)
- /** The transformation method */
- def transform(ref: SingleDenotation)(implicit ctx: Context): SingleDenotation
- }
+ def install(pid: PhaseId, transFn: TransformerGroup => Transformer): Unit =
+ if ((pid > NoPhaseId) && (nxTransformer(pid).phaseId > pid)) {
+ val trans = transFn(this)
+ trans._phaseId = pid
+ nxTransformer(pid) = transFn(this)
+ install(pid - 1, transFn)
+ }
/** A sentinel transformer object */
- object NoTransformer extends Transformer {
- val phaseId = MaxPossiblePhaseId + 1
+ object NoTransformer extends Transformer(this) {
+ _phaseId = MaxPossiblePhaseId + 1
override def lastPhaseId = phaseId - 1 // TODO JZ Probably off-by-N error here. MO: Don't think so: we want empty validity period.
def transform(ref: SingleDenotation)(implicit ctx: Context): SingleDenotation =
unsupported("transform")
}
+ }
- private val nxTransformer =
- Array.fill[Transformer](MaxPossiblePhaseId + 1)(NoTransformer)
+ /** A transformer transforms denotations at a given phase */
+ abstract class Transformer(group: TransformerGroup) extends DotClass {
- def nextTransformer(pid: PhaseId) = nxTransformer(pid)
+ private[Transformers] var _phaseId: PhaseId = _
- def install(pid: PhaseId, trans: Transformer): Unit =
- if ((pid > NoPhaseId) && (nxTransformer(pid).phaseId > pid)) {
- nxTransformer(pid) = trans
- install(pid - 1, trans)
- }
+ /** The phase at the start of which the denotations are transformed */
+ def phaseId: PhaseId = _phaseId
+
+ /** The last phase during which the transformed denotations are valid */
+ def lastPhaseId = group.nextTransformer(phaseId).phaseId - 1
+
+ /** The validity period of the transformer in the given context */
+ def validFor(implicit ctx: Context): Period =
+ Period(ctx.runId, phaseId, lastPhaseId)
+
+ /** The transformation method */
+ def transform(ref: SingleDenotation)(implicit ctx: Context): SingleDenotation
}
}