@@ -69,13 +69,13 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
6969 case class InterpolatedString (id : TermName , segments : List [Tree ])(implicit @ constructorOnly src : SourceFile )
7070 extends TermTree
7171
72- /** A function type */
72+ /** A function type or closure */
7373 case class Function (args : List [Tree ], body : Tree )(implicit @ constructorOnly src : SourceFile ) extends Tree {
7474 override def isTerm : Boolean = body.isTerm
7575 override def isType : Boolean = body.isType
7676 }
7777
78- /** A function type with `implicit`, `erased`, or `given` modifiers */
78+ /** A function type or closure with `implicit`, `erased`, or `given` modifiers */
7979 class FunctionWithMods (args : List [Tree ], body : Tree , val mods : Modifiers )(implicit @ constructorOnly src : SourceFile )
8080 extends Function (args, body)
8181
@@ -145,6 +145,9 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
145145 case Floating
146146 }
147147
148+ /** {x1, ..., xN} T (only relevant under -Ycc) */
149+ case class CapturingTypeTree (refs : List [Tree ], parent : Tree )(implicit @ constructorOnly src : SourceFile ) extends TypTree
150+
148151 /** Short-lived usage in typer, does not need copy/transform/fold infrastructure */
149152 case class DependentTypeTree (tp : List [Symbol ] => Type )(implicit @ constructorOnly src : SourceFile ) extends Tree
150153
@@ -213,6 +216,9 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
213216 case class Transparent ()(implicit @ constructorOnly src : SourceFile ) extends Mod (Flags .Transparent )
214217
215218 case class Infix ()(implicit @ constructorOnly src : SourceFile ) extends Mod (Flags .Infix )
219+
220+ /** Used under -Ycc to mark impure function types `A => B` in `FunctionWithMods` */
221+ case class Impure ()(implicit @ constructorOnly src : SourceFile ) extends Mod (Flags .Impure )
216222 }
217223
218224 /** Modifiers and annotations for definitions
@@ -390,6 +396,7 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
390396 def JavaSeqLiteral (elems : List [Tree ], elemtpt : Tree )(implicit src : SourceFile ): JavaSeqLiteral = new JavaSeqLiteral (elems, elemtpt)
391397 def Inlined (call : tpd.Tree , bindings : List [MemberDef ], expansion : Tree )(implicit src : SourceFile ): Inlined = new Inlined (call, bindings, expansion)
392398 def TypeTree ()(implicit src : SourceFile ): TypeTree = new TypeTree ()
399+ def InferredTypeTree ()(implicit src : SourceFile ): TypeTree = new InferredTypeTree ()
393400 def SingletonTypeTree (ref : Tree )(implicit src : SourceFile ): SingletonTypeTree = new SingletonTypeTree (ref)
394401 def RefinedTypeTree (tpt : Tree , refinements : List [Tree ])(implicit src : SourceFile ): RefinedTypeTree = new RefinedTypeTree (tpt, refinements)
395402 def AppliedTypeTree (tpt : Tree , args : List [Tree ])(implicit src : SourceFile ): AppliedTypeTree = new AppliedTypeTree (tpt, args)
@@ -647,6 +654,10 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
647654 case tree : Number if (digits == tree.digits) && (kind == tree.kind) => tree
648655 case _ => finalize(tree, untpd.Number (digits, kind))
649656 }
657+ def CapturingTypeTree (tree : Tree )(refs : List [Tree ], parent : Tree )(using Context ): Tree = tree match
658+ case tree : CapturingTypeTree if (refs eq tree.refs) && (parent eq tree.parent) => tree
659+ case _ => finalize(tree, untpd.CapturingTypeTree (refs, parent))
660+
650661 def TypedSplice (tree : Tree )(splice : tpd.Tree )(using Context ): ProxyTree = tree match {
651662 case tree : TypedSplice if splice `eq` tree.splice => tree
652663 case _ => finalize(tree, untpd.TypedSplice (splice)(using ctx))
@@ -710,6 +721,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
710721 tree
711722 case MacroTree (expr) =>
712723 cpy.MacroTree (tree)(transform(expr))
724+ case CapturingTypeTree (refs, parent) =>
725+ cpy.CapturingTypeTree (tree)(transform(refs), transform(parent))
713726 case _ =>
714727 super .transformMoreCases(tree)
715728 }
@@ -769,6 +782,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
769782 this (x, splice)
770783 case MacroTree (expr) =>
771784 this (x, expr)
785+ case CapturingTypeTree (refs, parent) =>
786+ this (this (x, refs), parent)
772787 case _ =>
773788 super .foldMoreCases(x, tree)
774789 }
0 commit comments