diff options
author | Martin Odersky <odersky@gmail.com> | 2015-05-29 11:13:08 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-06-01 15:04:43 +0200 |
commit | 9a167ded3bdecc16eb9636fc3f1b58d3405e2248 (patch) | |
tree | 71f8d670b2c455e9ee12842a1e0d39efac9a0448 /src/dotty/tools/dotc/transform/MixinOps.scala | |
parent | 11848a8c620be514ea43ea4383ca2b91a1aa8627 (diff) | |
download | dotty-9a167ded3bdecc16eb9636fc3f1b58d3405e2248.tar.gz dotty-9a167ded3bdecc16eb9636fc3f1b58d3405e2248.tar.bz2 dotty-9a167ded3bdecc16eb9636fc3f1b58d3405e2248.zip |
Move needsForwarder logic from ResolveSuper to MixinOps.
We'd like to make it reusable for a phase that treats Scala2 traits.
Diffstat (limited to 'src/dotty/tools/dotc/transform/MixinOps.scala')
-rw-r--r-- | src/dotty/tools/dotc/transform/MixinOps.scala | 11 |
1 files changed, 11 insertions, 0 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) } |