Skip to content

Commit 4470c9e

Browse files
committed
Change enum Desugarings
Change the condition when type parameters of an enum are added to a class case. Quoting my comment on #6095: We have the following possibilities: 1. type parameters are added only of there is no extends clause, 2. (all) type parameters are added if one of them is referenced in the case, 3. type parameters are always added if the case has value parameters (i.e. is not translated to an object). (1) is what the current rules say. (2) is what Adriaan proposed. (3) is what is currently implemented. In addition we have to clarify what should happen if a type parameter that is not added is nevertheless referred to in the case. Since enum expansion is done during desugaring, this could silently rebind to some other type. We should come up with a solution that avoids this, if possible. This PR changes the rules to implement (2).
1 parent acb2ceb commit 4470c9e

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

docs/docs/reference/enums/desugarEnums.md

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ some terminology and notational conventions:
2525

2626
The desugaring rules imply that class cases are mapped to case classes, and singleton cases are mapped to `val` definitions.
2727

28-
There are eight desugaring rules. Rule (1) desugar enum definitions. Rules
28+
There are nine desugaring rules. Rule (1) desugar enum definitions. Rules
2929
(2) and (3) desugar simple cases. Rules (4) to (6) define extends clauses for cases that
30-
are missing them. Rules (7) and (8) define how such cases with extends clauses
30+
are missing them. Rules (7) to (9) define how such cases with extends clauses
3131
map into case classes or vals.
3232

3333
1. An `enum` definition
@@ -80,7 +80,7 @@ map into case classes or vals.
8080
case C extends E[B1, ..., Bn]
8181

8282
where `Bi` is `Li` if `Vi = '+'` and `Ui` if `Vi = '-'`. This result is then further
83-
rewritten with rule (7). Simple cases of enums with non-variant type
83+
rewritten with rule (8). Simple cases of enums with non-variant type
8484
parameters are not permitted.
8585

8686
5. A class case without an extends clause
@@ -91,7 +91,7 @@ map into case classes or vals.
9191

9292
case C <type-params> <value-params> extends E
9393

94-
This result is then further rewritten with rule (8).
94+
This result is then further rewritten with rule (9).
9595

9696
6. If `E` is an enum with type parameters `Ts`, a class case with neither type parameters nor an extends clause
9797

@@ -101,9 +101,20 @@ map into case classes or vals.
101101

102102
case C[Ts] <value-params> extends E[Ts]
103103

104-
This result is then further rewritten with rule (8). For class cases that have type parameters themselves, an extends clause needs to be given explicitly.
104+
This result is then further rewritten with rule (9). For class cases that have type parameters themselves, an extends clause needs to be given explicitly.
105105

106-
7. A value case
106+
7. If `E` is an enum with type parameters `Ts`, a class case without type parameters but with an extends clause
107+
108+
case C <value-params> extends <parents>
109+
110+
expands to
111+
112+
case C[Ts] <value-params> extends <parents>
113+
114+
provided at least one of the parameters `Ts` is mentioned in a parameter type in
115+
`<value-params>` or in a type argument in `<parents>`.
116+
117+
8. A value case
107118

108119
case C extends <parents>
109120

@@ -116,7 +127,7 @@ map into case classes or vals.
116127
as one of the `enumValues` of the enumeration (see below). `$values` is a
117128
compiler-defined private value in the companion object.
118129

119-
8. A class case
130+
9. A class case
120131

121132
case C <params> extends <parents>
122133

0 commit comments

Comments
 (0)