@@ -123,7 +123,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
123123 * | +- Apply
124124 * | +- TypeApply
125125 * | +- Super
126- * | +- Typed
127126 * | +- Assign
128127 * | +- Block
129128 * | +- Closure
@@ -136,7 +135,16 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
136135 * | +- Inlined
137136 * | +- SelectOuter
138137 * | +- While
138+ * | +---+- Typed
139+ * | /
140+ * +- TypedTree +------------------·
141+ * +- Wildcard
142+ * +- Bind
143+ * +- Unapply
144+ * +- Alternatives
139145 * |
146+ * +- CaseDef
147+ * +- TypeCaseDef
140148 * |
141149 * +- TypeTree ----+- Inferred
142150 * | +- TypeIdent
@@ -154,14 +162,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
154162 * |
155163 * +- TypeBoundsTree
156164 * +- WildcardTypeTree
157- * |
158- * +- CaseDef
159- * |
160- * +- TypeCaseDef
161- * +- Wildcard
162- * +- Bind
163- * +- Unapply
164- * +- Alternatives
165165 *
166166 * +- ParamClause -+- TypeParamClause
167167 * +- TermParamClause
@@ -1111,8 +1111,12 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
11111111 /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Typed` */
11121112 given TypedTypeTest : TypeTest [Tree , Typed ]
11131113
1114- /** Tree representing a type ascription `x: T` in the source code */
1115- type Typed <: Term
1114+ /** Tree representing a type ascription `x: T` in the source code.
1115+ *
1116+ * Also represents a pattern that contains a term `x`.
1117+ * Other `: T` patterns use the more general `TypeTree`.
1118+ */
1119+ type Typed <: Term & TypeTree
11161120
11171121 /** Module object of `type Typed` */
11181122 val Typed : TypedModule
@@ -2055,6 +2059,41 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
20552059 def unapply (pattern : Wildcard ): true
20562060 }
20572061
2062+ /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `TypedTree` */
2063+ given TypedTreeTypeTest : TypeTest [Tree , TypedTree ]
2064+
2065+ /** Tree representing a type ascription or pattern `x: T` in the source code
2066+ *
2067+ * The tree `x` may contain a `Constant`, `Ref`, `Wildcard`, `Bind`, `Unapply` or `Alternatives`.
2068+ */
2069+ type TypedTree <: Term
2070+
2071+ /** Module object of `type TypedTree` */
2072+ val TypedTree : TypedTreeModule
2073+
2074+ /** Methods of the module object `val TypedTree` */
2075+ trait TypedTreeModule { this : TypedTree .type =>
2076+
2077+ /** Create a type ascription `<x: Tree>: <tpt: TypeTree>` */
2078+ def apply (expr : Tree , tpt : TypeTree ): TypedTree
2079+
2080+ def copy (original : Tree )(expr : Tree , tpt : TypeTree ): TypedTree
2081+
2082+ /** Matches `<expr: Tree>: <tpt: TypeTree>` */
2083+ def unapply (x : TypedTree ): (Tree , TypeTree )
2084+ }
2085+
2086+ /** Makes extension methods on `TypedTree` available without any imports */
2087+ given TypedTreeMethods : TypedTreeMethods
2088+
2089+ /** Extension methods of `TypedTree` */
2090+ trait TypedTreeMethods :
2091+ extension (self : TypedTree )
2092+ def tree : Tree
2093+ def tpt : TypeTree
2094+ end extension
2095+ end TypedTreeMethods
2096+
20582097 /** Pattern representing a `_ @ _` binding. */
20592098 type Bind <: Tree
20602099
@@ -4283,6 +4322,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
42834322 case Bind (_, body) => foldTree(x, body)(owner)
42844323 case Unapply (fun, implicits, patterns) => foldTrees(foldTrees(foldTree(x, fun)(owner), implicits)(owner), patterns)(owner)
42854324 case Alternatives (patterns) => foldTrees(x, patterns)(owner)
4325+ case TypedTree (tree1, tpt) => foldTree(foldTree(x, tree1)(owner), tpt)(owner)
42864326 }
42874327 }
42884328 end TreeAccumulator
@@ -4347,6 +4387,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
43474387 Unapply .copy(pattern)(transformTerm(pattern.fun)(owner), transformSubTrees(pattern.implicits)(owner), transformTrees(pattern.patterns)(owner))
43484388 case pattern : Alternatives =>
43494389 Alternatives .copy(pattern)(transformTrees(pattern.patterns)(owner))
4390+ case TypedTree (expr, tpt) =>
4391+ TypedTree .copy(tree)(transformTree(expr)(owner), transformTypeTree(tpt)(owner))
43504392 }
43514393 }
43524394
@@ -4397,7 +4439,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
43974439 case New (tpt) =>
43984440 New .copy(tree)(transformTypeTree(tpt)(owner))
43994441 case Typed (expr, tpt) =>
4400- Typed .copy(tree)(/* FIXME #12222: transformTerm(expr)(owner)*/ transformTree(expr)(owner). asInstanceOf [ Term ] , transformTypeTree(tpt)(owner))
4442+ Typed .copy(tree)(transformTerm(expr)(owner), transformTypeTree(tpt)(owner))
44014443 case tree : NamedArg =>
44024444 NamedArg .copy(tree)(tree.name, transformTerm(tree.value)(owner))
44034445 case Assign (lhs, rhs) =>
0 commit comments