@@ -122,7 +122,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
122
122
* | +- Apply
123
123
* | +- TypeApply
124
124
* | +- Super
125
- * | +- Typed
126
125
* | +- Assign
127
126
* | +- Block
128
127
* | +- Closure
@@ -135,7 +134,16 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
135
134
* | +- Inlined
136
135
* | +- SelectOuter
137
136
* | +- While
137
+ * | +---+- Typed
138
+ * | /
139
+ * +- TypedTree +------------------·
140
+ * +- Wildcard
141
+ * +- Bind
142
+ * +- Unapply
143
+ * +- Alternatives
138
144
* |
145
+ * +- CaseDef
146
+ * +- TypeCaseDef
139
147
* |
140
148
* +- TypeTree ----+- Inferred
141
149
* | +- TypeIdent
@@ -153,14 +161,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
153
161
* |
154
162
* +- TypeBoundsTree
155
163
* +- WildcardTypeTree
156
- * |
157
- * +- CaseDef
158
- * |
159
- * +- TypeCaseDef
160
- * +- Wildcard
161
- * +- Bind
162
- * +- Unapply
163
- * +- Alternatives
164
164
*
165
165
* +- ParamClause -+- TypeParamClause
166
166
* +- TermParamClause
@@ -1094,22 +1094,26 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
1094
1094
/** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Typed` */
1095
1095
given TypedTypeTest : TypeTest [Tree , Typed ]
1096
1096
1097
- /** Tree representing a type ascription `x: T` in the source code */
1098
- type Typed <: Term
1097
+ /** Tree representing a type ascription `x: T` in the source code.
1098
+ *
1099
+ * Also represents a pattern that contains a term `x`.
1100
+ * Other `: T` patterns use the more general `TypeTree`.
1101
+ */
1102
+ type Typed <: Term & TypeTree
1099
1103
1100
1104
/** Module object of `type Typed` */
1101
1105
val Typed : TypedModule
1102
1106
1103
1107
/** Methods of the module object `val Typed` */
1104
1108
trait TypedModule { this : Typed .type =>
1105
1109
1106
- /** Create a type ascription `<x: Tree >: <tpt: TypeTree>` */
1107
- def apply (expr : Tree , tpt : TypeTree ): Typed
1110
+ /** Create a type ascription `<x: Term >: <tpt: TypeTree>` */
1111
+ def apply (expr : Term , tpt : TypeTree ): Typed
1108
1112
1109
- def copy (original : Tree )(expr : Tree , tpt : TypeTree ): Typed
1113
+ def copy (original : Tree )(expr : Term , tpt : TypeTree ): Typed
1110
1114
1111
- /** Matches `<expr: Tree >: <tpt: TypeTree>` */
1112
- def unapply (x : Typed ): (Tree , TypeTree )
1115
+ /** Matches `<expr: Term >: <tpt: TypeTree>` */
1116
+ def unapply (x : Typed ): (Term , TypeTree )
1113
1117
}
1114
1118
1115
1119
/** Makes extension methods on `Typed` available without any imports */
@@ -1118,7 +1122,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
1118
1122
/** Extension methods of `Typed` */
1119
1123
trait TypedMethods :
1120
1124
extension (self : Typed )
1121
- def expr : Tree
1125
+ def expr : Term
1122
1126
def tpt : TypeTree
1123
1127
end extension
1124
1128
end TypedMethods
@@ -2038,6 +2042,41 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
2038
2042
def unapply (pattern : Wildcard ): true
2039
2043
}
2040
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
+ *
2050
+ * The tree `x` may contain a `Constant`, `Ref`, `Wildcard`, `Bind`, `Unapply` or `Alternatives`.
2051
+ */
2052
+ type TypedTree <: Term
2053
+
2054
+ /** Module object of `type TypedTree` */
2055
+ val TypedTree : TypedTreeModule
2056
+
2057
+ /** Methods of the module object `val TypedTree` */
2058
+ trait TypedTreeModule { this : TypedTree .type =>
2059
+
2060
+ /** Create a type ascription `<x: Tree>: <tpt: TypeTree>` */
2061
+ def apply (expr : Tree , tpt : TypeTree ): TypedTree
2062
+
2063
+ def copy (original : Tree )(expr : Tree , tpt : TypeTree ): TypedTree
2064
+
2065
+ /** Matches `<expr: Tree>: <tpt: TypeTree>` */
2066
+ def unapply (x : TypedTree ): (Tree , TypeTree )
2067
+ }
2068
+
2069
+ /** Makes extension methods on `TypedTree` available without any imports */
2070
+ given TypedTreeMethods : TypedTreeMethods
2071
+
2072
+ /** Extension methods of `TypedTree` */
2073
+ trait TypedTreeMethods :
2074
+ extension (self : TypedTree )
2075
+ def tree : Tree
2076
+ def tpt : TypeTree
2077
+ end extension
2078
+ end TypedTreeMethods
2079
+
2041
2080
/** Pattern representing a `_ @ _` binding. */
2042
2081
type Bind <: Tree
2043
2082
@@ -4265,6 +4304,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4265
4304
case Bind (_, body) => foldTree(x, body)(owner)
4266
4305
case Unapply (fun, implicits, patterns) => foldTrees(foldTrees(foldTree(x, fun)(owner), implicits)(owner), patterns)(owner)
4267
4306
case Alternatives (patterns) => foldTrees(x, patterns)(owner)
4307
+ case TypedTree (tree1, tpt) => foldTree(foldTree(x, tree1)(owner), tpt)(owner)
4308
+
4268
4309
}
4269
4310
}
4270
4311
end TreeAccumulator
@@ -4329,6 +4370,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4329
4370
Unapply .copy(pattern)(transformTerm(pattern.fun)(owner), transformSubTrees(pattern.implicits)(owner), transformTrees(pattern.patterns)(owner))
4330
4371
case pattern : Alternatives =>
4331
4372
Alternatives .copy(pattern)(transformTrees(pattern.patterns)(owner))
4373
+ case TypedTree (expr, tpt) =>
4374
+ TypedTree .copy(tree)(transformTree(expr)(owner), transformTypeTree(tpt)(owner))
4332
4375
}
4333
4376
}
4334
4377
@@ -4379,7 +4422,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
4379
4422
case New (tpt) =>
4380
4423
New .copy(tree)(transformTypeTree(tpt)(owner))
4381
4424
case Typed (expr, tpt) =>
4382
- Typed .copy(tree)(transformTree (expr)(owner), transformTypeTree(tpt)(owner))
4425
+ Typed .copy(tree)(transformTerm (expr)(owner), transformTypeTree(tpt)(owner))
4383
4426
case tree : NamedArg =>
4384
4427
NamedArg .copy(tree)(tree.name, transformTerm(tree.value)(owner))
4385
4428
case Assign (lhs, rhs) =>
0 commit comments