diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2014-03-27 13:23:49 +0100 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2014-03-27 16:16:11 +0100 |
commit | a0c3bbdb3a4b1055834f3ff5f729dc3af1867696 (patch) | |
tree | 1f05aeae0ae50adcbe6fa5c48287015edc573c21 /src | |
parent | c765537cb3532a7b88f1b68331840953f3e9d048 (diff) | |
download | scala-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.scala | 12 |
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 |