Skip to content

Commit f7996da

Browse files
committed
Adapt context bound evidence to implicits in last parameter list
If we have a function like ```scala def foo[X: CB](...)(implicit x: T) ``` always map context bounds to implicit parameters, irrespective of version. Likewise, if we have a function ``scala def foo[X: CB](...)(using x: T) ``` always map context bounds to "using" parameters, irrespective of version. This avoids mixing implicit and using in one parameter list.
1 parent b8f9c2c commit f7996da

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,12 @@ object desugar {
300300
// implicit resolution in Scala 3.
301301

302302
val paramssNoContextBounds =
303-
val iflag = if Feature.sourceVersion.isAtLeast(`3.6`) then Given else Implicit
303+
val iflag = paramss.lastOption.flatMap(_.headOption) match
304+
case Some(param) if param.mods.isOneOf(GivenOrImplicit) =>
305+
param.mods.flags & GivenOrImplicit
306+
case _ =>
307+
if Feature.sourceVersion.isAtLeast(`3.6`) then Given
308+
else Implicit
304309
val flags = if isPrimaryConstructor then iflag | LocalParamAccessor else iflag | Param
305310
mapParamss(paramss) {
306311
tparam => desugarContextBounds(tparam, evidenceParamBuf, flags, freshName, paramss)
@@ -472,7 +477,14 @@ object desugar {
472477
case ValDefs(mparams) :: _ if mparams.exists(referencesBoundName) =>
473478
params :: mparamss
474479
case ValDefs(mparams @ (mparam :: _)) :: Nil if mparam.mods.isOneOf(GivenOrImplicit) =>
475-
(params ++ mparams) :: Nil
480+
val normParams =
481+
if params.head.mods.flags.is(Given) != mparam.mods.flags.is(Given) then
482+
params.map: param =>
483+
val normFlags = param.mods.flags &~ GivenOrImplicit | (mparam.mods.flags & (GivenOrImplicit))
484+
param.withMods(param.mods.withFlags(normFlags))
485+
.showing(i"ADAPTED PARAM $result ${result.mods.flags} for ${meth.name}")
486+
else params
487+
(normParams ++ mparams) :: Nil
476488
case mparams :: mparamss1 =>
477489
mparams :: recur(mparamss1)
478490
case Nil =>

0 commit comments

Comments
 (0)