Skip to content

Commit b52c1ab

Browse files
committed
Move needsForwarder logic from ResolveSuper to MixinOps.
We'd like to make it reusable for a phase that treats Scala2 traits.
1 parent 7b94028 commit b52c1ab

File tree

2 files changed

+13
-8
lines changed

2 files changed

+13
-8
lines changed

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

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

34+
def needsForwarder(meth: Symbol): Boolean = {
35+
def needsDisambiguation = !meth.allOverriddenSymbols.forall(_ is Deferred)
36+
def isOverridden = meth.overridingSymbol(cls).is(Method, butNot = Deferred)
37+
meth.is(Method, butNot = PrivateOrAccessorOrDeferred) &&
38+
!isOverridden &&
39+
!meth.isConstructor &&
40+
(needsDisambiguation/* || meth.owner.is(Scala2x)*/)
41+
}
42+
43+
final val PrivateOrAccessorOrDeferred = Private | Accessor | Deferred
44+
3445
def forwarder(target: Symbol) = (targs: List[Type]) => (vrefss: List[List[Tree]]) =>
3546
superRef(target).appliedToTypes(targs).appliedToArgss(vrefss)
3647
}

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,9 @@ class ResolveSuper extends MiniPhaseTransform with IdentityDenotTransformer { th
8080
for (superAcc <- mixin.info.decls.filter(_ is SuperAccessor).toList)
8181
yield polyDefDef(implementation(superAcc.asTerm), forwarder(rebindSuper(cls, superAcc)))
8282

83-
def methodOverrides(mixin: ClassSymbol): List[Tree] = {
84-
def isOverridden(meth: Symbol) = meth.overridingSymbol(cls).is(Method, butNot = Deferred)
85-
def needsDisambiguation(meth: Symbol): Boolean =
86-
meth.is(Method, butNot = PrivateOrAccessorOrDeferred) &&
87-
!isOverridden(meth) &&
88-
!meth.allOverriddenSymbols.forall(_ is Deferred)
89-
for (meth <- mixin.info.decls.toList if needsDisambiguation(meth))
83+
def methodOverrides(mixin: ClassSymbol): List[Tree] =
84+
for (meth <- mixin.info.decls.toList if needsForwarder(meth))
9085
yield polyDefDef(implementation(meth.asTerm), forwarder(meth))
91-
}
9286

9387
val overrides = mixins.flatMap(mixin => superAccessors(mixin) ::: methodOverrides(mixin))
9488

0 commit comments

Comments
 (0)