@@ -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
@@ -1094,22 +1094,26 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
10941094 /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Typed` */
10951095 given TypedTypeTest : TypeTest [Tree , Typed ]
10961096
1097- /** Tree representing a type ascription `x: T` in the source code */
1098- type Typed <: Term
1097+ /** Tree representing a type ascription `x: T` in the source code.
1098+ *
1099+ * Also represents a pattern that contains a term `x`.
1100+ * Other `: T` patterns use the more general `TypeTree`.
1101+ */
1102+ type Typed <: Term & TypeTree
10991103
11001104 /** Module object of `type Typed` */
11011105 val Typed : TypedModule
11021106
11031107 /** Methods of the module object `val Typed` */
11041108 trait TypedModule { this : Typed .type =>
11051109
1106- /** Create a type ascription `<x: Tree >: <tpt: TypeTree>` */
1107- def apply (expr : Tree , tpt : TypeTree ): Typed
1110+ /** Create a type ascription `<x: Term >: <tpt: TypeTree>` */
1111+ def apply (expr : Term , tpt : TypeTree ): Typed
11081112
1109- def copy (original : Tree )(expr : Tree , tpt : TypeTree ): Typed
1113+ def copy (original : Tree )(expr : Term , tpt : TypeTree ): Typed
11101114
1111- /** Matches `<expr: Tree >: <tpt: TypeTree>` */
1112- def unapply (x : Typed ): (Tree , TypeTree )
1115+ /** Matches `<expr: Term >: <tpt: TypeTree>` */
1116+ def unapply (x : Typed ): (Term , TypeTree )
11131117 }
11141118
11151119 /** Makes extension methods on `Typed` available without any imports */
@@ -1118,7 +1122,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
11181122 /** Extension methods of `Typed` */
11191123 trait TypedMethods :
11201124 extension (self : Typed )
1121- def expr : Tree
1125+ def expr : Term
11221126 def tpt : TypeTree
11231127 end extension
11241128 end TypedMethods
@@ -2038,6 +2042,41 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
20382042 def unapply (pattern : Wildcard ): true
20392043 }
20402044
2045+ /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `TypedTree` */
2046+ given TypedTreeTypeTest : TypeTest [Tree , TypedTree ]
2047+
2048+ /** Tree representing a type ascription or pattern `x: T` in the source code
2049+ *
2050+ * The tree `x` may contain a `Constant`, `Ref`, `Wildcard`, `Bind`, `Unapply` or `Alternatives`.
2051+ */
2052+ type TypedTree <: Term
2053+
2054+ /** Module object of `type TypedTree` */
2055+ val TypedTree : TypedTreeModule
2056+
2057+ /** Methods of the module object `val TypedTree` */
2058+ trait TypedTreeModule { this : TypedTree .type =>
2059+
2060+ /** Create a type ascription `<x: Tree>: <tpt: TypeTree>` */
2061+ def apply (expr : Tree , tpt : TypeTree ): TypedTree
2062+
2063+ def copy (original : Tree )(expr : Tree , tpt : TypeTree ): TypedTree
2064+
2065+ /** Matches `<expr: Tree>: <tpt: TypeTree>` */
2066+ def unapply (x : TypedTree ): (Tree , TypeTree )
2067+ }
2068+
2069+ /** Makes extension methods on `TypedTree` available without any imports */
2070+ given TypedTreeMethods : TypedTreeMethods
2071+
2072+ /** Extension methods of `TypedTree` */
2073+ trait TypedTreeMethods :
2074+ extension (self : TypedTree )
2075+ def tree : Tree
2076+ def tpt : TypeTree
2077+ end extension
2078+ end TypedTreeMethods
2079+
20412080 /** Pattern representing a `_ @ _` binding. */
20422081 type Bind <: Tree
20432082
@@ -4265,6 +4304,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
42654304 case Bind (_, body) => foldTree(x, body)(owner)
42664305 case Unapply (fun, implicits, patterns) => foldTrees(foldTrees(foldTree(x, fun)(owner), implicits)(owner), patterns)(owner)
42674306 case Alternatives (patterns) => foldTrees(x, patterns)(owner)
4307+ case TypedTree (tree1, tpt) => foldTree(foldTree(x, tree1)(owner), tpt)(owner)
4308+
42684309 }
42694310 }
42704311 end TreeAccumulator
@@ -4329,6 +4370,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
43294370 Unapply .copy(pattern)(transformTerm(pattern.fun)(owner), transformSubTrees(pattern.implicits)(owner), transformTrees(pattern.patterns)(owner))
43304371 case pattern : Alternatives =>
43314372 Alternatives .copy(pattern)(transformTrees(pattern.patterns)(owner))
4373+ case TypedTree (expr, tpt) =>
4374+ TypedTree .copy(tree)(transformTree(expr)(owner), transformTypeTree(tpt)(owner))
43324375 }
43334376 }
43344377
@@ -4379,7 +4422,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
43794422 case New (tpt) =>
43804423 New .copy(tree)(transformTypeTree(tpt)(owner))
43814424 case Typed (expr, tpt) =>
4382- Typed .copy(tree)(transformTree (expr)(owner), transformTypeTree(tpt)(owner))
4425+ Typed .copy(tree)(transformTerm (expr)(owner), transformTypeTree(tpt)(owner))
43834426 case tree : NamedArg =>
43844427 NamedArg .copy(tree)(tree.name, transformTerm(tree.value)(owner))
43854428 case Assign (lhs, rhs) =>
0 commit comments