summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/BuildUtils.scala
diff options
context:
space:
mode:
authorDenys Shabalin <denys.shabalin@typesafe.com>2014-02-10 14:29:59 +0100
committerDenys Shabalin <denys.shabalin@typesafe.com>2014-02-10 14:44:27 +0100
commit2b67f8b94f9e95c5fb7be0e6d6c4718a6e045ec4 (patch)
tree437aa34986ad2b060b5ef52533a7f8abf5b199e4 /src/reflect/scala/reflect/internal/BuildUtils.scala
parent08e51dfec50842253afb87cc5ae3c7400dc18ced (diff)
downloadscala-2b67f8b94f9e95c5fb7be0e6d6c4718a6e045ec4.tar.gz
scala-2b67f8b94f9e95c5fb7be0e6d6c4718a6e045ec4.tar.bz2
scala-2b67f8b94f9e95c5fb7be0e6d6c4718a6e045ec4.zip
Make handling of tuples more consistent in quasi-quotes
On one hand we know that q"($expr)" is the same as q"$expr". On the other if we wrap it into a list and splice as q"(..$expr)" we get a Tuple1 constructor call which is inconsistent. This pull request fixes this inconsistency by making q"(..$expr)" being equivalent q"(${expr.head})" for single-element list. We also add support for matching of expressions as single-element tuples (similarly to blocks) and remove liftables and unliftables for Tuple1 (which aren't clearly defined any longer due to q"(foo)" == q"foo" invariant).
Diffstat (limited to 'src/reflect/scala/reflect/internal/BuildUtils.scala')
-rw-r--r--src/reflect/scala/reflect/internal/BuildUtils.scala8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/reflect/scala/reflect/internal/BuildUtils.scala b/src/reflect/scala/reflect/internal/BuildUtils.scala
index c5581601de..738eb316f0 100644
--- a/src/reflect/scala/reflect/internal/BuildUtils.scala
+++ b/src/reflect/scala/reflect/internal/BuildUtils.scala
@@ -350,7 +350,7 @@ trait BuildUtils { self: SymbolTable =>
object SyntacticTuple extends SyntacticTupleExtractor {
def apply(args: List[Tree]): Tree = {
require(args.isEmpty || TupleClass(args.length).exists, s"Tuples with ${args.length} arity aren't supported")
- gen.mkTuple(args, flattenUnary = false)
+ gen.mkTuple(args)
}
def unapply(tree: Tree): Option[List[Tree]] = tree match {
@@ -360,6 +360,8 @@ trait BuildUtils { self: SymbolTable =>
if sym == TupleClass(args.length).companionModule
&& (targs.isEmpty || targs.length == args.length) =>
Some(args)
+ case _ if tree.isTerm =>
+ Some(tree :: Nil)
case _ =>
None
}
@@ -368,7 +370,7 @@ trait BuildUtils { self: SymbolTable =>
object SyntacticTupleType extends SyntacticTupleExtractor {
def apply(args: List[Tree]): Tree = {
require(args.isEmpty || TupleClass(args.length).exists, s"Tuples with ${args.length} arity aren't supported")
- gen.mkTupleType(args, flattenUnary = false)
+ gen.mkTupleType(args)
}
def unapply(tree: Tree): Option[List[Tree]] = tree match {
@@ -377,6 +379,8 @@ trait BuildUtils { self: SymbolTable =>
case MaybeTypeTreeOriginal(AppliedTypeTree(TupleClassRef(sym), args))
if sym == TupleClass(args.length) =>
Some(args)
+ case _ if tree.isType =>
+ Some(tree :: Nil)
case _ =>
None
}