diff options
author | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-06-15 15:32:58 +0200 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-06-15 15:32:58 +0200 |
commit | c4c29e393afb7175422053924b7e1e5a30131c4c (patch) | |
tree | 697dc40baf4a6093445b85b0df7fa2244331c399 | |
parent | 5c5145d944a772315bbc04aeaf77611dc0faebb6 (diff) | |
download | dotty-c4c29e393afb7175422053924b7e1e5a30131c4c.tar.gz dotty-c4c29e393afb7175422053924b7e1e5a30131c4c.tar.bz2 dotty-c4c29e393afb7175422053924b7e1e5a30131c4c.zip |
Mixin: implementations of Scala2 LazyVals need a rhs.
Unlike normal fields, they aren't initialised in $init method, and need to know a bit about class layout of implementation class.
Luckily AugmentScala2Traits added just enough symbols to make this work.
-rw-r--r-- | src/dotty/tools/dotc/transform/Mixin.scala | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/transform/Mixin.scala b/src/dotty/tools/dotc/transform/Mixin.scala index 63e680414..b1291ecf4 100644 --- a/src/dotty/tools/dotc/transform/Mixin.scala +++ b/src/dotty/tools/dotc/transform/Mixin.scala @@ -163,7 +163,13 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform => if (isCurrent(getter) || getter.is(ExpandedName)) // transformFollowing call is needed to make memoize & lazy vals run transformFollowing( - DefDef(implementation(getter.asTerm), if (isScala2x) default else initial)) + DefDef(implementation(getter.asTerm), + if (isScala2x) { + if (getter.is(Flags.Lazy)) // lazy vals need to have a rhs that will be the lazy initializer + ref(mixin.implClass).select(getter.name).appliedTo(This(ctx.owner.asClass)) + else default + } else initial) + ) else if (isScala2x) EmptyTree else initial } |