@@ -122,7 +122,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
122122 * | +- Apply
123123 * | +- TypeApply
124124 * | +- Super
125- * | +- Typed
126125 * | +- Assign
127126 * | +- Block
128127 * | +- Closure
@@ -135,7 +134,16 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
135134 * | +- Inlined
136135 * | +- SelectOuter
137136 * | +- While
137+ * | +---+- Typed
138+ * | /
139+ * +- TypedTree +------------------·
140+ * +- Wildcard
141+ * +- Bind
142+ * +- Unapply
143+ * +- Alternatives
138144 * |
145+ * +- CaseDef
146+ * +- TypeCaseDef
139147 * |
140148 * +- TypeTree ----+- Inferred
141149 * | +- TypeIdent
@@ -153,14 +161,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
153161 * |
154162 * +- TypeBoundsTree
155163 * +- WildcardTypeTree
156- * |
157- * +- CaseDef
158- * |
159- * +- TypeCaseDef
160- * +- Wildcard
161- * +- Bind
162- * +- Unapply
163- * +- Alternatives
164164 *
165165 * +- ParamClause -+- TypeParamClause
166166 * +- TermParamClause
@@ -1092,22 +1092,26 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
10921092 /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Typed` */
10931093 given TypedTypeTest : TypeTest [Tree , Typed ]
10941094
1095- /** Tree representing a type ascription `x: T` in the source code */
1096- type Typed <: Term
1095+ /** Tree representing a type ascription `x: T` in the source code.
1096+ *
1097+ * Also represents a pattern that contains a term `x`.
1098+ * Other `: T` patterns use the more general `TypeTree`.
1099+ */
1100+ type Typed <: Term & TypeTree
10971101
10981102 /** Module object of `type Typed` */
10991103 val Typed : TypedModule
11001104
11011105 /** Methods of the module object `val Typed` */
11021106 trait TypedModule { this : Typed .type =>
11031107
1104- /** Create a type ascription `<x: Tree >: <tpt: TypeTree>` */
1105- def apply (expr : Tree , tpt : TypeTree ): Typed
1108+ /** Create a type ascription `<x: Term >: <tpt: TypeTree>` */
1109+ def apply (expr : Term , tpt : TypeTree ): Typed
11061110
1107- def copy (original : Tree )(expr : Tree , tpt : TypeTree ): Typed
1111+ def copy (original : Tree )(expr : Term , tpt : TypeTree ): Typed
11081112
1109- /** Matches `<expr: Tree >: <tpt: TypeTree>` */
1110- def unapply (x : Typed ): (Tree , TypeTree )
1113+ /** Matches `<expr: Term >: <tpt: TypeTree>` */
1114+ def unapply (x : Typed ): (Term , TypeTree )
11111115 }
11121116
11131117 /** Makes extension methods on `Typed` available without any imports */
@@ -1116,7 +1120,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
11161120 /** Extension methods of `Typed` */
11171121 trait TypedMethods :
11181122 extension (self : Typed )
1119- def expr : Tree
1123+ def expr : Term
11201124 def tpt : TypeTree
11211125 end extension
11221126 end TypedMethods
@@ -2036,6 +2040,41 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
20362040 def unapply (pattern : Wildcard ): true
20372041 }
20382042
2043+ /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `TypedTree` */
2044+ given TypedTreeTypeTest : TypeTest [Tree , TypedTree ]
2045+
2046+ /** Tree representing a type ascription or pattern `x: T` in the source code
2047+ *
2048+ * The tree `x` may contain a `Constant`, `Ref`, `Wildcard`, `Bind`, `Unapply` or `Alternatives`.
2049+ */
2050+ type TypedTree <: Term
2051+
2052+ /** Module object of `type TypedTree` */
2053+ val TypedTree : TypedTreeModule
2054+
2055+ /** Methods of the module object `val TypedTree` */
2056+ trait TypedTreeModule { this : TypedTree .type =>
2057+
2058+ /** Create a type ascription `<x: Tree>: <tpt: TypeTree>` */
2059+ def apply (expr : Tree , tpt : TypeTree ): TypedTree
2060+
2061+ def copy (original : Tree )(expr : Tree , tpt : TypeTree ): TypedTree
2062+
2063+ /** Matches `<expr: Tree>: <tpt: TypeTree>` */
2064+ def unapply (x : TypedTree ): (Tree , TypeTree )
2065+ }
2066+
2067+ /** Makes extension methods on `TypedTree` available without any imports */
2068+ given TypedTreeMethods : TypedTreeMethods
2069+
2070+ /** Extension methods of `TypedTree` */
2071+ trait TypedTreeMethods :
2072+ extension (self : TypedTree )
2073+ def tree : Tree
2074+ def tpt : TypeTree
2075+ end extension
2076+ end TypedTreeMethods
2077+
20392078 /** Pattern representing a `_ @ _` binding. */
20402079 type Bind <: Tree
20412080
@@ -4263,6 +4302,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
42634302 case Bind (_, body) => foldTree(x, body)(owner)
42644303 case Unapply (fun, implicits, patterns) => foldTrees(foldTrees(foldTree(x, fun)(owner), implicits)(owner), patterns)(owner)
42654304 case Alternatives (patterns) => foldTrees(x, patterns)(owner)
4305+ case TypedTree (tree1, tpt) => foldTree(foldTree(x, tree1)(owner), tpt)(owner)
4306+
42664307 }
42674308 }
42684309 end TreeAccumulator
@@ -4327,6 +4368,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
43274368 Unapply .copy(pattern)(transformTerm(pattern.fun)(owner), transformSubTrees(pattern.implicits)(owner), transformTrees(pattern.patterns)(owner))
43284369 case pattern : Alternatives =>
43294370 Alternatives .copy(pattern)(transformTrees(pattern.patterns)(owner))
4371+ case TypedTree (expr, tpt) =>
4372+ TypedTree .copy(tree)(transformTree(expr)(owner), transformTypeTree(tpt)(owner))
43304373 }
43314374 }
43324375
@@ -4377,7 +4420,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
43774420 case New (tpt) =>
43784421 New .copy(tree)(transformTypeTree(tpt)(owner))
43794422 case Typed (expr, tpt) =>
4380- Typed .copy(tree)(transformTree (expr)(owner), transformTypeTree(tpt)(owner))
4423+ Typed .copy(tree)(transformTerm (expr)(owner), transformTypeTree(tpt)(owner))
43814424 case tree : NamedArg =>
43824425 NamedArg .copy(tree)(tree.name, transformTerm(tree.value)(owner))
43834426 case Assign (lhs, rhs) =>
0 commit comments