aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/Constructors.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-11-01 18:33:56 +0100
committerMartin Odersky <odersky@gmail.com>2014-11-09 19:08:58 +0100
commit43075bb832c3b4fe080c24a20ecf8c4737d5cdd2 (patch)
tree680cc886c536c34b4c3718663386d1cb13be4924 /src/dotty/tools/dotc/transform/Constructors.scala
parent0119ffd3e285e43b63fb9c43c1c8b009174a1987 (diff)
downloaddotty-43075bb832c3b4fe080c24a20ecf8c4737d5cdd2.tar.gz
dotty-43075bb832c3b4fe080c24a20ecf8c4737d5cdd2.tar.bz2
dotty-43075bb832c3b4fe080c24a20ecf8c4737d5cdd2.zip
Improved version of mixin.
Now also handles all supercalls. Seems to do the right thing on pos/traits.scala. But does not pass most tests because the sym transformer forces too many things.
Diffstat (limited to 'src/dotty/tools/dotc/transform/Constructors.scala')
-rw-r--r--src/dotty/tools/dotc/transform/Constructors.scala36
1 files changed, 7 insertions, 29 deletions
diff --git a/src/dotty/tools/dotc/transform/Constructors.scala b/src/dotty/tools/dotc/transform/Constructors.scala
index 7bde1ba4f..c966e2678 100644
--- a/src/dotty/tools/dotc/transform/Constructors.scala
+++ b/src/dotty/tools/dotc/transform/Constructors.scala
@@ -109,32 +109,6 @@ class Constructors extends MiniPhaseTransform with SymTransformer { thisTransfor
}
}
- val superCalls = new mutable.ListBuffer[Tree]
-
- // If parent is a constructor call, pull out the call into a separate
- // supercall constructor, which gets appended to `superCalls`, and keep
- // only the type.
- def normalizeParent(tree: Tree) = tree match {
- case superApp @ Apply(
- superSel @ Select(
- superNew @ New(superType),
- nme.CONSTRUCTOR),
- superArgs) =>
- val toClass = !superType.symbol.is(Trait)
- val mappedArgs = superArgs.map(intoConstr(_, inSuperCall = toClass))
- val receiver =
- if (toClass) Super(This(cls), tpnme.EMPTY, inConstrCall = true)
- else This(cls)
- superCalls +=
- cpy.Apply(superApp)(
- receiver.withPos(superNew.pos)
- .select(superSel.symbol).withPos(superSel.pos),
- mappedArgs)
- superType
- case tree: TypeTree => tree
- }
- val parentTypeTrees = tree.parents.map(normalizeParent)
-
// Collect all private parameter accessors and value definitions that need
// to be retained. There are several reasons why a parameter accessor or
// definition might need to be retained:
@@ -172,7 +146,7 @@ class Constructors extends MiniPhaseTransform with SymTransformer { thisTransfor
traverse(stat)
}
}
- usage.collect(superCalls.toList ++ tree.body)
+ usage.collect(tree.body)
def isRetained(acc: Symbol) = !mightBeDropped(acc) || usage.retained(acc)
@@ -226,10 +200,14 @@ class Constructors extends MiniPhaseTransform with SymTransformer { thisTransfor
decls = clsInfo.decls.filteredScope(!dropped.contains(_))))
}
+ val (superCalls, followConstrStats) = constrStats.toList match {
+ case (sc: Apply) :: rest if sc.symbol.isConstructor => (sc :: Nil, rest)
+ case stats => (Nil, stats)
+ }
+
cpy.Template(tree)(
constr = cpy.DefDef(constr)(
- rhs = Block(superCalls.toList ::: copyParams ::: constrStats.toList, unitLiteral)),
- parents = parentTypeTrees,
+ rhs = Block(superCalls ::: copyParams ::: followConstrStats, unitLiteral)),
body = clsStats.toList)
}
} \ No newline at end of file