Skip to content

Commit 4a04725

Browse files
committed
Cleanup makeShadowingTable, save some memory. Review by @VladUreche or @heathermiller.
1 parent 861fac8 commit 4a04725

File tree

1 file changed

+26
-40
lines changed

1 file changed

+26
-40
lines changed

src/compiler/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala

Lines changed: 26 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -424,66 +424,52 @@ trait ModelFactoryImplicitSupport {
424424
/* ========================= HELPER METHODS ========================== */
425425
/**
426426
* Computes the shadowing table for all the members in the implicit conversions
427-
* @param mbrs All template's members, including usecases and full signature members
427+
* @param members All template's members, including usecases and full signature members
428428
* @param convs All the conversions the template takes part in
429-
* @param inTpl the ususal :)
429+
* @param inTpl the usual :)
430430
*/
431-
def makeShadowingTable(mbrs: List[MemberImpl],
431+
def makeShadowingTable(members: List[MemberImpl],
432432
convs: List[ImplicitConversionImpl],
433433
inTpl: DocTemplateImpl): Map[MemberEntity, ImplicitMemberShadowing] = {
434434
assert(modelFinished)
435435

436-
var shadowingTable = Map[MemberEntity, ImplicitMemberShadowing]()
436+
val shadowingTable = mutable.Map[MemberEntity, ImplicitMemberShadowing]()
437+
val membersByName: Map[Name, List[MemberImpl]] = members.groupBy(_.sym.name)
438+
val convsByMember = (Map.empty[MemberImpl, ImplicitConversionImpl] /: convs) {
439+
case (map, conv) => map ++ conv.memberImpls.map (_ -> conv)
440+
}
437441

438442
for (conv <- convs) {
439-
val otherConvs = convs.filterNot(_ == conv)
443+
val otherConvMembers: Map[Name, List[MemberImpl]] = convs filterNot (_ == conv) flatMap (_.memberImpls) groupBy (_.sym.name)
440444

441445
for (member <- conv.memberImpls) {
442-
// for each member in our list
443446
val sym1 = member.sym
444447
val tpe1 = conv.toType.memberInfo(sym1)
445448

446-
// check if it's shadowed by a member in the original class
447-
var shadowedBySyms: List[Symbol] = List()
448-
for (mbr <- mbrs) {
449-
val sym2 = mbr.sym
450-
if (sym1.name == sym2.name) {
451-
val shadowed = !settings.docImplicitsSoundShadowing.value || {
452-
val tpe2 = inTpl.sym.info.memberInfo(sym2)
453-
!isDistinguishableFrom(tpe1, tpe2)
454-
}
455-
if (shadowed)
456-
shadowedBySyms ::= sym2
457-
}
449+
// check if it's shadowed by a member in the original class.
450+
val shadowed = membersByName.get(sym1.name).toList.flatten filter { other =>
451+
!settings.docImplicitsSoundShadowing.value || !isDistinguishableFrom(tpe1, inTpl.sym.info.memberInfo(other.sym))
458452
}
459453

460-
val shadowedByMembers = mbrs.filter((mb: MemberImpl) => shadowedBySyms.contains(mb.sym))
461-
462-
// check if it's shadowed by another member
463-
var ambiguousByMembers: List[MemberEntity] = List()
464-
for (conv <- otherConvs)
465-
for (member2 <- conv.memberImpls) {
466-
val sym2 = member2.sym
467-
if (sym1.name == sym2.name) {
468-
val tpe2 = conv.toType.memberInfo(sym2)
469-
// Ambiguity should be an equivalence relation
470-
val ambiguated = !isDistinguishableFrom(tpe1, tpe2) || !isDistinguishableFrom(tpe2, tpe1)
471-
if (ambiguated)
472-
ambiguousByMembers ::= member2
473-
}
474-
}
454+
// check if it's shadowed by another conversion.
455+
val ambiguous = otherConvMembers.get(sym1.name).toList.flatten filter { other =>
456+
val tpe2 = convsByMember(other).toType.memberInfo(other.sym)
457+
!isDistinguishableFrom(tpe1, tpe2) || !isDistinguishableFrom(tpe2, tpe1)
458+
}
475459

476460
// we finally have the shadowing info
477-
val shadowing = new ImplicitMemberShadowing {
478-
def shadowingMembers: List[MemberEntity] = shadowedByMembers
479-
def ambiguatingMembers: List[MemberEntity] = ambiguousByMembers
480-
}
461+
if (!shadowed.isEmpty || !ambiguous.isEmpty) {
462+
val shadowing = new ImplicitMemberShadowing {
463+
def shadowingMembers: List[MemberEntity] = shadowed
464+
def ambiguatingMembers: List[MemberEntity] = ambiguous
465+
}
481466

482-
shadowingTable += (member -> shadowing)
467+
shadowingTable += (member -> shadowing)
468+
}
483469
}
484470
}
485471

486-
shadowingTable
472+
shadowingTable.toMap
487473
}
488474

489475

@@ -608,4 +594,4 @@ trait ModelFactoryImplicitSupport {
608594
false
609595
} else true // the member structure is different foo(3, 5) vs foo(3)(5)
610596
}
611-
}
597+
}

0 commit comments

Comments
 (0)