diff options
author | Martin Odersky <odersky@gmail.com> | 2015-05-29 11:29:24 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-06-01 15:04:45 +0200 |
commit | 4f50e8fa5b48b5a931224d40b7c6fc0aed3da44b (patch) | |
tree | 8404038fb7206d11d87ee6969933043c15a846fc /src/dotty/tools/dotc/transform/Mixin.scala | |
parent | 31a7f6492729ad1ddf7f8e233a452a6ccd517af5 (diff) | |
download | dotty-4f50e8fa5b48b5a931224d40b7c6fc0aed3da44b.tar.gz dotty-4f50e8fa5b48b5a931224d40b7c6fc0aed3da44b.tar.bz2 dotty-4f50e8fa5b48b5a931224d40b7c6fc0aed3da44b.zip |
Avoid referring to initial$x methods when implementing Scala2 traits
They don't exist for Scala2 traits. Instead we let the initializer be `_'
and rely on trait setters (to be implemented) to initialize the field.
Diffstat (limited to 'src/dotty/tools/dotc/transform/Mixin.scala')
-rw-r--r-- | src/dotty/tools/dotc/transform/Mixin.scala | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/transform/Mixin.scala b/src/dotty/tools/dotc/transform/Mixin.scala index d2e7943f8..8f19faf68 100644 --- a/src/dotty/tools/dotc/transform/Mixin.scala +++ b/src/dotty/tools/dotc/transform/Mixin.scala @@ -14,6 +14,7 @@ import DenotTransformers._ import StdNames._ import NameOps._ import Phases._ +import ast.untpd import ast.Trees._ import collection.mutable @@ -150,16 +151,20 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform => ctx.atPhase(thisTransform) { implicit ctx => sym is Deferred } 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 - val rhs = transformFollowing(superRef(initializer(getter)).appliedToNone) + 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 } - if (isCurrent) transformFollowing(DefDef(implementation(getter.asTerm), rhs)) - else rhs + val isScala2x = mixin.is(Scala2x) + def default = Underscore(getter.info.resultType) + def initial = transformFollowing(superRef(initializer(getter)).appliedToNone) + if (isCurrent) + // transformFollowing call is needed to make memoize & lazy vals run + transformFollowing( + DefDef(implementation(getter.asTerm), if (isScala2x) default else initial)) + else if (isScala2x) EmptyTree + else initial } def setters(mixin: ClassSymbol): List[Tree] = |