@@ -135,7 +135,18 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
135135 * | +- Inlined
136136 * | +- SelectOuter
137137 * | +- While
138+ * | +·
139+ * | \
140+ * | +- Typed
141+ * | /
142+ * +- TypedTree +-----------------·
143+ * +- Wildcard
144+ * +- Bind
145+ * +- Unapply
146+ * +- Alternatives
138147 * |
148+ * +- CaseDef
149+ * +- TypeCaseDef
139150 * |
140151 * +- TypeTree ----+- Inferred
141152 * | +- TypeIdent
@@ -153,14 +164,6 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
153164 * |
154165 * +- TypeBoundsTree
155166 * +- WildcardTypeTree
156- * |
157- * +- CaseDef
158- * |
159- * +- TypeCaseDef
160- * +- Wildcard
161- * +- Bind
162- * +- Unapply
163- * +- Alternatives
164167 *
165168 * +- ParamClause -+- TypeParamClause
166169 * +- TermParamClause
@@ -1092,22 +1095,26 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
10921095 /** `TypeTest` that allows testing at runtime in a pattern match if a `Tree` is a `Typed` */
10931096 given TypedTypeTest : TypeTest [Tree , Typed ]
10941097
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
10971104
10981105 /** Module object of `type Typed` */
10991106 val Typed : TypedModule
11001107
11011108 /** Methods of the module object `val Typed` */
11021109 trait TypedModule { this : Typed .type =>
11031110
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
11061113
1107- def copy (original : Tree )(expr : Tree , tpt : TypeTree ): Typed
1114+ def copy (original : Tree )(expr : Term , tpt : TypeTree ): Typed
11081115
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 )
11111118 }
11121119
11131120 /** Makes extension methods on `Typed` available without any imports */
@@ -1116,8 +1123,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
11161123 /** Extension methods of `Typed` */
11171124 trait TypedMethods :
11181125 extension (self : Typed )
1119- def expr : Tree
1120- def tpt : TypeTree
1126+ def expr : Term
11211127 end extension
11221128 end TypedMethods
11231129
@@ -2036,6 +2042,38 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
20362042 def unapply (pattern : Wildcard ): true
20372043 }
20382044
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+
20392077 /** Pattern representing a `_ @ _` binding. */
20402078 type Bind <: Tree
20412079
@@ -4263,6 +4301,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
42634301 case Bind (_, body) => foldTree(x, body)(owner)
42644302 case Unapply (fun, implicits, patterns) => foldTrees(foldTrees(foldTree(x, fun)(owner), implicits)(owner), patterns)(owner)
42654303 case Alternatives (patterns) => foldTrees(x, patterns)(owner)
4304+ case TypedTree (tree1, tpt) => foldTree(foldTree(x, tree1)(owner), tpt)(owner)
4305+
42664306 }
42674307 }
42684308 end TreeAccumulator
@@ -4327,6 +4367,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
43274367 Unapply .copy(pattern)(transformTerm(pattern.fun)(owner), transformSubTrees(pattern.implicits)(owner), transformTrees(pattern.patterns)(owner))
43284368 case pattern : Alternatives =>
43294369 Alternatives .copy(pattern)(transformTrees(pattern.patterns)(owner))
4370+ case TypedTree (expr, tpt) =>
4371+ TypedTree .copy(tree)(transformTree(expr)(owner), transformTypeTree(tpt)(owner))
43304372 }
43314373 }
43324374
@@ -4377,7 +4419,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
43774419 case New (tpt) =>
43784420 New .copy(tree)(transformTypeTree(tpt)(owner))
43794421 case Typed (expr, tpt) =>
4380- Typed .copy(tree)(transformTree (expr)(owner), transformTypeTree(tpt)(owner))
4422+ Typed .copy(tree)(transformTerm (expr)(owner), transformTypeTree(tpt)(owner))
43814423 case tree : NamedArg =>
43824424 NamedArg .copy(tree)(tree.name, transformTerm(tree.value)(owner))
43834425 case Assign (lhs, rhs) =>
0 commit comments