aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/ast/Desugar.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-11-04 11:30:14 +0100
committerMartin Odersky <odersky@gmail.com>2013-11-04 11:32:12 +0100
commitbfc7c25bda04697463a36b9eb278e00407895a53 (patch)
tree92f8bc49bd59bf98d604fb29b8d98c04588173e7 /src/dotty/tools/dotc/ast/Desugar.scala
parentab95d83444c6397f8859713dd6606602c77c8d23 (diff)
downloaddotty-bfc7c25bda04697463a36b9eb278e00407895a53.tar.gz
dotty-bfc7c25bda04697463a36b9eb278e00407895a53.tar.bz2
dotty-bfc7c25bda04697463a36b9eb278e00407895a53.zip
Fallback to old treatement of tuples.
For interoperability we will keep for the time being the traditional treatment of tuples as instances of Tuple 2… Tuple 22. The new hlist-like treatment will be done in a future step. The flip is controlled by variable "unboxedPairs".
Diffstat (limited to 'src/dotty/tools/dotc/ast/Desugar.scala')
-rw-r--r--src/dotty/tools/dotc/ast/Desugar.scala27
1 files changed, 22 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/ast/Desugar.scala b/src/dotty/tools/dotc/ast/Desugar.scala
index fb80509fd..d3ffa0c91 100644
--- a/src/dotty/tools/dotc/ast/Desugar.scala
+++ b/src/dotty/tools/dotc/ast/Desugar.scala
@@ -13,6 +13,9 @@ import typer.Mode
object desugar {
+ /** Are we using the new unboxed pair scheme? */
+ private final val unboxedPairs = false
+
import untpd._
private type VarInfo = (NameTree, Tree)
@@ -508,11 +511,25 @@ object desugar {
case Parens(t) =>
t
case Tuple(ts) =>
- def PairTypeTree(l: Tree, r: Tree) =
- AppliedTypeTree(ref(defn.PairClass.typeConstructor), l :: r :: Nil)
- if (ctx.mode is Mode.Type) ts.reduceRight(PairTypeTree)
- else if (ts.isEmpty) unitLiteral
- else ts.reduceRight(Pair(_, _))
+ if (unboxedPairs) {
+ def PairTypeTree(l: Tree, r: Tree) =
+ AppliedTypeTree(ref(defn.PairClass.typeConstructor), l :: r :: Nil)
+ if (ctx.mode is Mode.Type) ts.reduceRight(PairTypeTree)
+ else if (ts.isEmpty) unitLiteral
+ else ts.reduceRight(Pair(_, _))
+ }
+ else {
+ val arity = ts.length
+ def tupleClass = defn.TupleClass(arity)
+ if (arity > Definitions.MaxTupleArity) {
+ ctx.error(s"tuple too long (max allowed: ${Definitions.MaxTupleArity})", tree.pos)
+ unitLiteral
+ }
+ else if (arity == 1) ts.head
+ else if (ctx.mode is Mode.Type) AppliedTypeTree(ref(tupleClass.typeConstructor), ts)
+ else if (arity == 0) unitLiteral
+ else Apply(ref(tupleClass.companionModule.symRef), ts)
+ }
case WhileDo(cond, body) =>
// { <label> def while$(): Unit = if (cond) { body; while$() } ; while$() }
val call = Apply(Ident(nme.WHILE_PREFIX), Nil)