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 | |
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')
-rw-r--r-- | src/dotty/tools/dotc/core/Denotations.scala | 6 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Periods.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Transformers.scala | 63 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/SamplePhase.scala | 36 |
4 files changed, 70 insertions, 37 deletions
diff --git a/src/dotty/tools/dotc/core/Denotations.scala b/src/dotty/tools/dotc/core/Denotations.scala index b185d15bf..fce5b1a16 100644 --- a/src/dotty/tools/dotc/core/Denotations.scala +++ b/src/dotty/tools/dotc/core/Denotations.scala @@ -192,6 +192,9 @@ object Denotations { def requiredValue(name: PreName)(implicit ctx: Context): TermSymbol = info.member(name.toTermName).requiredSymbol(_.info.isParameterless).asTerm + def requiredClass(name: PreName)(implicit ctx: Context): ClassSymbol = + info.member(name.toTypeName).requiredSymbol(_.isClass).asClass + /** The denotation that has a type matching `targetType` when seen * as a member of type `site`, `NoDenotation` if none exists. */ @@ -515,8 +518,7 @@ object Denotations { } else { // not found, cur points to highest existing variant var startPid = cur.validFor.lastPhaseId + 1 - val transformers = ctx.transformersFor(cur) - val transformer = transformers.nextTransformer(startPid) + val transformer = ctx.infoTransformers.nextTransformer(startPid) next = transformer.transform(cur).syncWithParents if (next eq cur) startPid = cur.validFor.firstPhaseId diff --git a/src/dotty/tools/dotc/core/Periods.scala b/src/dotty/tools/dotc/core/Periods.scala index 04eef6aaf..31fde2dac 100644 --- a/src/dotty/tools/dotc/core/Periods.scala +++ b/src/dotty/tools/dotc/core/Periods.scala @@ -34,7 +34,7 @@ abstract class Periods extends DotClass { self: Context => */ def stablePeriod = { var first = phaseId - val transformers = base.symTransformers + val transformers = base.infoTransformers val nxTrans = transformers.nextTransformer(first) while (first - 1 > NoPhaseId && (transformers.nextTransformer(first - 1) eq nxTrans)) { 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 } } diff --git a/src/dotty/tools/dotc/transform/SamplePhase.scala b/src/dotty/tools/dotc/transform/SamplePhase.scala new file mode 100644 index 000000000..5a6578bea --- /dev/null +++ b/src/dotty/tools/dotc/transform/SamplePhase.scala @@ -0,0 +1,36 @@ +package dotty.tools.dotc +package transform + +import TreeTransforms._ +import core.Denotations._ +import core.Contexts._ +import ast.Trees._ +import ast.tpd.{Apply, Tree, cpy} +import core.Transformers._ + +class SamplePhase extends TreeTransformer { + + def init(implicit ctx: Context) = { + ctx.base.infoTransformers.install(id, new UncurryInfoTransform(_)) + } + + def name = "sample" + + def transformations = Array(new UncurryTreeTransform(_, _)) + +} + +class UncurryInfoTransform(group: TransformerGroup) extends Transformer(group) { + + def transform(ref: SingleDenotation)(implicit ctx: Context): SingleDenotation = ??? + +} + +class UncurryTreeTransform(group: TreeTransformer, idx: Int) extends TreeTransform(group, idx) { + + override def transformApply(tree: Apply)(implicit ctx: Context, info: TransformerInfo): Tree = + tree match { + case Apply(fn, args) => cpy.Apply(tree, fn, args ++ tree.args) + case _ => tree + } +}
\ No newline at end of file |