@@ -34,7 +34,7 @@ object OverridingPairs {
34
34
* pair has already been treated in a parent class.
35
35
* This may be refined in subclasses. @see Bridges for a use case.
36
36
*/
37
- protected def parents : Array [Symbol ] = base.info.parents.toArray.map(_.typeSymbol )
37
+ protected def parents : Array [Symbol ] = base.info.parents.toArray.map(_.classSymbol )
38
38
39
39
/** Does `sym1` match `sym2` so that it qualifies as overriding when both symbols are
40
40
* seen as members of `self`? Types always match. Term symbols match if their membertypes
@@ -92,13 +92,22 @@ object OverridingPairs {
92
92
private def isHandledByParent (sym1 : Symbol , sym2 : Symbol ): Boolean =
93
93
val commonParents = subParents(sym1.owner).intersect(subParents(sym2.owner))
94
94
commonParents.nonEmpty
95
- && commonParents.exists(i => canBeHandledByParent(sym1, sym2, parents(i).thisType ))
95
+ && commonParents.exists(i => canBeHandledByParent(sym1, sym2, parents(i)))
96
96
97
97
/** Can pair `sym1`/`sym2` be handled by parent `parentType` which is a common subtype
98
98
* of both symbol's owners? Assumed to be true by default, but overridden in RefChecks.
99
99
*/
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)
102
111
103
112
/** The scope entries that have already been visited as overridden
104
113
* (maybe excluded because of already handled by a parent).
0 commit comments