Enums
Goals:
- Better syntax for passing constructor parameters when defining enum constants
- Resolve issues with annotation syntax for enum constants
Example
Simple enum:
enum class Foo {
    A
    B
    C {
        override fun foo() { ... }
    }
  
    open fun foo() {}
}
Enum with constructor:
enum class Foo(val s: String) {
    A("a")
    B("b")
    C("c") {
        override fun foo() { ... }
    }
  
    open fun foo() {}
}
Issues
- Enum literals syntax clash with annotation syntax- Option 1.1: Forbid short annotation syntax in enums. downside: cannot annotate functions/properties/classes in this enum
- Option 1.2: Add a separator between enum constants and members, and forbid short annotation syntax only on enum entries themselves. downside: separator is not intuitive, hard to think of when doing this for the first time (the error message will be rather clear and instructive, though)
- Option 1.3: prefix each entry with a soft-keyword, e.g. entry. downside: verbosity
- Option 1.4 chosen: Add a semicolon separator after the last enum constant, and a comma separator between different enum constants.
 
- How do we specify other supertypes for a constant (if any)- Option 2.1 chosen: Leave unsupported, use cases are very few, and Java does not support it
- Option 2.2: A("s"): OtherType
 
Example for option 1.4:
enum class Foo(val s: String) {
    A("a"), // semicolon CAN NOT be used here!
    B("b"), // comma is MANDATORY after each enum constant except the last one
    C("c") {
        override fun foo() { ... }
    }; // semicolon is MANDATORY here, even if no member follows
  
    open fun foo() {}
}
Notes:
- Almost no overhead in the most common case of no members at all: `enum class E {A, B, C; }
- Clear error message: if the parser sees no semicolon after the last constant:- it reports an error saying “There must be a semicolon after the last enum entry”, which is rather instructive
- a quick fix can even guess the right position for the semicolon most of the time
 
- Today, there's no way of naming an enum entry public(or any other soft-keyword used as a modifier), which is unfortunate