diff options
author | Martin Odersky <odersky@gmail.com> | 2014-03-14 18:44:03 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2014-03-18 16:06:33 +0100 |
commit | 164ecb70593728ce218e04f4e316a32ae346e4b7 (patch) | |
tree | 684f352e6360cd92464e5b8d40e8480671cdc878 /src/dotty/tools/dotc/core/Transformers.scala | |
parent | a30efa6426474e7cb097be1bb4e05933c213fe90 (diff) | |
download | dotty-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.scala | 63 |
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 } } |