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