@@ -133,7 +133,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
133133 * | +- Apply
134134 * | +- TypeApply
135135 * | +- Super
136- * | +- Typed
137136 * | +- Assign
138137 * | +- Block
139138 * | +- Closure
@@ -146,7 +145,15 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
146145 * | +- Inlined
147146 * | +- SelectOuter
148147 * | +- While
148+ * | +---+- Typed
149+ * | /
150+ * +- TypedOrTest +----------------·
151+ * +- Bind
152+ * +- Unapply
153+ * +- Alternatives
149154 * |
155+ * +- CaseDef
156+ * +- TypeCaseDef
150157 * |
151158 * +- TypeTree ----+- Inferred
152159 * | +- TypeIdent
@@ -164,13 +171,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
164171 * |
165172 * +- TypeBoundsTree
166173 * +- WildcardTypeTree
167- * |
168- * +- CaseDef
169- * |
170- * +- TypeCaseDef
171- * +- Bind
172- * +- Unapply
173- * +- Alternatives
174174 *
175175 * +- ParamClause -+- TypeParamClause
176176 * +- TermParamClause
@@ -1120,8 +1120,12 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
11201120 /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Typed` */
11211121 given TypedTypeTest : TypeTest [Tree , Typed ]
11221122
1123- /** Tree representing a type ascription `x: T` in the source code */
1124- type Typed <: Term
1123+ /** Tree representing a type ascription `x: T` in the source code.
1124+ *
1125+ * Also represents a pattern that contains a term `x`.
1126+ * Other `: T` patterns use the more general `TypedOrTest`.
1127+ */
1128+ type Typed <: Term & TypedOrTest
11251129
11261130 /** Module object of `type Typed` */
11271131 val Typed : TypedModule
@@ -1568,6 +1572,38 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
15681572 end extension
15691573 end WhileMethods
15701574
1575+ /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `TypedOrTest` */
1576+ given TypedOrTestTypeTest : TypeTest [Tree , TypedOrTest ]
1577+
1578+ /** Tree representing a type ascription or type test pattern `x: T` in the source code. */
1579+ type TypedOrTest <: Tree
1580+
1581+ /** Module object of `type TypedOrTest` */
1582+ val TypedOrTest : TypedOrTestModule
1583+
1584+ /** Methods of the module object `val TypedOrTest` */
1585+ trait TypedOrTestModule { this : TypedOrTest .type =>
1586+
1587+ /** Create a type ascription `<x: Tree>: <tpt: TypeTree>` */
1588+ def apply (expr : Tree , tpt : TypeTree ): TypedOrTest
1589+
1590+ def copy (original : Tree )(expr : Tree , tpt : TypeTree ): TypedOrTest
1591+
1592+ /** Matches `<expr: Tree>: <tpt: TypeTree>` */
1593+ def unapply (x : TypedOrTest ): (Tree , TypeTree )
1594+ }
1595+
1596+ /** Makes extension methods on `TypedOrTest` available without any imports */
1597+ given TypedOrTestMethods : TypedOrTestMethods
1598+
1599+ /** Extension methods of `TypedOrTest` */
1600+ trait TypedOrTestMethods :
1601+ extension (self : TypedOrTest )
1602+ def tree : Tree
1603+ def tpt : TypeTree
1604+ end extension
1605+ end TypedOrTestMethods
1606+
15711607 // ----- TypeTrees ------------------------------------------------
15721608
15731609 /** Type tree representing a type written in the source */
@@ -4406,6 +4442,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
44064442 Unapply .copy(pattern)(transformTerm(pattern.fun)(owner), transformSubTrees(pattern.implicits)(owner), transformTrees(pattern.patterns)(owner))
44074443 case pattern : Alternatives =>
44084444 Alternatives .copy(pattern)(transformTrees(pattern.patterns)(owner))
4445+ case TypedOrTest (inner, tpt) =>
4446+ TypedOrTest .copy(tree)(transformTree(inner)(owner), transformTypeTree(tpt)(owner))
44094447 }
44104448 }
44114449
@@ -4456,7 +4494,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
44564494 case New (tpt) =>
44574495 New .copy(tree)(transformTypeTree(tpt)(owner))
44584496 case Typed (expr, tpt) =>
4459- Typed .copy(tree)(/* FIXME #12222: transformTerm(expr)(owner)*/ transformTree(expr)(owner). asInstanceOf [ Term ] , transformTypeTree(tpt)(owner))
4497+ Typed .copy(tree)(transformTerm(expr)(owner), transformTypeTree(tpt)(owner))
44604498 case tree : NamedArg =>
44614499 NamedArg .copy(tree)(tree.name, transformTerm(tree.value)(owner))
44624500 case Assign (lhs, rhs) =>
0 commit comments