Skip to content

Commit d982038

Browse files
committed
Merge pull request #634 from dotty-staging/fix/refs-to-inner-objects
Refactorings for small style improvements.
2 parents c89e85c + 656dd51 commit d982038

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

src/dotty/tools/dotc/core/Denotations.scala

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -274,21 +274,31 @@ object Denotations {
274274
val sym1 = denot1.symbol
275275
val sym2 = denot2.symbol
276276
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)
281286
}
282-
/** Preference according to partial pre-order (isConcrete, unshadowed) */
287+
288+
/** Preference according to partial pre-order (isConcrete, precedes) */
283289
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+
285294
/** 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) =
287296
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
289299
else {
290300
val sym1Accessible = sym1.isAccessibleFrom(pre)
291-
if (sym1Accessible && prefer(info1, sym1, info2, sym2)) denot1
301+
if (sym1Accessible && prefer(sym1, sym2, info1, info2)) denot1
292302
else if (sym1Accessible && sym2.exists && !sym2Accessible) denot1
293303
else if (sym2Accessible && sym1.exists && !sym1Accessible) denot2
294304
else {

0 commit comments

Comments
 (0)