@@ -69,13 +69,13 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
69
69
case class InterpolatedString (id : TermName , segments : List [Tree ])(implicit @ constructorOnly src : SourceFile )
70
70
extends TermTree
71
71
72
- /** A function type */
72
+ /** A function type or closure */
73
73
case class Function (args : List [Tree ], body : Tree )(implicit @ constructorOnly src : SourceFile ) extends Tree {
74
74
override def isTerm : Boolean = body.isTerm
75
75
override def isType : Boolean = body.isType
76
76
}
77
77
78
- /** A function type with `implicit`, `erased`, or `given` modifiers */
78
+ /** A function type or closure with `implicit`, `erased`, or `given` modifiers */
79
79
class FunctionWithMods (args : List [Tree ], body : Tree , val mods : Modifiers )(implicit @ constructorOnly src : SourceFile )
80
80
extends Function (args, body)
81
81
@@ -145,6 +145,9 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
145
145
case Floating
146
146
}
147
147
148
+ /** {x1, ..., xN} T (only relevant under -Ycc) */
149
+ case class CapturingTypeTree (refs : List [Tree ], parent : Tree )(implicit @ constructorOnly src : SourceFile ) extends TypTree
150
+
148
151
/** Short-lived usage in typer, does not need copy/transform/fold infrastructure */
149
152
case class DependentTypeTree (tp : List [Symbol ] => Type )(implicit @ constructorOnly src : SourceFile ) extends Tree
150
153
@@ -213,6 +216,9 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
213
216
case class Transparent ()(implicit @ constructorOnly src : SourceFile ) extends Mod (Flags .Transparent )
214
217
215
218
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 )
216
222
}
217
223
218
224
/** Modifiers and annotations for definitions
@@ -390,6 +396,7 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
390
396
def JavaSeqLiteral (elems : List [Tree ], elemtpt : Tree )(implicit src : SourceFile ): JavaSeqLiteral = new JavaSeqLiteral (elems, elemtpt)
391
397
def Inlined (call : tpd.Tree , bindings : List [MemberDef ], expansion : Tree )(implicit src : SourceFile ): Inlined = new Inlined (call, bindings, expansion)
392
398
def TypeTree ()(implicit src : SourceFile ): TypeTree = new TypeTree ()
399
+ def InferredTypeTree ()(implicit src : SourceFile ): TypeTree = new InferredTypeTree ()
393
400
def SingletonTypeTree (ref : Tree )(implicit src : SourceFile ): SingletonTypeTree = new SingletonTypeTree (ref)
394
401
def RefinedTypeTree (tpt : Tree , refinements : List [Tree ])(implicit src : SourceFile ): RefinedTypeTree = new RefinedTypeTree (tpt, refinements)
395
402
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 {
647
654
case tree : Number if (digits == tree.digits) && (kind == tree.kind) => tree
648
655
case _ => finalize(tree, untpd.Number (digits, kind))
649
656
}
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
+
650
661
def TypedSplice (tree : Tree )(splice : tpd.Tree )(using Context ): ProxyTree = tree match {
651
662
case tree : TypedSplice if splice `eq` tree.splice => tree
652
663
case _ => finalize(tree, untpd.TypedSplice (splice)(using ctx))
@@ -710,6 +721,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
710
721
tree
711
722
case MacroTree (expr) =>
712
723
cpy.MacroTree (tree)(transform(expr))
724
+ case CapturingTypeTree (refs, parent) =>
725
+ cpy.CapturingTypeTree (tree)(transform(refs), transform(parent))
713
726
case _ =>
714
727
super .transformMoreCases(tree)
715
728
}
@@ -769,6 +782,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
769
782
this (x, splice)
770
783
case MacroTree (expr) =>
771
784
this (x, expr)
785
+ case CapturingTypeTree (refs, parent) =>
786
+ this (this (x, refs), parent)
772
787
case _ =>
773
788
super .foldMoreCases(x, tree)
774
789
}
0 commit comments