@@ -424,66 +424,52 @@ trait ModelFactoryImplicitSupport {
424
424
/* ========================= HELPER METHODS ========================== */
425
425
/**
426
426
* 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
428
428
* @param convs All the conversions the template takes part in
429
- * @param inTpl the ususal :)
429
+ * @param inTpl the usual :)
430
430
*/
431
- def makeShadowingTable (mbrs : List [MemberImpl ],
431
+ def makeShadowingTable (members : List [MemberImpl ],
432
432
convs : List [ImplicitConversionImpl ],
433
433
inTpl : DocTemplateImpl ): Map [MemberEntity , ImplicitMemberShadowing ] = {
434
434
assert(modelFinished)
435
435
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
+ }
437
441
438
442
for (conv <- convs) {
439
- val otherConvs = convs. filterNot(_ == conv)
443
+ val otherConvMembers : Map [ Name , List [ MemberImpl ]] = convs filterNot (_ == conv) flatMap (_.memberImpls) groupBy (_.sym.name )
440
444
441
445
for (member <- conv.memberImpls) {
442
- // for each member in our list
443
446
val sym1 = member.sym
444
447
val tpe1 = conv.toType.memberInfo(sym1)
445
448
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))
458
452
}
459
453
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
+ }
475
459
476
460
// 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
+ }
481
466
482
- shadowingTable += (member -> shadowing)
467
+ shadowingTable += (member -> shadowing)
468
+ }
483
469
}
484
470
}
485
471
486
- shadowingTable
472
+ shadowingTable.toMap
487
473
}
488
474
489
475
@@ -608,4 +594,4 @@ trait ModelFactoryImplicitSupport {
608
594
false
609
595
} else true // the member structure is different foo(3, 5) vs foo(3)(5)
610
596
}
611
- }
597
+ }
0 commit comments