aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-10-02 12:45:41 +0200
committerGuillaume Martres <smarter@ubuntu.com>2016-10-11 19:21:02 +0200
commit146bc29acaba58391a5462ee26f989debaac9038 (patch)
tree843f2bebf55609e261d4d9bb997e06bdf5fce47d /src
parent797a9385dc6971a4583c989f2a7ddae4d3c3ab50 (diff)
downloaddotty-146bc29acaba58391a5462ee26f989debaac9038.tar.gz
dotty-146bc29acaba58391a5462ee26f989debaac9038.tar.bz2
dotty-146bc29acaba58391a5462ee26f989debaac9038.zip
Refactor Splitter functionality
Splitting or types is no longer needed with new scheme. Replacing idents with This nodes is better done in ExplicitSelf. So splitter now just distributes applications into and ifs.
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/transform/ExplicitSelf.scala9
-rw-r--r--src/dotty/tools/dotc/transform/Splitter.scala51
2 files changed, 30 insertions, 30 deletions
diff --git a/src/dotty/tools/dotc/transform/ExplicitSelf.scala b/src/dotty/tools/dotc/transform/ExplicitSelf.scala
index 618a0f108..7bb65e575 100644
--- a/src/dotty/tools/dotc/transform/ExplicitSelf.scala
+++ b/src/dotty/tools/dotc/transform/ExplicitSelf.scala
@@ -20,12 +20,21 @@ import Flags._
*
* where `S` is the self type of `C`.
* See run/i789.scala for a test case why this is needed.
+ *
+ * Also replaces idents referring to the self type with ThisTypes.
*/
class ExplicitSelf extends MiniPhaseTransform { thisTransform =>
import ast.tpd._
override def phaseName = "explicitSelf"
+ override def transformIdent(tree: Ident)(implicit ctx: Context, info: TransformerInfo) = tree.tpe match {
+ case tp: ThisType =>
+ ctx.debuglog(s"owner = ${ctx.owner}, context = ${ctx}")
+ This(tp.cls) withPos tree.pos
+ case _ => tree
+ }
+
override def transformSelect(tree: Select)(implicit ctx: Context, info: TransformerInfo): Tree = tree match {
case Select(thiz: This, name) if name.isTermName =>
val cls = thiz.symbol.asClass
diff --git a/src/dotty/tools/dotc/transform/Splitter.scala b/src/dotty/tools/dotc/transform/Splitter.scala
index efcf95ede..d62be1a82 100644
--- a/src/dotty/tools/dotc/transform/Splitter.scala
+++ b/src/dotty/tools/dotc/transform/Splitter.scala
@@ -6,25 +6,34 @@ import ast.Trees._
import core._
import Contexts._, Types._, Decorators._, Denotations._, Symbols._, SymDenotations._, Names._
-/** This transform makes sure every identifier and select node
- * carries a symbol. To do this, certain qualifiers with a union type
- * have to be "splitted" with a type test.
- *
- * For now, only self references are treated.
+/** Distribute applications into Block and If nodes
*/
class Splitter extends MiniPhaseTransform { thisTransform =>
import ast.tpd._
override def phaseName: String = "splitter"
- /** Replace self referencing idents with ThisTypes. */
- override def transformIdent(tree: Ident)(implicit ctx: Context, info: TransformerInfo) = tree.tpe match {
- case tp: ThisType =>
- ctx.debuglog(s"owner = ${ctx.owner}, context = ${ctx}")
- This(tp.cls) withPos tree.pos
- case _ => tree
+ /** Distribute arguments among splitted branches */
+ def distribute(tree: GenericApply[Type], rebuild: (Tree, List[Tree]) => Context => Tree)(implicit ctx: Context) = {
+ def recur(fn: Tree): Tree = fn match {
+ case Block(stats, expr) => Block(stats, recur(expr))
+ case If(cond, thenp, elsep) => If(cond, recur(thenp), recur(elsep))
+ case _ => rebuild(fn, tree.args)(ctx) withPos tree.pos
+ }
+ recur(tree.fun)
}
+ override def transformTypeApply(tree: TypeApply)(implicit ctx: Context, info: TransformerInfo) =
+ distribute(tree, typeApply)
+
+ override def transformApply(tree: Apply)(implicit ctx: Context, info: TransformerInfo) =
+ distribute(tree, apply)
+
+ private val typeApply = (fn: Tree, args: List[Tree]) => (ctx: Context) => TypeApply(fn, args)(ctx)
+ private val apply = (fn: Tree, args: List[Tree]) => (ctx: Context) => Apply(fn, args)(ctx)
+
+/* The following is no longer necessary, since we select members on the join of an or type:
+ *
/** If we select a name, make sure the node has a symbol.
* If necessary, split the qualifier with type tests.
* Example: Assume:
@@ -108,23 +117,5 @@ class Splitter extends MiniPhaseTransform { thisTransform =>
evalOnce(qual)(qual => choose(qual, candidates(qual.tpe)))
}
}
-
- /** Distribute arguments among splitted branches */
- def distribute(tree: GenericApply[Type], rebuild: (Tree, List[Tree]) => Context => Tree)(implicit ctx: Context) = {
- def recur(fn: Tree): Tree = fn match {
- case Block(stats, expr) => Block(stats, recur(expr))
- case If(cond, thenp, elsep) => If(cond, recur(thenp), recur(elsep))
- case _ => rebuild(fn, tree.args)(ctx) withPos tree.pos
- }
- recur(tree.fun)
- }
-
- override def transformTypeApply(tree: TypeApply)(implicit ctx: Context, info: TransformerInfo) =
- distribute(tree, typeApply)
-
- override def transformApply(tree: Apply)(implicit ctx: Context, info: TransformerInfo) =
- distribute(tree, apply)
-
- private val typeApply = (fn: Tree, args: List[Tree]) => (ctx: Context) => TypeApply(fn, args)(ctx)
- private val apply = (fn: Tree, args: List[Tree]) => (ctx: Context) => Apply(fn, args)(ctx)
+*/
}