blob: 1244ddfac582edf456f68f209c537d4ce3abdc7d (
plain) (
tree)
|
|
package dotty.tools.dotc
package core
import Periods._, SymDenotations._, Contexts._, Types._, Denotations._
import java.lang.AssertionError
trait Transformers
object Transformers {
trait TransformerBase { self: ContextBase =>
def transformersFor(ref: SingleDenotation): TransformerGroup = ref match {
case _: SymDenotation => denotTransformers
case _ => refTransformers
}
val denotTransformers = new TransformerGroup
val refTransformers = new TransformerGroup
}
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: SingleDenotation)(implicit ctx: Context): SingleDenotation
}
object NoTransformer extends Transformer {
val phaseId = Transformers.lastPhaseId + 1
override def lastPhaseId = phaseId - 1 // TODO JZ Probably off-by-N error here.
def transform(ref: SingleDenotation)(implicit ctx: Context): SingleDenotation =
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)
}
}
}
|