diff options
author | Martin Odersky <odersky@gmail.com> | 2013-01-17 09:50:55 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-01-17 09:51:08 +0100 |
commit | dc2d3c7a138a30e74836928e0ad8872cdf8a00ab (patch) | |
tree | 23d98a3f2480587519ef25fe03b0395dfe83c703 /src/dotty/tools/dotc/core/Transformers.scala | |
parent | 103a34e256c21d84b3e6b772de999ab804aeb1f3 (diff) | |
download | dotty-dc2d3c7a138a30e74836928e0ad8872cdf8a00ab.tar.gz dotty-dc2d3c7a138a30e74836928e0ad8872cdf8a00ab.tar.bz2 dotty-dc2d3c7a138a30e74836928e0ad8872cdf8a00ab.zip |
Fleshed out transformer architecture.
Diffstat (limited to 'src/dotty/tools/dotc/core/Transformers.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/Transformers.scala | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/core/Transformers.scala b/src/dotty/tools/dotc/core/Transformers.scala new file mode 100644 index 000000000..2bc475104 --- /dev/null +++ b/src/dotty/tools/dotc/core/Transformers.scala @@ -0,0 +1,51 @@ +package dotty.tools.dotc +package core + +import Periods._, Denotations._, Contexts._, Types._, References._ +import java.lang.AssertionError + +trait Transformers { self: RootContext => + + import Transformers._ + + def transformersFor(ref: SymRef): TransformerGroup = ref match { + case _: Denotation => denotTransformers + case _ => refTransformers + } + + val denotTransformers = new TransformerGroup + val refTransformers = new TransformerGroup +} + +object Transformers { + + val lastPhaseId = 31 + + class TransformerGroup { + + abstract class Transformer extends DotClass { + val phaseId: Int + def lastPhaseId = nextTransformer(phaseId).phaseId - 1 + def validFor(implicit ctx: Context): Period = + Period(ctx.runId, phaseId, lastPhaseId) + def transform(ref: SymRef)(implicit ctx: Context): SymRef + } + + object NoTransformer extends Transformer { + val phaseId = lastPhaseId + 1 + def transform(ref: SymRef)(implicit ctx: Context): SymRef = + unsupported("transform") + } + + private val nxTransformer = + Array.fill[Transformer](lastPhaseId + 1)(NoTransformer) + + def nextTransformer(i: Int) = nxTransformer(i) + + def install(pid: PhaseId, trans: Transformer): Unit = + if ((pid > NoPhaseId) && (nxTransformer(pid).phaseId > pid)) { + nxTransformer(pid) = trans + install(pid - 1, trans) + } + } +}
\ No newline at end of file |