@@ -135,7 +135,18 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
135
135
* | +- Inlined
136
136
* | +- SelectOuter
137
137
* | +- While
138
+ * | +·
139
+ * | \
140
+ * | +- Typed
141
+ * | /
142
+ * +- TypedTree +-----------------·
143
+ * +- Wildcard
144
+ * +- Bind
145
+ * +- Unapply
146
+ * +- Alternatives
138
147
* |
148
+ * +- CaseDef
149
+ * +- TypeCaseDef
139
150
* |
140
151
* +- TypeTree ----+- Inferred
141
152
* | +- TypeIdent
@@ -153,14 +164,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
153
164
* |
154
165
* +- TypeBoundsTree
155
166
* +- WildcardTypeTree
156
- * |
157
- * +- CaseDef
158
- * |
159
- * +- TypeCaseDef
160
- * +- Wildcard
161
- * +- Bind
162
- * +- Unapply
163
- * +- Alternatives
164
167
*
165
168
* +- ParamClause -+- TypeParamClause
166
169
* +- TermParamClause
@@ -1092,22 +1095,26 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
1092
1095
/** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Typed` */
1093
1096
given TypedTypeTest : TypeTest [Tree , Typed ]
1094
1097
1095
- /** Tree representing a type ascription `x: T` in the source code */
1096
- type Typed <: Term
1098
+ /** Tree representing a type ascription `x: T` in the source code.
1099
+ *
1100
+ * Also represents a pattern that contains a term `x`.
1101
+ * Other `: T` patterns use the more general `TypeTree`.
1102
+ */
1103
+ type Typed <: Term & TypeTree
1097
1104
1098
1105
/** Module object of `type Typed` */
1099
1106
val Typed : TypedModule
1100
1107
1101
1108
/** Methods of the module object `val Typed` */
1102
1109
trait TypedModule { this : Typed .type =>
1103
1110
1104
- /** Create a type ascription `<x: Tree >: <tpt: TypeTree>` */
1105
- def apply (expr : Tree , tpt : TypeTree ): Typed
1111
+ /** Create a type ascription `<x: Term >: <tpt: TypeTree>` */
1112
+ def apply (expr : Term , tpt : TypeTree ): Typed
1106
1113
1107
- def copy (original : Tree )(expr : Tree , tpt : TypeTree ): Typed
1114
+ def copy (original : Tree )(expr : Term , tpt : TypeTree ): Typed
1108
1115
1109
- /** Matches `<expr: Tree >: <tpt: TypeTree>` */
1110
- def unapply (x : Typed ): (Tree , TypeTree )
1116
+ /** Matches `<expr: Term >: <tpt: TypeTree>` */
1117
+ def unapply (x : Typed ): (Term , TypeTree )
1111
1118
}
1112
1119
1113
1120
/** Makes extension methods on `Typed` available without any imports */
@@ -1116,8 +1123,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
1116
1123
/** Extension methods of `Typed` */
1117
1124
trait TypedMethods :
1118
1125
extension (self : Typed )
1119
- def expr : Tree
1120
- def tpt : TypeTree
1126
+ def expr : Term
1121
1127
end extension
1122
1128
end TypedMethods
1123
1129
@@ -2036,6 +2042,38 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
2036
2042
def unapply (pattern : Wildcard ): true
2037
2043
}
2038
2044
2045
+ /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `TypedTree` */
2046
+ given TypedTreeTypeTest : TypeTest [Tree , TypedTree ]
2047
+
2048
+ /** Tree representing a type ascription or pattern `x: T` in the source code */
2049
+ type TypedTree <: Term
2050
+
2051
+ /** Module object of `type TypedTree` */
2052
+ val TypedTree : TypedTreeModule
2053
+
2054
+ /** Methods of the module object `val TypedTree` */
2055
+ trait TypedTreeModule { this : TypedTree .type =>
2056
+
2057
+ /** Create a type ascription `<x: Tree>: <tpt: TypeTree>` */
2058
+ def apply (expr : Tree , tpt : TypeTree ): TypedTree
2059
+
2060
+ def copy (original : Tree )(expr : Tree , tpt : TypeTree ): TypedTree
2061
+
2062
+ /** Matches `<expr: Tree>: <tpt: TypeTree>` */
2063
+ def unapply (x : TypedTree ): (Tree , TypeTree )
2064
+ }
2065
+
2066
+ /** Makes extension methods on `TypedTree` available without any imports */
2067
+ given TypedTreeMethods : TypedTreeMethods
2068
+
2069
+ /** Extension methods of `TypedTree` */
2070
+ trait TypedTreeMethods :
2071
+ extension (self : TypedTree )
2072
+ def tree : Tree
2073
+ def tpt : TypeTree
2074
+ end extension
2075
+ end TypedTreeMethods
2076
+
2039
2077
/** Pattern representing a `_ @ _` binding. */
2040
2078
type Bind <: Tree
2041
2079
@@ -4263,6 +4301,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4263
4301
case Bind (_, body) => foldTree(x, body)(owner)
4264
4302
case Unapply (fun, implicits, patterns) => foldTrees(foldTrees(foldTree(x, fun)(owner), implicits)(owner), patterns)(owner)
4265
4303
case Alternatives (patterns) => foldTrees(x, patterns)(owner)
4304
+ case TypedTree (tree1, tpt) => foldTree(foldTree(x, tree1)(owner), tpt)(owner)
4305
+
4266
4306
}
4267
4307
}
4268
4308
end TreeAccumulator
@@ -4327,6 +4367,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4327
4367
Unapply .copy(pattern)(transformTerm(pattern.fun)(owner), transformSubTrees(pattern.implicits)(owner), transformTrees(pattern.patterns)(owner))
4328
4368
case pattern : Alternatives =>
4329
4369
Alternatives .copy(pattern)(transformTrees(pattern.patterns)(owner))
4370
+ case TypedTree (expr, tpt) =>
4371
+ TypedTree .copy(tree)(transformTree(expr)(owner), transformTypeTree(tpt)(owner))
4330
4372
}
4331
4373
}
4332
4374
@@ -4377,7 +4419,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4377
4419
case New (tpt) =>
4378
4420
New .copy(tree)(transformTypeTree(tpt)(owner))
4379
4421
case Typed (expr, tpt) =>
4380
- Typed .copy(tree)(transformTree (expr)(owner), transformTypeTree(tpt)(owner))
4422
+ Typed .copy(tree)(transformTerm (expr)(owner), transformTypeTree(tpt)(owner))
4381
4423
case tree : NamedArg =>
4382
4424
NamedArg .copy(tree)(tree.name, transformTerm(tree.value)(owner))
4383
4425
case Assign (lhs, rhs) =>
0 commit comments