@@ -123,7 +123,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
123
123
* | +- Apply
124
124
* | +- TypeApply
125
125
* | +- Super
126
- * | +- Typed
127
126
* | +- Assign
128
127
* | +- Block
129
128
* | +- Closure
@@ -136,7 +135,16 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
136
135
* | +- Inlined
137
136
* | +- SelectOuter
138
137
* | +- While
138
+ * | +---+- Typed
139
+ * | /
140
+ * +- TypedTree +------------------·
141
+ * +- Wildcard
142
+ * +- Bind
143
+ * +- Unapply
144
+ * +- Alternatives
139
145
* |
146
+ * +- CaseDef
147
+ * +- TypeCaseDef
140
148
* |
141
149
* +- TypeTree ----+- Inferred
142
150
* | +- TypeIdent
@@ -154,13 +162,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
154
162
* |
155
163
* +- TypeBoundsTree
156
164
* +- WildcardTypeTree
157
- * |
158
- * +- CaseDef
159
- * |
160
- * +- TypeCaseDef
161
- * +- Bind
162
- * +- Unapply
163
- * +- Alternatives
164
165
*
165
166
* +- ParamClause -+- TypeParamClause
166
167
* +- TermParamClause
@@ -1110,8 +1111,12 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
1110
1111
/** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Typed` */
1111
1112
given TypedTypeTest : TypeTest [Tree , Typed ]
1112
1113
1113
- /** Tree representing a type ascription `x: T` in the source code */
1114
- type Typed <: Term
1114
+ /** Tree representing a type ascription `x: T` in the source code.
1115
+ *
1116
+ * Also represents a pattern that contains a term `x`.
1117
+ * Other `: T` patterns use the more general `TypeTree`.
1118
+ */
1119
+ type Typed <: Term & TypeTree
1115
1120
1116
1121
/** Module object of `type Typed` */
1117
1122
val Typed : TypedModule
@@ -2039,6 +2044,56 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
2039
2044
2040
2045
// ----- Patterns ------------------------------------------------
2041
2046
2047
+ /** Pattern representing a `_` wildcard. */
2048
+ type Wildcard <: Tree
2049
+
2050
+ /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Wildcard` */
2051
+ given WildcardTypeTest : TypeTest [Tree , Wildcard ]
2052
+
2053
+ /** Module object of `type Wildcard` */
2054
+ val Wildcard : WildcardModule
2055
+
2056
+ /** Methods of the module object `val Wildcard` */
2057
+ trait WildcardModule { this : Wildcard .type =>
2058
+ def apply (): Wildcard
2059
+ def unapply (pattern : Wildcard ): true
2060
+ }
2061
+
2062
+ /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `TypedTree` */
2063
+ given TypedTreeTypeTest : TypeTest [Tree , TypedTree ]
2064
+
2065
+ /** Tree representing a type ascription or pattern `x: T` in the source code
2066
+ *
2067
+ * The tree `x` may contain a `Constant`, `Ref`, `Wildcard`, `Bind`, `Unapply` or `Alternatives`.
2068
+ */
2069
+ type TypedTree <: Term
2070
+
2071
+ /** Module object of `type TypedTree` */
2072
+ val TypedTree : TypedTreeModule
2073
+
2074
+ /** Methods of the module object `val TypedTree` */
2075
+ trait TypedTreeModule { this : TypedTree .type =>
2076
+
2077
+ /** Create a type ascription `<x: Tree>: <tpt: TypeTree>` */
2078
+ def apply (expr : Tree , tpt : TypeTree ): TypedTree
2079
+
2080
+ def copy (original : Tree )(expr : Tree , tpt : TypeTree ): TypedTree
2081
+
2082
+ /** Matches `<expr: Tree>: <tpt: TypeTree>` */
2083
+ def unapply (x : TypedTree ): (Tree , TypeTree )
2084
+ }
2085
+
2086
+ /** Makes extension methods on `TypedTree` available without any imports */
2087
+ given TypedTreeMethods : TypedTreeMethods
2088
+
2089
+ /** Extension methods of `TypedTree` */
2090
+ trait TypedTreeMethods :
2091
+ extension (self : TypedTree )
2092
+ def tree : Tree
2093
+ def tpt : TypeTree
2094
+ end extension
2095
+ end TypedTreeMethods
2096
+
2042
2097
/** Pattern representing a `_ @ _` binding. */
2043
2098
type Bind <: Tree
2044
2099
@@ -4299,9 +4354,11 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4299
4354
case TypeBoundsTree (lo, hi) => foldTree(foldTree(x, lo)(owner), hi)(owner)
4300
4355
case CaseDef (pat, guard, body) => foldTree(foldTrees(foldTree(x, pat)(owner), guard)(owner), body)(owner)
4301
4356
case TypeCaseDef (pat, body) => foldTree(foldTree(x, pat)(owner), body)(owner)
4357
+ case Wildcard () => x
4302
4358
case Bind (_, body) => foldTree(x, body)(owner)
4303
4359
case Unapply (fun, implicits, patterns) => foldTrees(foldTrees(foldTree(x, fun)(owner), implicits)(owner), patterns)(owner)
4304
4360
case Alternatives (patterns) => foldTrees(x, patterns)(owner)
4361
+ case TypedTree (tree1, tpt) => foldTree(foldTree(x, tree1)(owner), tpt)(owner)
4305
4362
}
4306
4363
}
4307
4364
end TreeAccumulator
@@ -4359,12 +4416,15 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4359
4416
transformCaseDef(tree)(owner)
4360
4417
case tree : TypeCaseDef =>
4361
4418
transformTypeCaseDef(tree)(owner)
4419
+ case Wildcard () => tree
4362
4420
case pattern : Bind =>
4363
4421
Bind .copy(pattern)(pattern.name, pattern.pattern)
4364
4422
case pattern : Unapply =>
4365
4423
Unapply .copy(pattern)(transformTerm(pattern.fun)(owner), transformSubTrees(pattern.implicits)(owner), transformTrees(pattern.patterns)(owner))
4366
4424
case pattern : Alternatives =>
4367
4425
Alternatives .copy(pattern)(transformTrees(pattern.patterns)(owner))
4426
+ case TypedTree (expr, tpt) =>
4427
+ TypedTree .copy(tree)(transformTree(expr)(owner), transformTypeTree(tpt)(owner))
4368
4428
}
4369
4429
}
4370
4430
@@ -4415,7 +4475,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4415
4475
case New (tpt) =>
4416
4476
New .copy(tree)(transformTypeTree(tpt)(owner))
4417
4477
case Typed (expr, tpt) =>
4418
- Typed .copy(tree)(/* FIXME #12222: transformTerm(expr)(owner)*/ transformTree(expr)(owner). asInstanceOf [ Term ] , transformTypeTree(tpt)(owner))
4478
+ Typed .copy(tree)(transformTerm(expr)(owner), transformTypeTree(tpt)(owner))
4419
4479
case tree : NamedArg =>
4420
4480
NamedArg .copy(tree)(tree.name, transformTerm(tree.value)(owner))
4421
4481
case Assign (lhs, rhs) =>
0 commit comments