@@ -133,7 +133,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
133
133
* | +- Apply
134
134
* | +- TypeApply
135
135
* | +- Super
136
- * | +- Typed
137
136
* | +- Assign
138
137
* | +- Block
139
138
* | +- Closure
@@ -146,7 +145,15 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
146
145
* | +- Inlined
147
146
* | +- SelectOuter
148
147
* | +- While
148
+ * | +---+- Typed
149
+ * | /
150
+ * +- TypedOrTest +----------------·
151
+ * +- Bind
152
+ * +- Unapply
153
+ * +- Alternatives
149
154
* |
155
+ * +- CaseDef
156
+ * +- TypeCaseDef
150
157
* |
151
158
* +- TypeTree ----+- Inferred
152
159
* | +- TypeIdent
@@ -164,13 +171,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
164
171
* |
165
172
* +- TypeBoundsTree
166
173
* +- WildcardTypeTree
167
- * |
168
- * +- CaseDef
169
- * |
170
- * +- TypeCaseDef
171
- * +- Bind
172
- * +- Unapply
173
- * +- Alternatives
174
174
*
175
175
* +- ParamClause -+- TypeParamClause
176
176
* +- TermParamClause
@@ -1120,8 +1120,12 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
1120
1120
/** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Typed` */
1121
1121
given TypedTypeTest : TypeTest [Tree , Typed ]
1122
1122
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
1125
1129
1126
1130
/** Module object of `type Typed` */
1127
1131
val Typed : TypedModule
@@ -1568,6 +1572,38 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
1568
1572
end extension
1569
1573
end WhileMethods
1570
1574
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
+
1571
1607
// ----- TypeTrees ------------------------------------------------
1572
1608
1573
1609
/** Type tree representing a type written in the source */
@@ -4406,6 +4442,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4406
4442
Unapply .copy(pattern)(transformTerm(pattern.fun)(owner), transformSubTrees(pattern.implicits)(owner), transformTrees(pattern.patterns)(owner))
4407
4443
case pattern : Alternatives =>
4408
4444
Alternatives .copy(pattern)(transformTrees(pattern.patterns)(owner))
4445
+ case TypedOrTest (inner, tpt) =>
4446
+ TypedOrTest .copy(tree)(transformTree(inner)(owner), transformTypeTree(tpt)(owner))
4409
4447
}
4410
4448
}
4411
4449
@@ -4456,7 +4494,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4456
4494
case New (tpt) =>
4457
4495
New .copy(tree)(transformTypeTree(tpt)(owner))
4458
4496
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))
4460
4498
case tree : NamedArg =>
4461
4499
NamedArg .copy(tree)(tree.name, transformTerm(tree.value)(owner))
4462
4500
case Assign (lhs, rhs) =>
0 commit comments