@@ -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,16 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
146
145
* | +- Inlined
147
146
* | +- SelectOuter
148
147
* | +- While
148
+ * | +---+- Typed
149
+ * | /
150
+ * +- TypedTree +------------------·
151
+ * +- WildcardPattern
152
+ * +- Bind
153
+ * +- Unapply
154
+ * +- Alternatives
149
155
* |
156
+ * +- CaseDef
157
+ * +- TypeCaseDef
150
158
* |
151
159
* +- TypeTree ----+- Inferred
152
160
* | +- TypeIdent
@@ -164,13 +172,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
164
172
* |
165
173
* +- TypeBoundsTree
166
174
* +- WildcardTypeTree
167
- * |
168
- * +- CaseDef
169
- * |
170
- * +- TypeCaseDef
171
- * +- Bind
172
- * +- Unapply
173
- * +- Alternatives
174
175
*
175
176
* +- ParamClause -+- TypeParamClause
176
177
* +- TermParamClause
@@ -1120,8 +1121,12 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
1120
1121
/** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Typed` */
1121
1122
given TypedTypeTest : TypeTest [Tree , Typed ]
1122
1123
1123
- /** Tree representing a type ascription `x: T` in the source code */
1124
- type Typed <: Term
1124
+ /** Tree representing a type ascription `x: T` in the source code.
1125
+ *
1126
+ * Also represents a pattern that contains a term `x`.
1127
+ * Other `: T` patterns use the more general `TypedTree`.
1128
+ */
1129
+ type Typed <: Term & TypedTree
1125
1130
1126
1131
/** Module object of `type Typed` */
1127
1132
val Typed : TypedModule
@@ -2049,6 +2054,56 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
2049
2054
2050
2055
// ----- Patterns ------------------------------------------------
2051
2056
2057
+ /** Pattern representing a `_` wildcard. */
2058
+ type WildcardPattern <: Tree
2059
+
2060
+ /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `WildcardPattern` */
2061
+ given WildcardPatternTypeTest : TypeTest [Tree , WildcardPattern ]
2062
+
2063
+ /** Module object of `type WildcardPattern` */
2064
+ val WildcardPattern : WildcardPatternModule
2065
+
2066
+ /** Methods of the module object `val WildcardPattern` */
2067
+ trait WildcardPatternModule { this : WildcardPattern .type =>
2068
+ def apply (): WildcardPattern
2069
+ def unapply (pattern : WildcardPattern ): true
2070
+ }
2071
+
2072
+ /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `TypedTree` */
2073
+ given TypedTreeTypeTest : TypeTest [Tree , TypedTree ]
2074
+
2075
+ /** Tree representing a type ascription or pattern `x: T` in the source code
2076
+ *
2077
+ * The tree `x` may contain a `Constant`, `Ref`, `Wildcard`, `Bind`, `Unapply` or `Alternatives`.
2078
+ */
2079
+ type TypedTree <: Term
2080
+
2081
+ /** Module object of `type TypedTree` */
2082
+ val TypedTree : TypedTreeModule
2083
+
2084
+ /** Methods of the module object `val TypedTree` */
2085
+ trait TypedTreeModule { this : TypedTree .type =>
2086
+
2087
+ /** Create a type ascription `<x: Tree>: <tpt: TypeTree>` */
2088
+ def apply (expr : Tree , tpt : TypeTree ): TypedTree
2089
+
2090
+ def copy (original : Tree )(expr : Tree , tpt : TypeTree ): TypedTree
2091
+
2092
+ /** Matches `<expr: Tree>: <tpt: TypeTree>` */
2093
+ def unapply (x : TypedTree ): (Tree , TypeTree )
2094
+ }
2095
+
2096
+ /** Makes extension methods on `TypedTree` available without any imports */
2097
+ given TypedTreeMethods : TypedTreeMethods
2098
+
2099
+ /** Extension methods of `TypedTree` */
2100
+ trait TypedTreeMethods :
2101
+ extension (self : TypedTree )
2102
+ def tree : Tree
2103
+ def tpt : TypeTree
2104
+ end extension
2105
+ end TypedTreeMethods
2106
+
2052
2107
/** Pattern representing a `_ @ _` binding. */
2053
2108
type Bind <: Tree
2054
2109
@@ -4341,9 +4396,11 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4341
4396
case TypeBoundsTree (lo, hi) => foldTree(foldTree(x, lo)(owner), hi)(owner)
4342
4397
case CaseDef (pat, guard, body) => foldTree(foldTrees(foldTree(x, pat)(owner), guard)(owner), body)(owner)
4343
4398
case TypeCaseDef (pat, body) => foldTree(foldTree(x, pat)(owner), body)(owner)
4399
+ case WildcardPattern () => x
4344
4400
case Bind (_, body) => foldTree(x, body)(owner)
4345
4401
case Unapply (fun, implicits, patterns) => foldTrees(foldTrees(foldTree(x, fun)(owner), implicits)(owner), patterns)(owner)
4346
4402
case Alternatives (patterns) => foldTrees(x, patterns)(owner)
4403
+ case TypedTree (tree1, tpt) => foldTree(foldTree(x, tree1)(owner), tpt)(owner)
4347
4404
}
4348
4405
}
4349
4406
end TreeAccumulator
@@ -4401,12 +4458,15 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4401
4458
transformCaseDef(tree)(owner)
4402
4459
case tree : TypeCaseDef =>
4403
4460
transformTypeCaseDef(tree)(owner)
4461
+ case WildcardPattern () => tree
4404
4462
case pattern : Bind =>
4405
4463
Bind .copy(pattern)(pattern.name, pattern.pattern)
4406
4464
case pattern : Unapply =>
4407
4465
Unapply .copy(pattern)(transformTerm(pattern.fun)(owner), transformSubTrees(pattern.implicits)(owner), transformTrees(pattern.patterns)(owner))
4408
4466
case pattern : Alternatives =>
4409
4467
Alternatives .copy(pattern)(transformTrees(pattern.patterns)(owner))
4468
+ case TypedTree (expr, tpt) =>
4469
+ TypedTree .copy(tree)(transformTree(expr)(owner), transformTypeTree(tpt)(owner))
4410
4470
}
4411
4471
}
4412
4472
@@ -4457,7 +4517,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4457
4517
case New (tpt) =>
4458
4518
New .copy(tree)(transformTypeTree(tpt)(owner))
4459
4519
case Typed (expr, tpt) =>
4460
- Typed .copy(tree)(/* FIXME #12222: transformTerm(expr)(owner)*/ transformTree(expr)(owner). asInstanceOf [ Term ] , transformTypeTree(tpt)(owner))
4520
+ Typed .copy(tree)(transformTerm(expr)(owner), transformTypeTree(tpt)(owner))
4461
4521
case tree : NamedArg =>
4462
4522
NamedArg .copy(tree)(tree.name, transformTerm(tree.value)(owner))
4463
4523
case Assign (lhs, rhs) =>
0 commit comments