Skip to content

Commit 2d700c5

Browse files
committed
Properly show deprecation and experimental in member groups where only part of the group is affected (#16473)
1 parent 805dda8 commit 2d700c5

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala

+32-17
Original file line numberDiff line numberDiff line change
@@ -303,32 +303,47 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
303303
groupBody :: Nil
304304

305305

306-
private def isDeprecated(m: Member | MGroup): Boolean = m match
307-
case m: Member => m.deprecated.nonEmpty
308-
case g: MGroup => g.members.exists(isDeprecated)
306+
private def splitByCondition(m: Seq[Member | MGroup])(cond: Member => Boolean): (Seq[Member | MGroup], Seq[Member | MGroup]) =
307+
m.map {
308+
case m: Member => if cond(m) then (Nil, Seq[Member | MGroup](m)) else (Seq[Member | MGroup](m), Nil)
309+
case g: MGroup =>
310+
val (pos, neg) = g.members.partition(m => cond(m))
311+
(if pos.nonEmpty then Seq[Member | MGroup](g.copy(members = pos)) else Nil, if neg.nonEmpty then Seq[Member | MGroup](g.copy(members = neg)) else Nil)
312+
}.reduceLeftOption {
313+
case ((posacc, negacc), (pos, neg)) => (posacc ++ pos, negacc ++ neg)
314+
}.fold((Nil, Nil))(identity)
315+
316+
private def splitExperimental(m: Seq[Member | MGroup]): (Seq[Member | MGroup], Seq[Member | MGroup]) =
317+
splitByCondition(m) {
318+
m => m.experimental.nonEmpty
319+
}
309320

310-
private def isExperimental(m: Member | MGroup): Boolean = m match
311-
case m: Member => m.experimental.nonEmpty
312-
case g: MGroup => g.members.exists(isExperimental)
321+
private def splitDeprecated(m: Seq[Member | MGroup]): (Seq[Member | MGroup], Seq[Member | MGroup]) =
322+
splitByCondition(m) {
323+
m => m.deprecated.nonEmpty
324+
}
313325

314-
private def isInherited(m: Member | MGroup): Boolean = m match
315-
case m: Member => m.inheritedFrom.nonEmpty
316-
case g: MGroup => g.members.exists(isInherited)
326+
private def splitInherited(m: Seq[Member | MGroup]): (Seq[Member | MGroup], Seq[Member | MGroup]) =
327+
splitByCondition(m) {
328+
m => m.inheritedFrom.nonEmpty
329+
}
317330

318-
private def isAbstract(m: Member | MGroup): Boolean = m match
319-
case m: Member => m.modifiers.exists(Set(Modifier.Abstract, Modifier.Deferred).contains)
320-
case g: MGroup => g.members.exists(isAbstract)
331+
private def splitAbstract(m: Seq[Member | MGroup]): (Seq[Member | MGroup], Seq[Member | MGroup]) =
332+
splitByCondition(m) {
333+
m => m.modifiers.exists(Set(Modifier.Abstract, Modifier.Deferred).contains)
334+
}
321335

322336
private type SubGroup = (String, Seq[Member | MGroup])
323337
private def buildGroup(name: String, subgroups: Seq[SubGroup]): Tab =
324338
val all = subgroups.map { case (name, members) =>
325-
val (experimental, nonExperimental) = members.partition(isExperimental)
326-
val (allInherited, allDefined) = nonExperimental.partition(isInherited)
327-
val (depDefined, defined) = allDefined.partition(isDeprecated)
328-
val (depInherited, inherited) = allInherited.partition(isDeprecated)
339+
val (experimental, nonExperimental) = splitExperimental(members)
340+
val (allInherited, allDefined) = splitInherited(nonExperimental)
341+
val (depDefined, defined) = splitDeprecated(allDefined)
342+
val (depInherited, inherited) = splitDeprecated(allInherited)
343+
329344
val normalizedName = name.toLowerCase
330345
val definedWithGroup = if Set("methods", "fields").contains(normalizedName) then
331-
val (abstr, concr) = defined.partition(isAbstract)
346+
val (abstr, concr) = splitAbstract(defined)
332347
Seq(
333348
actualGroup(s"Abstract ${normalizedName}", abstr),
334349
actualGroup(s"Concrete ${normalizedName}", concr)

0 commit comments

Comments
 (0)