aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Denotations.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-06-08 07:31:50 +0200
committerMartin Odersky <odersky@gmail.com>2015-06-08 07:42:54 +0200
commit656dd5122ffd10cebd37aa274156aece2bc03678 (patch)
tree7a547263e1a5db460ba20d52e69000b1bb97f081 /src/dotty/tools/dotc/core/Denotations.scala
parent4c659a31e658a661af44d07bdc003d0ecbf86c3b (diff)
downloaddotty-656dd5122ffd10cebd37aa274156aece2bc03678.tar.gz
dotty-656dd5122ffd10cebd37aa274156aece2bc03678.tar.bz2
dotty-656dd5122ffd10cebd37aa274156aece2bc03678.zip
Refactorings for small style improvements.
Diffstat (limited to 'src/dotty/tools/dotc/core/Denotations.scala')
-rw-r--r--src/dotty/tools/dotc/core/Denotations.scala28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/dotty/tools/dotc/core/Denotations.scala b/src/dotty/tools/dotc/core/Denotations.scala
index 9cbac9115..70ca88702 100644
--- a/src/dotty/tools/dotc/core/Denotations.scala
+++ b/src/dotty/tools/dotc/core/Denotations.scala
@@ -274,21 +274,31 @@ object Denotations {
val sym1 = denot1.symbol
val sym2 = denot2.symbol
val sym2Accessible = sym2.isAccessibleFrom(pre)
- def unshadowed(sym: Symbol, from: Symbol) = {
- val symOwner = sym.owner
- val fromOwner = from.owner
- !fromOwner.derivesFrom(symOwner) || fromOwner.eq(symOwner)
+
+ /** Does `sym1` come before `sym2` in the linearization of `pre`? */
+ def precedes(sym1: Symbol, sym2: Symbol) = {
+ def precedesIn(bcs: List[ClassSymbol]): Boolean = bcs match {
+ case bc :: bcs1 => (sym1 eq bc) || !(sym2 eq bc) && precedesIn(bcs1)
+ case Nil => true
+ }
+ sym1.derivesFrom(sym2) ||
+ !sym2.derivesFrom(sym1) && precedesIn(pre.baseClasses)
}
- /** Preference according to partial pre-order (isConcrete, unshadowed) */
+
+ /** Preference according to partial pre-order (isConcrete, precedes) */
def preferSym(sym1: Symbol, sym2: Symbol) =
- sym1.isAsConcrete(sym2) && (!sym2.isAsConcrete(sym1) || unshadowed(sym1, sym2))
+ sym1.eq(sym2) ||
+ sym1.isAsConcrete(sym2) &&
+ (!sym2.isAsConcrete(sym1) || precedes(sym1.owner, sym2.owner))
+
/** Sym preference provided types also override */
- def prefer(info1: Type, sym1: Symbol, info2: Type, sym2: Symbol) =
+ def prefer(sym1: Symbol, sym2: Symbol, info1: Type, info2: Type) =
preferSym(sym1, sym2) && info1.overrides(info2)
- if (sym2Accessible && prefer(info2, sym2, info1, sym1)) denot2
+
+ if (sym2Accessible && prefer(sym2, sym1, info2, info1)) denot2
else {
val sym1Accessible = sym1.isAccessibleFrom(pre)
- if (sym1Accessible && prefer(info1, sym1, info2, sym2)) denot1
+ if (sym1Accessible && prefer(sym1, sym2, info1, info2)) denot1
else if (sym1Accessible && sym2.exists && !sym2Accessible) denot1
else if (sym2Accessible && sym1.exists && !sym1Accessible) denot2
else {