@@ -155,6 +155,7 @@ trait PatternTypeConstrainer { self: TypeComparer =>
155
155
// Their info could, for an example, be an AndType. One example where
156
156
// this is important is an enum case that extends its parent and an
157
157
// additional trait - argument-less enum cases desugar to vals.
158
+ // See run/enum-Tree.scala.
158
159
if tp.classSymbol.exists then tp else tp.info
159
160
case tp => tp
160
161
}
@@ -182,15 +183,15 @@ trait PatternTypeConstrainer { self: TypeComparer =>
182
183
183
184
/** Constrain "simple" patterns (see `constrainPatternType`).
184
185
*
185
- * This function attempts to modify pattern and scrutinee type s.t. the pattern must be a subtype of the scrutinee,
186
- * or otherwise it cannot possibly match. In order to do that, we:
186
+ * This function expects to receive two types (scrutinee and pattern), both
187
+ * of which have class symbols, one of which is derived from another. If the
188
+ * type "being derived from" is an applied type, it will 1) "upcast" the
189
+ * deriving type to an applied type with the same constructor and 2) infer
190
+ * constraints for the applied types' arguments that follow from both
191
+ * types being inhabited by one value (the scrutinee).
187
192
*
188
- * 1. Rely on `constrainPatternType` to break the actual scrutinee/pattern types into subcomponents
189
- * 2. Widen type parameters of scrutinee type that are not invariantly refined (see below) by the pattern type.
190
- * 3. Wrap the pattern type in a skolem to avoid overconstraining top-level abstract types in scrutinee type
191
- * 4. Check that `WidenedScrutineeType <: NarrowedPatternType`
192
- *
193
- * Importantly, note that the pattern type may contain type variables.
193
+ * Importantly, note that the pattern type may contain type variables, which
194
+ * are used to infer type arguments to Unapply trees.
194
195
*
195
196
* ## Invariant refinement
196
197
* Essentially, we say that `D[B] extends C[B]` s.t. refines parameter `A` of `trait C[A]` invariantly if
0 commit comments