aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Transformers.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-01-17 09:50:55 +0100
committerMartin Odersky <odersky@gmail.com>2013-01-17 09:51:08 +0100
commitdc2d3c7a138a30e74836928e0ad8872cdf8a00ab (patch)
tree23d98a3f2480587519ef25fe03b0395dfe83c703 /src/dotty/tools/dotc/core/Transformers.scala
parent103a34e256c21d84b3e6b772de999ab804aeb1f3 (diff)
downloaddotty-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.scala51
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