@@ -407,12 +407,12 @@ object Trees {
407
407
}
408
408
409
409
/** A ValDef or DefDef tree */
410
- abstract class ValOrDefDef [+ T <: Untyped ](implicit @ constructorOnly src : SourceFile ) extends MemberDef [T ] with WithLazyField [ Tree [ T ]] {
410
+ abstract class ValOrDefDef [+ T <: Untyped ](implicit @ constructorOnly src : SourceFile ) extends MemberDef [T ], WithLazyFields {
411
411
type ThisTree [+ T <: Untyped ] <: ValOrDefDef [T ]
412
412
def name : TermName
413
413
def tpt : Tree [T ]
414
- def unforcedRhs : LazyTree [T ] = unforced
415
- def rhs (using Context ): Tree [T ] = forceIfLazy
414
+ def unforcedRhs : LazyTree [T ]
415
+ def rhs (using Context ): Tree [T ]
416
416
}
417
417
418
418
trait ValOrTypeDef [+ T <: Untyped ] extends MemberDef [T ]:
@@ -808,8 +808,10 @@ object Trees {
808
808
extends ValOrDefDef [T ], ValOrTypeDef [T ] {
809
809
type ThisTree [+ T <: Untyped ] = ValDef [T ]
810
810
assert(isEmpty || (tpt ne genericEmptyTree))
811
- def unforced : LazyTree [T ] = preRhs
812
- protected def force (x : Tree [T @ uncheckedVariance]): Unit = preRhs = x
811
+
812
+ def unforcedRhs : LazyTree [T ] = preRhs
813
+ def forceFields ()(using Context ): Unit = preRhs = force(preRhs)
814
+ def rhs (using Context ): Tree [T ] = { forceFields(); preRhs.asInstanceOf [Tree [T ]] }
813
815
}
814
816
815
817
/** mods def name[tparams](vparams_1)...(vparams_n): tpt = rhs */
@@ -818,8 +820,10 @@ object Trees {
818
820
extends ValOrDefDef [T ] {
819
821
type ThisTree [+ T <: Untyped ] = DefDef [T ]
820
822
assert(tpt ne genericEmptyTree)
821
- def unforced : LazyTree [T ] = preRhs
822
- protected def force (x : Tree [T @ uncheckedVariance]): Unit = preRhs = x
823
+
824
+ def unforcedRhs : LazyTree [T ] = preRhs
825
+ def forceFields ()(using Context ): Unit = preRhs = force(preRhs)
826
+ def rhs (using Context ): Tree [T ] = { forceFields(); preRhs.asInstanceOf [Tree [T ]] }
823
827
824
828
def leadingTypeParams (using Context ): List [TypeDef [T ]] = paramss match
825
829
case (tparams @ (tparam : TypeDef [_]) :: _) :: _ => tparams.asInstanceOf [List [TypeDef [T ]]]
@@ -855,27 +859,17 @@ object Trees {
855
859
* if this is of class untpd.DerivingTemplate.
856
860
* Typed templates only have parents.
857
861
*/
858
- case class Template [+ T <: Untyped ] private [ast] (constr : DefDef [T ], private var myParentsOrDerived : LazyTreeList [T ], self : ValDef [T ], private var preBody : LazyTreeList [T ])(implicit @ constructorOnly src : SourceFile )
859
- extends DefTree [T ] with WithLazyField [ List [ Tree [ T ]]] {
862
+ case class Template [+ T <: Untyped ] private [ast] (constr : DefDef [T ], private var preParentsOrDerived : LazyTreeList [T ], self : ValDef [T ], private var preBody : LazyTreeList [T ])(implicit @ constructorOnly src : SourceFile )
863
+ extends DefTree [T ] with WithLazyFields {
860
864
type ThisTree [+ T <: Untyped ] = Template [T ]
861
- def unforcedBody : LazyTreeList [T ] = unforced
862
- def unforced : LazyTreeList [T ] = preBody
863
-
864
- protected def force (x : List [Tree [T @ uncheckedVariance]]): Unit = preBody = x
865
-
866
- // The post-condition of forceIfLazy is that all lazy fields are trees, so
867
- // we need to force parentsAndDerived as well as body.
868
- override def forceIfLazy (using Context ) =
869
- parentsOrDerived
870
- super .forceIfLazy
871
865
872
- def body (using Context ): List [Tree [T ]] = forceIfLazy
866
+ def forceFields ()(using Context ): Unit =
867
+ preParentsOrDerived = force(preParentsOrDerived)
868
+ preBody = force(preBody)
873
869
874
- def parentsOrDerived (using Context ): List [Tree [T ]] = myParentsOrDerived match
875
- case latePs : Lazy [List [Tree [T ]]] @ unchecked =>
876
- myParentsOrDerived = latePs.complete
877
- parentsOrDerived
878
- case ps : List [Tree [T ]] @ unchecked => ps
870
+ def unforcedBody : LazyTreeList [T ] = preBody
871
+ def body (using Context ): List [Tree [T ]] = { forceFields(); preBody.asInstanceOf [List [Tree [T ]]] }
872
+ def parentsOrDerived (using Context ): List [Tree [T ]] = { forceFields(); preParentsOrDerived.asInstanceOf [List [Tree [T ]]] }
879
873
880
874
def parents (using Context ): List [Tree [T ]] = parentsOrDerived // overridden by DerivingTemplate
881
875
def derived : List [untpd.Tree ] = Nil // overridden by DerivingTemplate
@@ -1027,17 +1021,11 @@ object Trees {
1027
1021
* accessed by `unforced` and `force`. Forcing the field will
1028
1022
* set the `var` to the underlying value.
1029
1023
*/
1030
- trait WithLazyField [+ T <: AnyRef ] {
1031
- def unforced : T | Lazy [T ]
1032
- protected def force (x : T @ uncheckedVariance): Unit
1033
- def forceIfLazy (using Context ): T = unforced match {
1034
- case lzy : Lazy [T @ unchecked] =>
1035
- val x = lzy.complete
1036
- force(x)
1037
- x
1038
- case x : T @ unchecked => x
1039
- }
1040
- }
1024
+ trait WithLazyFields :
1025
+ protected def force [T <: AnyRef ](x : T | Lazy [T ])(using Context ): T = x match
1026
+ case x : Lazy [T ] @ unchecked => x.complete
1027
+ case x : T @ unchecked => x
1028
+ def forceFields ()(using Context ): Unit
1041
1029
1042
1030
/** A base trait for lazy tree fields.
1043
1031
* These can be instantiated with Lazy instances which
0 commit comments