@@ -34,7 +34,7 @@ object OverridingPairs {
3434 * pair has already been treated in a parent class.
3535 * This may be refined in subclasses. @see Bridges for a use case.
3636 */
37- protected def parents : Array [Symbol ] = base.info.parents.toArray.map(_.typeSymbol )
37+ protected def parents : Array [Symbol ] = base.info.parents.toArray.map(_.classSymbol )
3838
3939 /** Does `sym1` match `sym2` so that it qualifies as overriding when both symbols are
4040 * seen as members of `self`? Types always match. Term symbols match if their membertypes
@@ -92,13 +92,22 @@ object OverridingPairs {
9292 private def isHandledByParent (sym1 : Symbol , sym2 : Symbol ): Boolean =
9393 val commonParents = subParents(sym1.owner).intersect(subParents(sym2.owner))
9494 commonParents.nonEmpty
95- && commonParents.exists(i => canBeHandledByParent(sym1, sym2, parents(i).thisType ))
95+ && commonParents.exists(i => canBeHandledByParent(sym1, sym2, parents(i)))
9696
9797 /** Can pair `sym1`/`sym2` be handled by parent `parentType` which is a common subtype
9898 * of both symbol's owners? Assumed to be true by default, but overridden in RefChecks.
9999 */
100- protected def canBeHandledByParent (sym1 : Symbol , sym2 : Symbol , parentType : Type ): Boolean =
101- true
100+ protected def canBeHandledByParent (sym1 : Symbol , sym2 : Symbol , parent : Symbol ): Boolean =
101+ val owner1 = sym1.owner
102+ val owner2 = sym2.owner
103+ def precedesIn (bcs : List [ClassSymbol ]): Boolean = (bcs : @ unchecked) match
104+ case bc :: bcs1 =>
105+ if owner1 eq bc then true
106+ else if owner2 eq bc then false
107+ else precedesIn(bcs1)
108+ case _ =>
109+ false
110+ precedesIn(parent.asClass.baseClasses)
102111
103112 /** The scope entries that have already been visited as overridden
104113 * (maybe excluded because of already handled by a parent).
0 commit comments