1
1
package dotty .tools .dotc
2
2
package transform
3
3
4
+ import dotty .tools .dotc .typer .Mode
5
+
4
6
import scala .collection .mutable
5
7
import core ._
6
8
import Contexts ._
@@ -22,6 +24,7 @@ import dotty.tools.dotc.core.SymDenotations.SymDenotation
22
24
import dotty .tools .dotc .core .DenotTransformers .{SymTransformer , IdentityDenotTransformer , DenotTransformer }
23
25
24
26
class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
27
+ import LazyVals ._
25
28
26
29
import tpd ._
27
30
@@ -44,24 +47,15 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
44
47
override def runsAfter = Set (classOf [Mixin ])
45
48
46
49
override def transformDefDef (tree : DefDef )(implicit ctx : Context , info : TransformerInfo ): Tree = {
47
- if (! (tree.symbol is Flags .Lazy )) tree
50
+ if (! (tree.symbol is Flags .Lazy ) || tree.symbol.owner.is( Flags . Trait ) ) tree
48
51
else {
49
- if (tree.symbol is Flags .Module ) {
50
- val field = ctx.newSymbol(tree.symbol.owner, tree.symbol.name ++ StdNames .nme.MODULE_VAR_SUFFIX , containerFlags, tree.symbol.info.resultType, coord = tree.symbol.pos)
51
- val getter =
52
- tpd.DefDef (tree.symbol.asTerm, tpd.This (tree.symbol.enclosingClass.asClass).select(defn.Object_synchronized ).appliedTo(
53
- mkDefNonThreadSafeNonNullable(field, tree.rhs).ensureConforms(tree.tpe.widen.resultType.widen)).ensureConforms(tree.tpe.widen.resultType.widen))
54
- val fieldVal = tpd.ValDef (field.asTerm, initValue(field.info.widen))
55
- Thicket (fieldVal, getter)
56
- } else {
57
52
val isField = tree.symbol.owner.isClass
58
53
59
54
if (isField) {
60
- if (tree.symbol.isVolatile) transformFieldValDefVolatile(tree)
55
+ if (tree.symbol.isVolatile || tree.symbol.is( Flags . Module ) ) transformFieldValDefVolatile(tree)
61
56
else transformFieldValDefNonVolatile(tree)
62
57
}
63
58
else transformLocalValDef(tree)
64
- }
65
59
}
66
60
}
67
61
@@ -279,8 +273,8 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
279
273
val cases = Match (stateMask.appliedTo(ref(flagSymbol), Literal (Constant (ord))),
280
274
List (compute, waitFirst, waitSecond, computed, default)) // todo: annotate with @switch
281
275
282
- val whileBody = Block ( List (ref(flagSymbol).becomes(getFlag.appliedTo(thiz, offset) )), cases)
283
- val cycle = untpd. WhileDo (whileCond, whileBody).withTypeUnchecked(defn. UnitType )
276
+ val whileBody = List (ref(flagSymbol).becomes(getFlag.appliedTo(thiz, offset)), cases)
277
+ val cycle = WhileDo (methodSymbol, whileCond, whileBody)
284
278
DefDef (methodSymbol, Block (resultDef :: retryDef :: flagDef :: cycle :: Nil , ref(resultSymbol)))
285
279
}
286
280
0 commit comments