summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2014-03-27 13:23:49 +0100
committerEugene Burmako <xeno.by@gmail.com>2014-03-27 16:16:11 +0100
commita0c3bbdb3a4b1055834f3ff5f729dc3af1867696 (patch)
tree1f05aeae0ae50adcbe6fa5c48287015edc573c21 /src
parentc765537cb3532a7b88f1b68331840953f3e9d048 (diff)
downloadscala-a0c3bbdb3a4b1055834f3ff5f729dc3af1867696.tar.gz
scala-a0c3bbdb3a4b1055834f3ff5f729dc3af1867696.tar.bz2
scala-a0c3bbdb3a4b1055834f3ff5f729dc3af1867696.zip
SI-8451 quasiquotes now handle quirks of secondary constructors
Apparently even though the rhs of a secondary constructor looks like an expr, it always gets wrapped in a block by the parser. This works just fine with the typer, but crashes in uncurry. This commit brings quasiquotes in line with the parser.
Diffstat (limited to 'src')
-rw-r--r--src/reflect/scala/reflect/internal/ReificationSupport.scala12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/reflect/scala/reflect/internal/ReificationSupport.scala b/src/reflect/scala/reflect/internal/ReificationSupport.scala
index f9f93fbff0..37f7b85720 100644
--- a/src/reflect/scala/reflect/internal/ReificationSupport.scala
+++ b/src/reflect/scala/reflect/internal/ReificationSupport.scala
@@ -523,11 +523,21 @@ trait ReificationSupport { self: SymbolTable =>
object SyntacticDefDef extends SyntacticDefDefExtractor {
def apply(mods: Modifiers, name: TermName, tparams: List[Tree],
vparamss: List[List[Tree]], tpt: Tree, rhs: Tree): DefDef = {
+ val tparams0 = mkTparams(tparams)
val vparamss0 = mkParam(vparamss, PARAM)
- DefDef(mods, name, mkTparams(tparams), vparamss0, tpt, rhs)
+ val rhs0 = {
+ if (name != nme.CONSTRUCTOR) rhs
+ else rhs match {
+ case Block(_, _) => rhs
+ case _ => Block(List(rhs), gen.mkSyntheticUnit)
+ }
+ }
+ DefDef(mods, name, tparams0, vparamss0, tpt, rhs0)
}
def unapply(tree: Tree): Option[(Modifiers, TermName, List[TypeDef], List[List[ValDef]], Tree, Tree)] = tree match {
+ case DefDef(mods, nme.CONSTRUCTOR, tparams, vparamss, tpt, Block(List(expr), Literal(Constant(())))) =>
+ Some((mods, nme.CONSTRUCTOR, tparams, vparamss, tpt, expr))
case DefDef(mods, name, tparams, vparamss, tpt, rhs) =>
Some((mods, name, tparams, vparamss, tpt, rhs))
case _ => None