Skip to content

Commit 488b1c4

Browse files
committed
Minor refactor of better for desugar
1 parent 606268f commit 488b1c4

File tree

1 file changed

+40
-35
lines changed

1 file changed

+40
-35
lines changed

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

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import reporting.*
1818
import printing.Formatting.hl
1919
import config.Printers
2020
import parsing.Parsers
21+
import dotty.tools.dotc.util.chaining.*
2122

2223
import scala.annotation.{unchecked as _, *}, internal.sharable
2324

@@ -2181,49 +2182,53 @@ object desugar {
21812182
case (gen: GenFrom) :: (rest @ (GenFrom(_, _, _) :: _)) =>
21822183
val cont = makeFor(mapName, flatMapName, rest, body)
21832184
Apply(rhsSelect(gen, flatMapName), makeLambda(gen, cont))
2184-
case (gen: GenFrom) :: rest
2185-
if sourceVersion.enablesBetterFors
2186-
&& rest.dropWhile(_.isInstanceOf[GenAlias]).headOption.forall(e => e.isInstanceOf[GenFrom]) // possible aliases followed by a generator or end of for
2187-
&& !rest.takeWhile(_.isInstanceOf[GenAlias]).exists(a => isNestedGivenPattern(a.asInstanceOf[GenAlias].pat)) =>
2188-
val cont = makeFor(mapName, flatMapName, rest, body)
2189-
val selectName =
2190-
if rest.exists(_.isInstanceOf[GenFrom]) then flatMapName
2191-
else mapName
2192-
val aply = Apply(rhsSelect(gen, selectName), makeLambda(gen, cont))
2193-
markTrailingMap(aply, gen, selectName)
2194-
aply
21952185
case (gen: GenFrom) :: (rest @ GenAlias(_, _) :: _) =>
2196-
val (valeqs, rest1) = rest.span(_.isInstanceOf[GenAlias])
2197-
val pats = valeqs map { case GenAlias(pat, _) => pat }
2198-
val rhss = valeqs map { case GenAlias(_, rhs) => rhs }
2199-
val (defpat0, id0) = makeIdPat(gen.pat)
2200-
val (defpats, ids) = (pats map makeIdPat).unzip
2201-
val pdefs = valeqs.lazyZip(defpats).lazyZip(rhss).map { (valeq, defpat, rhs) =>
2202-
val mods = defpat match
2203-
case defTree: DefTree => defTree.mods
2204-
case _ => Modifiers()
2205-
makePatDef(valeq, mods, defpat, rhs)
2206-
}
2207-
val rhs1 = makeFor(nme.map, nme.flatMap, GenFrom(defpat0, gen.expr, gen.checkMode) :: Nil, Block(pdefs, makeTuple(id0 :: ids).withAttachment(ForArtifact, ())))
2208-
val allpats = gen.pat :: pats
2209-
val vfrom1 = GenFrom(makeTuple(allpats), rhs1, GenCheckMode.Ignore)
2210-
makeFor(mapName, flatMapName, vfrom1 :: rest1, body)
2186+
val (valeqs, suffix) = rest.span(_.isInstanceOf[GenAlias])
2187+
// possible aliases followed by a generator or end of for, when betterFors.
2188+
// exclude value definitions with a given pattern (given T = x)
2189+
val better = sourceVersion.enablesBetterFors
2190+
&& suffix.headOption.forall(_.isInstanceOf[GenFrom])
2191+
&& !valeqs.exists(a => isNestedGivenPattern(a.asInstanceOf[GenAlias].pat))
2192+
if better then
2193+
val cont = makeFor(mapName, flatMapName, enums = rest, body)
2194+
val selectName =
2195+
if suffix.exists(_.isInstanceOf[GenFrom]) then flatMapName
2196+
else mapName
2197+
Apply(rhsSelect(gen, selectName), makeLambda(gen, cont))
2198+
.tap(markTrailingMap(_, gen, selectName))
2199+
else
2200+
val (pats, rhss) = valeqs.map { case GenAlias(pat, rhs) => (pat, rhs) }.unzip
2201+
val (defpat0, id0) = makeIdPat(gen.pat)
2202+
val (defpats, ids) = pats.map(makeIdPat).unzip
2203+
val pdefs = valeqs.lazyZip(defpats).lazyZip(rhss).map: (valeq, defpat, rhs) =>
2204+
val mods = defpat match
2205+
case defTree: DefTree => defTree.mods
2206+
case _ => Modifiers()
2207+
makePatDef(valeq, mods, defpat, rhs)
2208+
val rhs1 =
2209+
val enums = GenFrom(defpat0, gen.expr, gen.checkMode) :: Nil
2210+
val body = Block(pdefs, makeTuple(id0 :: ids).withAttachment(ForArtifact, ()))
2211+
makeFor(nme.map, nme.flatMap, enums, body)
2212+
val allpats = gen.pat :: pats
2213+
val vfrom1 = GenFrom(makeTuple(allpats), rhs1, GenCheckMode.Ignore)
2214+
makeFor(mapName, flatMapName, enums = vfrom1 :: suffix, body)
2215+
end if
22112216
case (gen: GenFrom) :: test :: rest =>
2212-
val filtered = Apply(rhsSelect(gen, nme.withFilter), makeLambda(gen, test))
2213-
val genFrom = GenFrom(gen.pat, filtered, if sourceVersion.enablesBetterFors then GenCheckMode.Filtered else GenCheckMode.Ignore)
2217+
val genFrom =
2218+
val filtered = Apply(rhsSelect(gen, nme.withFilter), makeLambda(gen, test))
2219+
val mode = if sourceVersion.enablesBetterFors then GenCheckMode.Filtered else GenCheckMode.Ignore
2220+
GenFrom(gen.pat, filtered, mode)
22142221
makeFor(mapName, flatMapName, genFrom :: rest, body)
2215-
case GenAlias(_, _) :: _ if sourceVersion.enablesBetterFors =>
2216-
val (valeqs, rest) = enums.span(_.isInstanceOf[GenAlias])
2217-
val pats = valeqs.map { case GenAlias(pat, _) => pat }
2218-
val rhss = valeqs.map { case GenAlias(_, rhs) => rhs }
2222+
case enums @ GenAlias(_, _) :: _ if sourceVersion.enablesBetterFors =>
2223+
val (valeqs, suffix) = enums.span(_.isInstanceOf[GenAlias])
2224+
val (pats, rhss) = valeqs.map { case GenAlias(pat, rhs) => (pat, rhs) }.unzip
22192225
val (defpats, ids) = pats.map(makeIdPat).unzip
2220-
val pdefs = valeqs.lazyZip(defpats).lazyZip(rhss).map { (valeq, defpat, rhs) =>
2226+
val pdefs = valeqs.lazyZip(defpats).lazyZip(rhss).map: (valeq, defpat, rhs) =>
22212227
val mods = defpat match
22222228
case defTree: DefTree => defTree.mods
22232229
case _ => Modifiers()
22242230
makePatDef(valeq, mods, defpat, rhs)
2225-
}
2226-
Block(pdefs, makeFor(mapName, flatMapName, rest, body))
2231+
Block(pdefs, makeFor(mapName, flatMapName, enums = suffix, body))
22272232
case _ =>
22282233
EmptyTree //may happen for erroneous input
22292234
}

0 commit comments

Comments
 (0)