@@ -274,21 +274,31 @@ object Denotations {
274
274
val sym1 = denot1.symbol
275
275
val sym2 = denot2.symbol
276
276
val sym2Accessible = sym2.isAccessibleFrom(pre)
277
- def unshadowed (sym : Symbol , from : Symbol ) = {
278
- val symOwner = sym.owner
279
- val fromOwner = from.owner
280
- ! fromOwner.derivesFrom(symOwner) || fromOwner.eq(symOwner)
277
+
278
+ /** Does `sym1` come before `sym2` in the linearization of `pre`? */
279
+ def precedes (sym1 : Symbol , sym2 : Symbol ) = {
280
+ def precedesIn (bcs : List [ClassSymbol ]): Boolean = bcs match {
281
+ case bc :: bcs1 => (sym1 eq bc) || ! (sym2 eq bc) && precedesIn(bcs1)
282
+ case Nil => true
283
+ }
284
+ sym1.derivesFrom(sym2) ||
285
+ ! sym2.derivesFrom(sym1) && precedesIn(pre.baseClasses)
281
286
}
282
- /** Preference according to partial pre-order (isConcrete, unshadowed) */
287
+
288
+ /** Preference according to partial pre-order (isConcrete, precedes) */
283
289
def preferSym (sym1 : Symbol , sym2 : Symbol ) =
284
- sym1.isAsConcrete(sym2) && (! sym2.isAsConcrete(sym1) || unshadowed(sym1, sym2))
290
+ sym1.eq(sym2) ||
291
+ sym1.isAsConcrete(sym2) &&
292
+ (! sym2.isAsConcrete(sym1) || precedes(sym1.owner, sym2.owner))
293
+
285
294
/** Sym preference provided types also override */
286
- def prefer (info1 : Type , sym1 : Symbol , info2 : Type , sym2 : Symbol ) =
295
+ def prefer (sym1 : Symbol , sym2 : Symbol , info1 : Type , info2 : Type ) =
287
296
preferSym(sym1, sym2) && info1.overrides(info2)
288
- if (sym2Accessible && prefer(info2, sym2, info1, sym1)) denot2
297
+
298
+ if (sym2Accessible && prefer(sym2, sym1, info2, info1)) denot2
289
299
else {
290
300
val sym1Accessible = sym1.isAccessibleFrom(pre)
291
- if (sym1Accessible && prefer(info1, sym1, info2, sym2 )) denot1
301
+ if (sym1Accessible && prefer(sym1, sym2, info1, info2 )) denot1
292
302
else if (sym1Accessible && sym2.exists && ! sym2Accessible) denot1
293
303
else if (sym2Accessible && sym1.exists && ! sym1Accessible) denot2
294
304
else {
0 commit comments