@@ -131,7 +131,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
131
131
* | +- Apply
132
132
* | +- TypeApply
133
133
* | +- Super
134
- * | +- Typed
135
134
* | +- Assign
136
135
* | +- Block
137
136
* | +- Closure
@@ -144,7 +143,15 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
144
143
* | +- Inlined
145
144
* | +- SelectOuter
146
145
* | +- While
146
+ * | +---+- Typed
147
+ * | /
148
+ * +- TypedOrTest +----------------·
149
+ * +- Bind
150
+ * +- Unapply
151
+ * +- Alternatives
147
152
* |
153
+ * +- CaseDef
154
+ * +- TypeCaseDef
148
155
* |
149
156
* +- TypeTree ----+- Inferred
150
157
* | +- TypeIdent
@@ -162,13 +169,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
162
169
* |
163
170
* +- TypeBoundsTree
164
171
* +- WildcardTypeTree
165
- * |
166
- * +- CaseDef
167
- * |
168
- * +- TypeCaseDef
169
- * +- Bind
170
- * +- Unapply
171
- * +- Alternatives
172
172
*
173
173
* +- ParamClause -+- TypeParamClause
174
174
* +- TermParamClause
@@ -1135,8 +1135,12 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
1135
1135
/** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Typed` */
1136
1136
given TypedTypeTest : TypeTest [Tree , Typed ]
1137
1137
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
1140
1144
1141
1145
/** Module object of `type Typed` */
1142
1146
val Typed : TypedModule
@@ -1583,6 +1587,38 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
1583
1587
end extension
1584
1588
end WhileMethods
1585
1589
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
+
1586
1622
// ----- TypeTrees ------------------------------------------------
1587
1623
1588
1624
/** Type tree representing a type written in the source */
@@ -4414,6 +4450,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4414
4450
Unapply .copy(pattern)(transformTerm(pattern.fun)(owner), transformSubTrees(pattern.implicits)(owner), transformTrees(pattern.patterns)(owner))
4415
4451
case pattern : Alternatives =>
4416
4452
Alternatives .copy(pattern)(transformTrees(pattern.patterns)(owner))
4453
+ case TypedOrTest (inner, tpt) =>
4454
+ TypedOrTest .copy(tree)(transformTree(inner)(owner), transformTypeTree(tpt)(owner))
4417
4455
}
4418
4456
}
4419
4457
@@ -4464,7 +4502,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4464
4502
case New (tpt) =>
4465
4503
New .copy(tree)(transformTypeTree(tpt)(owner))
4466
4504
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))
4468
4506
case tree : NamedArg =>
4469
4507
NamedArg .copy(tree)(tree.name, transformTerm(tree.value)(owner))
4470
4508
case Assign (lhs, rhs) =>
0 commit comments