diff options
author | Denys Shabalin <denys.shabalin@typesafe.com> | 2014-01-16 12:01:30 +0100 |
---|---|---|
committer | Denys Shabalin <denys.shabalin@typesafe.com> | 2014-01-16 12:45:38 +0100 |
commit | 8e9862473abd03bded2d3afa60c777099f7872c5 (patch) | |
tree | df2b1fcbd893a77ea63717f6290146357214b3cf /src/compiler | |
parent | 393829489a1e352c2ed659b16b6bea24069f4f9a (diff) | |
download | scala-8e9862473abd03bded2d3afa60c777099f7872c5.tar.gz scala-8e9862473abd03bded2d3afa60c777099f7872c5.tar.bz2 scala-8e9862473abd03bded2d3afa60c777099f7872c5.zip |
SI-8076 improve support for implicit argument list
This adds support for construction and deconstruction
of implicit argument list which was originally suggested
by @cvogt.
1. Splicing vale into implicit argument list automatically
adds implicit flag to them:
val x = q"val x: Int"
q"def foo(implicit $x)"
// <=> q"def foo(implicit x: Int)"
2. One might extract implicit argument list separately from
other argument lists:
val q”def foo(...$argss)(implicit ..$impl)" =
q"def foo(implicit x: Int)
// argss is Nil, impl contains valdef for x
But this doesn't require you to always extract it separatly:
val q”def foo(...$argss)" =
q"def foo(implicit x: Int)
// argss contains valdef for x
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala b/src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala index 58baad01a1..9c0a036541 100644 --- a/src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala +++ b/src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala @@ -160,8 +160,12 @@ trait Reifiers { self: Quasiquotes => reifyBuildCall(nme.SyntacticObjectDef, mods, name, earlyDefs, parents, selfdef, body) case SyntacticNew(earlyDefs, parents, selfdef, body) => reifyBuildCall(nme.SyntacticNew, earlyDefs, parents, selfdef, body) - case SyntacticDefDef(mods, name, tparams, vparamss, tpt, rhs) => - reifyBuildCall(nme.SyntacticDefDef, mods, name, tparams, vparamss, tpt, rhs) + case SyntacticDefDef(mods, name, tparams, build.ImplicitParams(vparamss, implparams), tpt, rhs) => + if (implparams.nonEmpty) + mirrorBuildCall(nme.SyntacticDefDef, reify(mods), reify(name), reify(tparams), + reifyBuildCall(nme.ImplicitParams, vparamss, implparams), reify(tpt), reify(rhs)) + else + reifyBuildCall(nme.SyntacticDefDef, mods, name, tparams, vparamss, tpt, rhs) case SyntacticValDef(mods, name, tpt, rhs) if tree != noSelfType => reifyBuildCall(nme.SyntacticValDef, mods, name, tpt, rhs) case SyntacticVarDef(mods, name, tpt, rhs) => |