aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Petrashko <dmitry.petrashko@gmail.com>2015-06-15 15:32:58 +0200
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-06-15 15:32:58 +0200
commitc4c29e393afb7175422053924b7e1e5a30131c4c (patch)
tree697dc40baf4a6093445b85b0df7fa2244331c399
parent5c5145d944a772315bbc04aeaf77611dc0faebb6 (diff)
downloaddotty-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.scala8
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
}