@@ -303,32 +303,47 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext
303
303
groupBody :: Nil
304
304
305
305
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
+ }
309
320
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
+ }
313
325
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
+ }
317
330
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
+ }
321
335
322
336
private type SubGroup = (String , Seq [Member | MGroup ])
323
337
private def buildGroup (name : String , subgroups : Seq [SubGroup ]): Tab =
324
338
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
+
329
344
val normalizedName = name.toLowerCase
330
345
val definedWithGroup = if Set (" methods" , " fields" ).contains(normalizedName) then
331
- val (abstr, concr) = defined.partition(isAbstract )
346
+ val (abstr, concr) = splitAbstract(defined )
332
347
Seq (
333
348
actualGroup(s " Abstract ${normalizedName}" , abstr),
334
349
actualGroup(s " Concrete ${normalizedName}" , concr)
0 commit comments