diff options
-rw-r--r-- | src/dotty/tools/dotc/transform/MixinOps.scala | 11 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/ResolveSuper.scala | 10 |
2 files changed, 13 insertions, 8 deletions
diff --git a/src/dotty/tools/dotc/transform/MixinOps.scala b/src/dotty/tools/dotc/transform/MixinOps.scala index 1dce85eaa..57c6bd93a 100644 --- a/src/dotty/tools/dotc/transform/MixinOps.scala +++ b/src/dotty/tools/dotc/transform/MixinOps.scala @@ -31,6 +31,17 @@ class MixinOps(cls: ClassSymbol, thisTransform: DenotTransformer)(implicit ctx: //sup.select(target) } + def needsForwarder(meth: Symbol): Boolean = { + def needsDisambiguation = !meth.allOverriddenSymbols.forall(_ is Deferred) + def isOverridden = meth.overridingSymbol(cls).is(Method, butNot = Deferred) + meth.is(Method, butNot = PrivateOrAccessorOrDeferred) && + !isOverridden && + !meth.isConstructor && + (needsDisambiguation/* || meth.owner.is(Scala2x)*/) + } + + final val PrivateOrAccessorOrDeferred = Private | Accessor | Deferred + def forwarder(target: Symbol) = (targs: List[Type]) => (vrefss: List[List[Tree]]) => superRef(target).appliedToTypes(targs).appliedToArgss(vrefss) } diff --git a/src/dotty/tools/dotc/transform/ResolveSuper.scala b/src/dotty/tools/dotc/transform/ResolveSuper.scala index 0f1c448d9..d23e81ab3 100644 --- a/src/dotty/tools/dotc/transform/ResolveSuper.scala +++ b/src/dotty/tools/dotc/transform/ResolveSuper.scala @@ -80,15 +80,9 @@ class ResolveSuper extends MiniPhaseTransform with IdentityDenotTransformer { th for (superAcc <- mixin.info.decls.filter(_ is SuperAccessor).toList) yield polyDefDef(implementation(superAcc.asTerm), forwarder(rebindSuper(cls, superAcc))) - def methodOverrides(mixin: ClassSymbol): List[Tree] = { - def isOverridden(meth: Symbol) = meth.overridingSymbol(cls).is(Method, butNot = Deferred) - def needsDisambiguation(meth: Symbol): Boolean = - meth.is(Method, butNot = PrivateOrAccessorOrDeferred) && - !isOverridden(meth) && - !meth.allOverriddenSymbols.forall(_ is Deferred) - for (meth <- mixin.info.decls.toList if needsDisambiguation(meth)) + def methodOverrides(mixin: ClassSymbol): List[Tree] = + for (meth <- mixin.info.decls.toList if needsForwarder(meth)) yield polyDefDef(implementation(meth.asTerm), forwarder(meth)) - } val overrides = mixins.flatMap(mixin => superAccessors(mixin) ::: methodOverrides(mixin)) |