aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/dotty/tools')
-rw-r--r--src/dotty/tools/dotc/transform/Mixin.scala6
-rw-r--r--src/dotty/tools/dotc/transform/MixinOps.scala7
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))
}