@@ -150,6 +150,9 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
150150 /** {x1, ..., xN} T (only relevant under captureChecking) */
151151 case class CapturingTypeTree (refs : List [Tree ], parent : Tree )(implicit @ constructorOnly src : SourceFile ) extends TypTree
152152
153+ /** {x1, ..., xN} T (only relevant under captureChecking) */
154+ case class CapturesAndResult (refs : List [Tree ], parent : Tree )(implicit @ constructorOnly src : SourceFile ) extends TypTree
155+
153156 /** Short-lived usage in typer, does not need copy/transform/fold infrastructure */
154157 case class DependentTypeTree (tp : List [Symbol ] => Type )(implicit @ constructorOnly src : SourceFile ) extends Tree
155158
@@ -501,6 +504,9 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
501504 def captureRoot (using Context ): Select =
502505 Select (scalaDot(nme.caps), nme.CAPTURE_ROOT )
503506
507+ def makeRetaining (parent : Tree , refs : List [Tree ], annotName : TypeName )(using Context ): Annotated =
508+ Annotated (parent, New (scalaAnnotationDot(annotName), List (refs)))
509+
504510 def makeConstructor (tparams : List [TypeDef ], vparamss : List [List [ValDef ]], rhs : Tree = EmptyTree )(using Context ): DefDef =
505511 DefDef (nme.CONSTRUCTOR , joinParams(tparams, vparamss), TypeTree (), rhs)
506512
@@ -658,6 +664,10 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
658664 case tree : Number if (digits == tree.digits) && (kind == tree.kind) => tree
659665 case _ => finalize(tree, untpd.Number (digits, kind))
660666 }
667+ def CapturesAndResult (tree : Tree )(refs : List [Tree ], parent : Tree )(using Context ): Tree = tree match
668+ case tree : CapturesAndResult if (refs eq tree.refs) && (parent eq tree.parent) => tree
669+ case _ => finalize(tree, untpd.CapturesAndResult (refs, parent))
670+
661671 def CapturingTypeTree (tree : Tree )(refs : List [Tree ], parent : Tree )(using Context ): Tree = tree match
662672 case tree : CapturingTypeTree if (refs eq tree.refs) && (parent eq tree.parent) => tree
663673 case _ => finalize(tree, untpd.CapturingTypeTree (refs, parent))
@@ -723,6 +733,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
723733 tree
724734 case MacroTree (expr) =>
725735 cpy.MacroTree (tree)(transform(expr))
736+ case CapturesAndResult (refs, parent) =>
737+ cpy.CapturesAndResult (tree)(transform(refs), transform(parent))
726738 case CapturingTypeTree (refs, parent) =>
727739 cpy.CapturingTypeTree (tree)(transform(refs), transform(parent))
728740 case _ =>
@@ -782,6 +794,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
782794 this (x, splice)
783795 case MacroTree (expr) =>
784796 this (x, expr)
797+ case CapturesAndResult (refs, parent) =>
798+ this (this (x, refs), parent)
785799 case CapturingTypeTree (refs, parent) =>
786800 this (this (x, refs), parent)
787801 case _ =>
0 commit comments