diff options
author | Dmitry Petrashko <dark@d-d.me> | 2015-05-28 17:13:33 +0200 |
---|---|---|
committer | Dmitry Petrashko <dark@d-d.me> | 2015-05-28 17:13:33 +0200 |
commit | ef274600378cc55b78ad62ac9afc8ce9a21efb89 (patch) | |
tree | 203cb9cf0aebf03d86b73e96db92ea1647f6d089 /src | |
parent | c533f81750d66a7c99bfb24aafc56a738db064bf (diff) | |
parent | 7779b8fefa745e8b034bc33f46d21bd8599ac4a0 (diff) | |
download | dotty-ef274600378cc55b78ad62ac9afc8ce9a21efb89.tar.gz dotty-ef274600378cc55b78ad62ac9afc8ce9a21efb89.tar.bz2 dotty-ef274600378cc55b78ad62ac9afc8ce9a21efb89.zip |
Merge pull request #611 from dotty-staging/supercalls-traits-test
Add a test for supercalls in traits.
Diffstat (limited to 'src')
-rw-r--r-- | src/dotty/tools/dotc/core/TypeErasure.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/Memoize.scala | 6 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/Mixin.scala | 10 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/ResolveSuper.scala | 4 |
4 files changed, 14 insertions, 8 deletions
diff --git a/src/dotty/tools/dotc/core/TypeErasure.scala b/src/dotty/tools/dotc/core/TypeErasure.scala index 65bc5e57f..fac795ef8 100644 --- a/src/dotty/tools/dotc/core/TypeErasure.scala +++ b/src/dotty/tools/dotc/core/TypeErasure.scala @@ -164,7 +164,7 @@ object TypeErasure { else if (sym.isConstructor) outer.addParam(sym.owner.asClass, erase(tp)(erasureCtx)) else erase.eraseInfo(tp, sym)(erasureCtx) match { case einfo: MethodType if sym.isGetter && einfo.resultType.isRef(defn.UnitClass) => - defn.BoxedUnitClass.typeRef + MethodType(Nil, Nil, defn.BoxedUnitClass.typeRef) case einfo => einfo } diff --git a/src/dotty/tools/dotc/transform/Memoize.scala b/src/dotty/tools/dotc/transform/Memoize.scala index d96a52868..cbde1ef8a 100644 --- a/src/dotty/tools/dotc/transform/Memoize.scala +++ b/src/dotty/tools/dotc/transform/Memoize.scala @@ -50,15 +50,15 @@ import Decorators._ override def transformDefDef(tree: DefDef)(implicit ctx: Context, info: TransformerInfo): Tree = { val sym = tree.symbol - + def newField = ctx.newSymbol( owner = ctx.owner, name = sym.name.asTermName.fieldName, flags = Private | (if (sym is Stable) EmptyFlags else Mutable), info = sym.info.resultType, coord = tree.pos).enteredAfter(thisTransform) - - lazy val field = sym.field.orElse(newField).asTerm + + lazy val field = sym.field.orElse(newField).asTerm if (sym.is(Accessor, butNot = NoFieldNeeded)) if (sym.isGetter) { tree.rhs.changeOwnerAfter(sym, field, thisTransform) diff --git a/src/dotty/tools/dotc/transform/Mixin.scala b/src/dotty/tools/dotc/transform/Mixin.scala index 8470be2ef..d2e7943f8 100644 --- a/src/dotty/tools/dotc/transform/Mixin.scala +++ b/src/dotty/tools/dotc/transform/Mixin.scala @@ -152,8 +152,14 @@ 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 { - // transformFollowing call is needed to make memoize & lazy vals run - transformFollowing(DefDef(implementation(getter.asTerm), superRef(initializer(getter)).appliedToNone)) + // transformFollowing call is needed to make memoize & lazy vals run + val rhs = transformFollowing(superRef(initializer(getter)).appliedToNone) + // 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 + } + if (isCurrent) transformFollowing(DefDef(implementation(getter.asTerm), rhs)) + else rhs } def setters(mixin: ClassSymbol): List[Tree] = diff --git a/src/dotty/tools/dotc/transform/ResolveSuper.scala b/src/dotty/tools/dotc/transform/ResolveSuper.scala index 9c0e34256..0f1c448d9 100644 --- a/src/dotty/tools/dotc/transform/ResolveSuper.scala +++ b/src/dotty/tools/dotc/transform/ResolveSuper.scala @@ -83,7 +83,7 @@ class ResolveSuper extends MiniPhaseTransform with IdentityDenotTransformer { th def methodOverrides(mixin: ClassSymbol): List[Tree] = { def isOverridden(meth: Symbol) = meth.overridingSymbol(cls).is(Method, butNot = Deferred) def needsDisambiguation(meth: Symbol): Boolean = - meth.is(Method, butNot = PrivateOrDeferred) && + meth.is(Method, butNot = PrivateOrAccessorOrDeferred) && !isOverridden(meth) && !meth.allOverriddenSymbols.forall(_ is Deferred) for (meth <- mixin.info.decls.toList if needsDisambiguation(meth)) @@ -107,5 +107,5 @@ class ResolveSuper extends MiniPhaseTransform with IdentityDenotTransformer { th else ddef } - private val PrivateOrDeferred = Private | Deferred + private val PrivateOrAccessorOrDeferred = Private | Accessor | Deferred } |