diff options
author | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-08-21 14:17:16 +0200 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-08-21 14:19:44 +0200 |
commit | ee5639a8d90538c162f41cbb6d88007462311863 (patch) | |
tree | fc762f2c2c63e41006139c21dcf00780a1e630cb | |
parent | eec8191fc067358f88bec56d7dbda36e1fcfc131 (diff) | |
download | dotty-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.scala | 6 |
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 |