aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Petrashko <dmitry.petrashko@gmail.com>2015-08-21 14:17:16 +0200
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-08-21 14:19:44 +0200
commitee5639a8d90538c162f41cbb6d88007462311863 (patch)
treefc762f2c2c63e41006139c21dcf00780a1e630cb
parenteec8191fc067358f88bec56d7dbda36e1fcfc131 (diff)
downloaddotty-ee5639a8d90538c162f41cbb6d88007462311863.tar.gz
dotty-ee5639a8d90538c162f41cbb6d88007462311863.tar.bz2
dotty-ee5639a8d90538c162f41cbb6d88007462311863.zip
Mixin: class defined abstract members take precedence over interface defined.
In case we have an class-defined abstract member implemented by a trait we need to create an explicit forwarder.
-rw-r--r--src/dotty/tools/dotc/transform/MixinOps.scala6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/transform/MixinOps.scala b/src/dotty/tools/dotc/transform/MixinOps.scala
index 3685a00fc..f56c83f96 100644
--- a/src/dotty/tools/dotc/transform/MixinOps.scala
+++ b/src/dotty/tools/dotc/transform/MixinOps.scala
@@ -38,10 +38,12 @@ class MixinOps(cls: ClassSymbol, thisTransform: DenotTransformer)(implicit ctx:
def isCurrent(sym: Symbol) = cls.info.member(sym.name).hasAltWith(_.symbol == sym)
def needsForwarder(meth: Symbol): Boolean = {
- def needsDisambiguation = !meth.allOverriddenSymbols.forall(_ is Deferred)
+ lazy val overridenSymbols = meth.allOverriddenSymbols
+ def needsDisambiguation = !overridenSymbols.forall(_ is Deferred)
+ def hasNonInterfaceDefinition = overridenSymbols.forall(!_.owner.is(Trait))
meth.is(Method, butNot = PrivateOrAccessorOrDeferred) &&
isCurrent(meth) &&
- (needsDisambiguation || meth.owner.is(Scala2x))
+ (needsDisambiguation || hasNonInterfaceDefinition || meth.owner.is(Scala2x))
}
final val PrivateOrAccessorOrDeferred = Private | Accessor | Deferred