diff options
Diffstat (limited to 'src/dotty')
-rw-r--r-- | src/dotty/tools/dotc/transform/Mixin.scala | 6 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/MixinOps.scala | 7 |
2 files changed, 5 insertions, 8 deletions
diff --git a/src/dotty/tools/dotc/transform/Mixin.scala b/src/dotty/tools/dotc/transform/Mixin.scala index e3215cf6d..63e680414 100644 --- a/src/dotty/tools/dotc/transform/Mixin.scala +++ b/src/dotty/tools/dotc/transform/Mixin.scala @@ -157,14 +157,10 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform => def traitInits(mixin: ClassSymbol): List[Tree] = for (getter <- mixin.info.decls.filter(getr => getr.isGetter && !wasDeferred(getr)).toList) yield { - // isCurrent: getter is a member of implementing class - val isCurrent = getter.is(ExpandedName) || ctx.atPhase(thisTransform) { implicit ctx => - cls.info.member(getter.name).suchThat(_.isGetter).symbol == getter - } val isScala2x = mixin.is(Scala2x) def default = Underscore(getter.info.resultType) def initial = transformFollowing(superRef(initializer(getter)).appliedToNone) - if (isCurrent) + if (isCurrent(getter) || getter.is(ExpandedName)) // transformFollowing call is needed to make memoize & lazy vals run transformFollowing( DefDef(implementation(getter.asTerm), if (isScala2x) default else initial)) diff --git a/src/dotty/tools/dotc/transform/MixinOps.scala b/src/dotty/tools/dotc/transform/MixinOps.scala index c21c98017..64f0edfb8 100644 --- a/src/dotty/tools/dotc/transform/MixinOps.scala +++ b/src/dotty/tools/dotc/transform/MixinOps.scala @@ -31,12 +31,13 @@ class MixinOps(cls: ClassSymbol, thisTransform: DenotTransformer)(implicit ctx: //sup.select(target) } + /** Is `sym` a member of implementing class `cls`? */ + def isCurrent(sym: Symbol) = cls.info.member(sym.name).hasAltWith(_.symbol == sym) + 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 && + isCurrent(meth) && (needsDisambiguation || meth.owner.is(Scala2x)) } |