Skip to content

Commit 0a0d3dd

Browse files
committed
More precise and uniform modelling of "isCurrent"
For implemented getters and forwarded methods we need a notion of "isCurrent", which means: would the getter or method before the implementation is added be a member of the implementing class? Only in this case do we need to do anything. The method formulation was previously weaker than the getter formulation, which led to an error when compiling core (duplicate methods: andThen and size).
1 parent 5aaa406 commit 0a0d3dd

File tree

2 files changed

+5
-8
lines changed

2 files changed

+5
-8
lines changed

src/dotty/tools/dotc/transform/Mixin.scala

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,10 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
157157

158158
def traitInits(mixin: ClassSymbol): List[Tree] =
159159
for (getter <- mixin.info.decls.filter(getr => getr.isGetter && !wasDeferred(getr)).toList) yield {
160-
// isCurrent: getter is a member of implementing class
161-
val isCurrent = getter.is(ExpandedName) || ctx.atPhase(thisTransform) { implicit ctx =>
162-
cls.info.member(getter.name).suchThat(_.isGetter).symbol == getter
163-
}
164160
val isScala2x = mixin.is(Scala2x)
165161
def default = Underscore(getter.info.resultType)
166162
def initial = transformFollowing(superRef(initializer(getter)).appliedToNone)
167-
if (isCurrent)
163+
if (isCurrent(getter) || getter.is(ExpandedName))
168164
// transformFollowing call is needed to make memoize & lazy vals run
169165
transformFollowing(
170166
DefDef(implementation(getter.asTerm), if (isScala2x) default else initial))

src/dotty/tools/dotc/transform/MixinOps.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@ class MixinOps(cls: ClassSymbol, thisTransform: DenotTransformer)(implicit ctx:
3131
//sup.select(target)
3232
}
3333

34+
/** Is `sym` a member of implementing class `cls`? */
35+
def isCurrent(sym: Symbol) = cls.info.member(sym.name).hasAltWith(_.symbol == sym)
36+
3437
def needsForwarder(meth: Symbol): Boolean = {
3538
def needsDisambiguation = !meth.allOverriddenSymbols.forall(_ is Deferred)
36-
def isOverridden = meth.overridingSymbol(cls).is(Method, butNot = Deferred)
3739
meth.is(Method, butNot = PrivateOrAccessorOrDeferred) &&
38-
!isOverridden &&
39-
!meth.isConstructor &&
40+
isCurrent(meth) &&
4041
(needsDisambiguation || meth.owner.is(Scala2x))
4142
}
4243

0 commit comments

Comments
 (0)