@@ -33,9 +33,6 @@ object Trees {
33
33
/** Property key for trees with documentation strings attached */
34
34
val DocComment : Property .StickyKey [Comments .Comment ] = new Property .StickyKey
35
35
36
- type LazyTree = AnyRef /* really: Tree | Lazy[Tree] */
37
- type LazyTreeList = AnyRef /* really: List[Tree] | Lazy[List[Tree]] */
38
-
39
36
/** Trees take a parameter indicating what the type of their `tpe` field
40
37
* is. Two choices: `Type` or `Untyped`.
41
38
* Untyped trees have type `Tree[Untyped]`.
@@ -236,6 +233,9 @@ object Trees {
236
233
override def getMessage : String = s " type of $tree is not assigned "
237
234
}
238
235
236
+ type LazyTree [- T >: Untyped ] = Tree [T ] | Lazy [Tree [T ]]
237
+ type LazyTreeList [- T >: Untyped ] = List [Tree [T ]] | Lazy [List [Tree [T ]]]
238
+
239
239
// ------ Categories of trees -----------------------------------
240
240
241
241
/** Instances of this class are trees for which isType is definitely true.
@@ -361,7 +361,7 @@ object Trees {
361
361
type ThisTree [- T >: Untyped ] <: ValOrDefDef [T ]
362
362
def name : TermName
363
363
def tpt : Tree [T ]
364
- def unforcedRhs : LazyTree = unforced
364
+ def unforcedRhs : LazyTree [ T ] = unforced
365
365
def rhs (implicit ctx : Context ): Tree [T ] = forceIfLazy
366
366
367
367
/** Is this a `BackquotedValDef` or `BackquotedDefDef` ? */
@@ -727,36 +727,36 @@ object Trees {
727
727
}
728
728
729
729
/** mods val name: tpt = rhs */
730
- case class ValDef [- T >: Untyped ] private [ast] (name : TermName , tpt : Tree [T ], private var preRhs : LazyTree )(implicit @ constructorOnly src : SourceFile )
730
+ case class ValDef [- T >: Untyped ] private [ast] (name : TermName , tpt : Tree [T ], private var preRhs : LazyTree [ T @ uncheckedVariance] )(implicit @ constructorOnly src : SourceFile )
731
731
extends ValOrDefDef [T ] {
732
732
type ThisTree [- T >: Untyped ] = ValDef [T ]
733
733
assert(isEmpty || tpt != genericEmptyTree)
734
- def unforced : LazyTree = preRhs
735
- protected def force (x : AnyRef ): Unit = preRhs = x
734
+ def unforced : LazyTree [ T ] = preRhs
735
+ protected def force (x : Tree [ T @ uncheckedVariance] ): Unit = preRhs = x
736
736
}
737
737
738
- class BackquotedValDef [- T >: Untyped ] private [ast] (name : TermName , tpt : Tree [T ], preRhs : LazyTree )(implicit @ constructorOnly src : SourceFile )
738
+ class BackquotedValDef [- T >: Untyped ] private [ast] (name : TermName , tpt : Tree [T ], preRhs : LazyTree [ T @ uncheckedVariance] )(implicit @ constructorOnly src : SourceFile )
739
739
extends ValDef [T ](name, tpt, preRhs) {
740
740
override def isBackquoted : Boolean = true
741
741
override def productPrefix : String = " BackquotedValDef"
742
742
}
743
743
744
744
/** mods def name[tparams](vparams_1)...(vparams_n): tpt = rhs */
745
745
case class DefDef [- T >: Untyped ] private [ast] (name : TermName , tparams : List [TypeDef [T ]],
746
- vparamss : List [List [ValDef [T ]]], tpt : Tree [T ], private var preRhs : LazyTree )(implicit @ constructorOnly src : SourceFile )
746
+ vparamss : List [List [ValDef [T ]]], tpt : Tree [T ], private var preRhs : LazyTree [ T @ uncheckedVariance] )(implicit @ constructorOnly src : SourceFile )
747
747
extends ValOrDefDef [T ] {
748
748
type ThisTree [- T >: Untyped ] = DefDef [T ]
749
749
assert(tpt != genericEmptyTree)
750
- def unforced : LazyTree = preRhs
751
- protected def force (x : AnyRef ): Unit = preRhs = x
750
+ def unforced : LazyTree [ T ] = preRhs
751
+ protected def force (x : Tree [ T @ uncheckedVariance] ): Unit = preRhs = x
752
752
753
753
override def disableOverlapChecks = rawMods.is(Delegate )
754
754
// disable order checks for implicit aliases since their given clause follows
755
755
// their for clause, but the two appear swapped in the DefDef.
756
756
}
757
757
758
758
class BackquotedDefDef [- T >: Untyped ] private [ast] (name : TermName , tparams : List [TypeDef [T ]],
759
- vparamss : List [List [ValDef [T ]]], tpt : Tree [T ], preRhs : LazyTree )(implicit @ constructorOnly src : SourceFile )
759
+ vparamss : List [List [ValDef [T ]]], tpt : Tree [T ], preRhs : LazyTree [ T ] )(implicit @ constructorOnly src : SourceFile )
760
760
extends DefDef [T ](name, tparams, vparamss, tpt, preRhs) {
761
761
override def isBackquoted : Boolean = true
762
762
override def productPrefix : String = " BackquotedDefDef"
@@ -780,12 +780,12 @@ object Trees {
780
780
* if this is of class untpd.DerivingTemplate.
781
781
* Typed templates only have parents.
782
782
*/
783
- case class Template [- T >: Untyped ] private [ast] (constr : DefDef [T ], parentsOrDerived : List [Tree [T ]], self : ValDef [T ], private var preBody : LazyTreeList )(implicit @ constructorOnly src : SourceFile )
783
+ case class Template [- T >: Untyped ] private [ast] (constr : DefDef [T ], parentsOrDerived : List [Tree [T ]], self : ValDef [T ], private var preBody : LazyTreeList [ T @ uncheckedVariance] )(implicit @ constructorOnly src : SourceFile )
784
784
extends DefTree [T ] with WithLazyField [List [Tree [T ]]] {
785
785
type ThisTree [- T >: Untyped ] = Template [T ]
786
- def unforcedBody : LazyTreeList = unforced
787
- def unforced : LazyTreeList = preBody
788
- protected def force (x : AnyRef ): Unit = preBody = x
786
+ def unforcedBody : LazyTreeList [ T ] = unforced
787
+ def unforced : LazyTreeList [ T ] = preBody
788
+ protected def force (x : List [ Tree [ T @ uncheckedVariance]] ): Unit = preBody = x
789
789
def body (implicit ctx : Context ): List [Tree [T ]] = forceIfLazy
790
790
791
791
def parents : List [Tree [T ]] = parentsOrDerived // overridden by DerivingTemplate
@@ -905,12 +905,12 @@ object Trees {
905
905
906
906
/** A tree that can have a lazy field
907
907
* The field is represented by some private `var` which is
908
- * proxied `unforced` and `force`. Forcing the field will
908
+ * accessed by `unforced` and `force`. Forcing the field will
909
909
* set the `var` to the underlying value.
910
910
*/
911
911
trait WithLazyField [+ T <: AnyRef ] {
912
- def unforced : AnyRef
913
- protected def force (x : AnyRef ): Unit
912
+ def unforced : T | Lazy [ T ]
913
+ protected def force (x : T @ uncheckedVariance ): Unit
914
914
def forceIfLazy (implicit ctx : Context ): T = unforced match {
915
915
case lzy : Lazy [T @ unchecked] =>
916
916
val x = lzy.complete
@@ -924,7 +924,7 @@ object Trees {
924
924
* These can be instantiated with Lazy instances which
925
925
* can delay tree construction until the field is first demanded.
926
926
*/
927
- trait Lazy [T <: AnyRef ] {
927
+ trait Lazy [+ T <: AnyRef ] {
928
928
def complete (implicit ctx : Context ): T
929
929
}
930
930
@@ -943,6 +943,8 @@ object Trees {
943
943
type DefTree = Trees .DefTree [T ]
944
944
type MemberDef = Trees .MemberDef [T ]
945
945
type ValOrDefDef = Trees .ValOrDefDef [T ]
946
+ type LazyTree = Trees .LazyTree [T ]
947
+ type LazyTreeList = Trees .LazyTreeList [T ]
946
948
947
949
type Ident = Trees .Ident [T ]
948
950
type BackquotedIdent = Trees .BackquotedIdent [T ]
0 commit comments