summaryrefslogtreecommitdiff
path: root/src/reflect
diff options
context:
space:
mode:
authorDen Shabalin <den.shabalin@gmail.com>2013-10-31 13:50:10 +0100
committerDen Shabalin <den.shabalin@gmail.com>2013-11-12 14:04:42 +0100
commit3b4d8c0c0b71db160c0d031f34274977446e815a (patch)
treee0089da4d0270f1b38e8a10b0cd1d9562bc3b5e6 /src/reflect
parent538cc136f5f4595cccf15b4b0f496096ab675c13 (diff)
downloadscala-3b4d8c0c0b71db160c0d031f34274977446e815a.tar.gz
scala-3b4d8c0c0b71db160c0d031f34274977446e815a.tar.bz2
scala-3b4d8c0c0b71db160c0d031f34274977446e815a.zip
add some post-typecheck tests for quasiquotes
Typecheck trees with toolbox and check that they are still matched by corresponding quasiquote. Fix tuples and function types matchers to account for different shape of trees after typing.
Diffstat (limited to 'src/reflect')
-rw-r--r--src/reflect/scala/reflect/internal/BuildUtils.scala30
1 files changed, 25 insertions, 5 deletions
diff --git a/src/reflect/scala/reflect/internal/BuildUtils.scala b/src/reflect/scala/reflect/internal/BuildUtils.scala
index 004c4aa40b..cae671a5e9 100644
--- a/src/reflect/scala/reflect/internal/BuildUtils.scala
+++ b/src/reflect/scala/reflect/internal/BuildUtils.scala
@@ -326,7 +326,9 @@ trait BuildUtils { self: SymbolTable =>
def unapply(tree: Tree): Option[List[Tree]] = tree match {
case Literal(Constant(())) =>
Some(Nil)
- case Apply(TupleCompanionRef(sym), args) if sym == TupleClass(args.length).companionModule =>
+ case Apply(MaybeTypeTreeOriginal(SyntacticTypeApplied(MaybeSelectApply(TupleCompanionRef(sym)), targs)), args)
+ if sym == TupleClass(args.length).companionModule
+ && (targs.isEmpty || targs.length == args.length) =>
Some(args)
case _ =>
None
@@ -339,10 +341,11 @@ trait BuildUtils { self: SymbolTable =>
gen.mkTupleType(args, flattenUnary = false)
}
- def unapply(tree: Tree): Option[List[Tree]] = tree match {
- case UnitClassRef(_) =>
+ def unapply(tree: Tree): Option[List[Tree]] = tree match {
+ case MaybeTypeTreeOriginal(UnitClassRef(_)) =>
Some(Nil)
- case AppliedTypeTree(TupleClassRef(sym), args) if sym == TupleClass(args.length) =>
+ case MaybeTypeTreeOriginal(AppliedTypeTree(TupleClassRef(sym), args))
+ if sym == TupleClass(args.length) =>
Some(args)
case _ =>
None
@@ -356,7 +359,8 @@ trait BuildUtils { self: SymbolTable =>
}
def unapply(tree: Tree): Option[(List[Tree], Tree)] = tree match {
- case AppliedTypeTree(FunctionClassRef(sym), args @ (argtpes :+ restpe)) if sym == FunctionClass(args.length - 1) =>
+ case MaybeTypeTreeOriginal(AppliedTypeTree(FunctionClassRef(sym), args @ (argtpes :+ restpe)))
+ if sym == FunctionClass(args.length - 1) =>
Some((argtpes, restpe))
case _ => None
}
@@ -437,6 +441,22 @@ trait BuildUtils { self: SymbolTable =>
case _ => None
}
}
+
+ // use typetree's original instead of typetree itself
+ protected object MaybeTypeTreeOriginal {
+ def unapply(tree: Tree): Some[Tree] = tree match {
+ case tt: TypeTree => Some(tt.original)
+ case _ => Some(tree)
+ }
+ }
+
+ // drop potential extra call to .apply
+ protected object MaybeSelectApply {
+ def unapply(tree: Tree): Some[Tree] = tree match {
+ case Select(f, nme.apply) => Some(f)
+ case other => Some(other)
+ }
+ }
}
val build: BuildImpl = new BuildImpl