@@ -131,7 +131,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
131131 * | +- Apply
132132 * | +- TypeApply
133133 * | +- Super
134- * | +- Typed
135134 * | +- Assign
136135 * | +- Block
137136 * | +- Closure
@@ -144,7 +143,15 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
144143 * | +- Inlined
145144 * | +- SelectOuter
146145 * | +- While
146+ * | +---+- Typed
147+ * | /
148+ * +- TypedOrTest +----------------·
149+ * +- Bind
150+ * +- Unapply
151+ * +- Alternatives
147152 * |
153+ * +- CaseDef
154+ * +- TypeCaseDef
148155 * |
149156 * +- TypeTree ----+- Inferred
150157 * | +- TypeIdent
@@ -162,13 +169,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
162169 * |
163170 * +- TypeBoundsTree
164171 * +- WildcardTypeTree
165- * |
166- * +- CaseDef
167- * |
168- * +- TypeCaseDef
169- * +- Bind
170- * +- Unapply
171- * +- Alternatives
172172 *
173173 * +- ParamClause -+- TypeParamClause
174174 * +- TermParamClause
@@ -1135,8 +1135,12 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
11351135 /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Typed` */
11361136 given TypedTypeTest : TypeTest [Tree , Typed ]
11371137
1138- /** Tree representing a type ascription `x: T` in the source code */
1139- type Typed <: Term
1138+ /** Tree representing a type ascription `x: T` in the source code.
1139+ *
1140+ * Also represents a pattern that contains a term `x`.
1141+ * Other `: T` patterns use the more general `TypedOrTest`.
1142+ */
1143+ type Typed <: Term & TypedOrTest
11401144
11411145 /** Module object of `type Typed` */
11421146 val Typed : TypedModule
@@ -1583,6 +1587,38 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
15831587 end extension
15841588 end WhileMethods
15851589
1590+ /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `TypedOrTest` */
1591+ given TypedOrTestTypeTest : TypeTest [Tree , TypedOrTest ]
1592+
1593+ /** Tree representing a type ascription or type test pattern `x: T` in the source code. */
1594+ type TypedOrTest <: Tree
1595+
1596+ /** Module object of `type TypedOrTest` */
1597+ val TypedOrTest : TypedOrTestModule
1598+
1599+ /** Methods of the module object `val TypedOrTest` */
1600+ trait TypedOrTestModule { this : TypedOrTest .type =>
1601+
1602+ /** Create a type ascription `<x: Tree>: <tpt: TypeTree>` */
1603+ def apply (expr : Tree , tpt : TypeTree ): TypedOrTest
1604+
1605+ def copy (original : Tree )(expr : Tree , tpt : TypeTree ): TypedOrTest
1606+
1607+ /** Matches `<expr: Tree>: <tpt: TypeTree>` */
1608+ def unapply (x : TypedOrTest ): (Tree , TypeTree )
1609+ }
1610+
1611+ /** Makes extension methods on `TypedOrTest` available without any imports */
1612+ given TypedOrTestMethods : TypedOrTestMethods
1613+
1614+ /** Extension methods of `TypedOrTest` */
1615+ trait TypedOrTestMethods :
1616+ extension (self : TypedOrTest )
1617+ def tree : Tree
1618+ def tpt : TypeTree
1619+ end extension
1620+ end TypedOrTestMethods
1621+
15861622 // ----- TypeTrees ------------------------------------------------
15871623
15881624 /** Type tree representing a type written in the source */
@@ -4414,6 +4450,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
44144450 Unapply .copy(pattern)(transformTerm(pattern.fun)(owner), transformSubTrees(pattern.implicits)(owner), transformTrees(pattern.patterns)(owner))
44154451 case pattern : Alternatives =>
44164452 Alternatives .copy(pattern)(transformTrees(pattern.patterns)(owner))
4453+ case TypedOrTest (inner, tpt) =>
4454+ TypedOrTest .copy(tree)(transformTree(inner)(owner), transformTypeTree(tpt)(owner))
44174455 }
44184456 }
44194457
@@ -4464,7 +4502,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
44644502 case New (tpt) =>
44654503 New .copy(tree)(transformTypeTree(tpt)(owner))
44664504 case Typed (expr, tpt) =>
4467- Typed .copy(tree)(/* FIXME #12222: transformTerm(expr)(owner)*/ transformTree(expr)(owner). asInstanceOf [ Term ] , transformTypeTree(tpt)(owner))
4505+ Typed .copy(tree)(transformTerm(expr)(owner), transformTypeTree(tpt)(owner))
44684506 case tree : NamedArg =>
44694507 NamedArg .copy(tree)(tree.name, transformTerm(tree.value)(owner))
44704508 case Assign (lhs, rhs) =>
0 commit comments