@@ -407,12 +407,12 @@ object Trees {
407407 }
408408
409409 /** 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 {
411411 type ThisTree [+ T <: Untyped ] <: ValOrDefDef [T ]
412412 def name : TermName
413413 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 ]
416416 }
417417
418418 trait ValOrTypeDef [+ T <: Untyped ] extends MemberDef [T ]:
@@ -808,8 +808,10 @@ object Trees {
808808 extends ValOrDefDef [T ], ValOrTypeDef [T ] {
809809 type ThisTree [+ T <: Untyped ] = ValDef [T ]
810810 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 ]] }
813815 }
814816
815817 /** mods def name[tparams](vparams_1)...(vparams_n): tpt = rhs */
@@ -818,8 +820,10 @@ object Trees {
818820 extends ValOrDefDef [T ] {
819821 type ThisTree [+ T <: Untyped ] = DefDef [T ]
820822 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 ]] }
823827
824828 def leadingTypeParams (using Context ): List [TypeDef [T ]] = paramss match
825829 case (tparams @ (tparam : TypeDef [_]) :: _) :: _ => tparams.asInstanceOf [List [TypeDef [T ]]]
@@ -855,27 +859,17 @@ object Trees {
855859 * if this is of class untpd.DerivingTemplate.
856860 * Typed templates only have parents.
857861 */
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 {
860864 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
871865
872- def body (using Context ): List [Tree [T ]] = forceIfLazy
866+ def forceFields ()(using Context ): Unit =
867+ preParentsOrDerived = force(preParentsOrDerived)
868+ preBody = force(preBody)
873869
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 ]]] }
879873
880874 def parents (using Context ): List [Tree [T ]] = parentsOrDerived // overridden by DerivingTemplate
881875 def derived : List [untpd.Tree ] = Nil // overridden by DerivingTemplate
@@ -1027,17 +1021,11 @@ object Trees {
10271021 * accessed by `unforced` and `force`. Forcing the field will
10281022 * set the `var` to the underlying value.
10291023 */
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
10411029
10421030 /** A base trait for lazy tree fields.
10431031 * These can be instantiated with Lazy instances which
0 commit comments