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