@@ -1278,16 +1278,19 @@ object desugar {
1278
1278
*/
1279
1279
def makeFor (mapName : TermName , flatMapName : TermName , enums : List [Tree ], body : Tree ): Tree = trace(i " make for ${ForYield (enums, body)}" , show = true ) {
1280
1280
1281
- /** Make a function value pat => body.
1282
- * If pat is a var pattern id: T then this gives (id: T) => body
1283
- * Otherwise this gives { case pat => body }, where `pat` is allowed to be
1284
- * refutable only if `checkMode` is MatchCheck.None .
1281
+ /** Let `pat` be `gen`'s pattern. Make a function value ` pat => body` .
1282
+ * If ` pat` is a var pattern ` id: T` then this gives ` (id: T) => body`.
1283
+ * Otherwise this gives ` { case pat => body }` , where `pat` is checked to be
1284
+ * irrefutable if `gen`'s checkMode is GenCheckMode.Check .
1285
1285
*/
1286
- def makeLambda (pat : Tree , body : Tree , checkMode : MatchCheck ): Tree = pat match {
1287
- case IdPattern (named, tpt) =>
1288
- Function (derivedValDef(pat, named, tpt, EmptyTree , Modifiers (Param )) :: Nil , body)
1286
+ def makeLambda (gen : GenFrom , body : Tree ): Tree = gen. pat match {
1287
+ case IdPattern (named, tpt) if gen.checkMode != GenCheckMode . FilterAlways =>
1288
+ Function (derivedValDef(gen. pat, named, tpt, EmptyTree , Modifiers (Param )) :: Nil , body)
1289
1289
case _ =>
1290
- makeCaseLambda(CaseDef (pat, EmptyTree , body) :: Nil , checkMode)
1290
+ val matchCheckMode =
1291
+ if (gen.checkMode == GenCheckMode .Check ) MatchCheck .IrrefutableGenFrom
1292
+ else MatchCheck .None
1293
+ makeCaseLambda(CaseDef (gen.pat, EmptyTree , body) :: Nil , matchCheckMode)
1291
1294
}
1292
1295
1293
1296
/** If `pat` is not an Identifier, a Typed(Ident, _), or a Bind, wrap
@@ -1359,16 +1362,20 @@ object desugar {
1359
1362
}
1360
1363
}
1361
1364
1362
- def needsFilter (gen : GenFrom ): Boolean =
1363
- gen.checkMode != GenCheckMode .Filter ||
1364
- IdPattern .unapply(gen.pat).isDefined ||
1365
- isIrrefutable(gen.pat, gen.expr)
1365
+ def needsNoFilter (gen : GenFrom ): Boolean =
1366
+ if (gen.checkMode == GenCheckMode .FilterAlways ) // pattern was prefixed by `case`
1367
+ isIrrefutable(gen.pat, gen.expr)
1368
+ else (
1369
+ gen.checkMode != GenCheckMode .FilterNow ||
1370
+ IdPattern .unapply(gen.pat).isDefined ||
1371
+ isIrrefutable(gen.pat, gen.expr)
1372
+ )
1366
1373
1367
1374
/** rhs.name with a pattern filter on rhs unless `pat` is irrefutable when
1368
1375
* matched against `rhs`.
1369
1376
*/
1370
1377
def rhsSelect (gen : GenFrom , name : TermName ) = {
1371
- val rhs = if (needsFilter (gen)) gen.expr else makePatFilter(gen.expr, gen.pat)
1378
+ val rhs = if (needsNoFilter (gen)) gen.expr else makePatFilter(gen.expr, gen.pat)
1372
1379
Select (rhs, name)
1373
1380
}
1374
1381
@@ -1378,10 +1385,10 @@ object desugar {
1378
1385
1379
1386
enums match {
1380
1387
case (gen : GenFrom ) :: Nil =>
1381
- Apply (rhsSelect(gen, mapName), makeLambda(gen.pat , body, checkMode(gen) ))
1388
+ Apply (rhsSelect(gen, mapName), makeLambda(gen, body))
1382
1389
case (gen : GenFrom ) :: (rest @ (GenFrom (_, _, _) :: _)) =>
1383
1390
val cont = makeFor(mapName, flatMapName, rest, body)
1384
- Apply (rhsSelect(gen, flatMapName), makeLambda(gen.pat , cont, checkMode(gen) ))
1391
+ Apply (rhsSelect(gen, flatMapName), makeLambda(gen, cont))
1385
1392
case (gen : GenFrom ) :: (rest @ GenAlias (_, _) :: _) =>
1386
1393
val (valeqs, rest1) = rest.span(_.isInstanceOf [GenAlias ])
1387
1394
val pats = valeqs map { case GenAlias (pat, _) => pat }
@@ -1394,7 +1401,7 @@ object desugar {
1394
1401
val vfrom1 = new GenFrom (makeTuple(allpats), rhs1, GenCheckMode .Ignore )
1395
1402
makeFor(mapName, flatMapName, vfrom1 :: rest1, body)
1396
1403
case (gen : GenFrom ) :: test :: rest =>
1397
- val filtered = Apply (rhsSelect(gen, nme.withFilter), makeLambda(gen.pat , test, MatchCheck . None ))
1404
+ val filtered = Apply (rhsSelect(gen, nme.withFilter), makeLambda(gen, test))
1398
1405
val genFrom = GenFrom (gen.pat, filtered, GenCheckMode .Ignore )
1399
1406
makeFor(mapName, flatMapName, genFrom :: rest, body)
1400
1407
case _ =>
0 commit comments