@@ -305,6 +305,14 @@ object Denotations {
305
305
! sym2.derivesFrom(sym1) && precedesIn(pre.baseClasses))
306
306
}
307
307
308
+ /** Similar to SymDenotation#accessBoundary, but without the special cases. */
309
+ def accessBoundary (sym : Symbol ) =
310
+ if (sym.is(Private )) sym.owner
311
+ else sym.privateWithin.orElse(
312
+ if (sym.is(Protected )) sym.owner.enclosingPackageClass
313
+ else defn.RootClass
314
+ )
315
+
308
316
/** Establish a partial order "preference" order between symbols.
309
317
* Give preference to `sym1` over `sym2` if one of the following
310
318
* conditions holds, in decreasing order of weight:
@@ -324,8 +332,7 @@ object Denotations {
324
332
sym1.isAsConcrete(sym2) &&
325
333
(! sym2.isAsConcrete(sym1) ||
326
334
precedes(sym1.owner, sym2.owner) ||
327
- sym2.accessBoundary(sym2.enclosingPackageClass)
328
- .isProperlyContainedIn(sym1.accessBoundary(sym1.enclosingPackageClass)) ||
335
+ accessBoundary(sym2).isProperlyContainedIn(accessBoundary(sym1)) ||
329
336
sym1.is(Method ) && ! sym2.is(Method ))
330
337
331
338
/** Sym preference provided types also override */
@@ -338,7 +345,11 @@ object Denotations {
338
345
if (sym1Accessible && prefer(sym1, sym2, info1, info2)) denot1
339
346
else if (sym1Accessible && sym2.exists && ! sym2Accessible) denot1
340
347
else if (sym2Accessible && sym1.exists && ! sym1Accessible) denot2
341
- else if (isDoubleDef(sym1, sym2)) doubleDefError(denot1, denot2, pre)
348
+ else if (isDoubleDef(sym1, sym2)) {
349
+ if (preferSym(sym1, sym2)) denot1
350
+ else if (preferSym(sym2, sym1)) denot2
351
+ else doubleDefError(denot1, denot2, pre)
352
+ }
342
353
else {
343
354
val sym =
344
355
if (! sym1.exists) sym2
0 commit comments