A couple notes: 1) Eclipse chose to implement switch expression as a separate AST type from switch statement. This provides explicit separation of different parsing and other semantics. Also in Groovy 3, method references were implemented as a new AST type instead of converting to MethodPointerExpression and lambda expressions were implemented as a new AST type instead of converting to ClosureExpression.
2) You mentioned mixed use of arrow and colon for cases (excerpt below). Are you sure we want to support the mixing of case semantics? It may seem to offer flexibility but may also confuse compiler as to whether a switch expression or statement is to be generated. def r = switch (a) { case 6, 8 : { // in Java, error occurs as no `yield` found. // But in Groovy, you can think it as an optional `yield`, which is a bit similar to optional 'return' in methods 'x' } case 9 -> 'y' // `case ... :`(colon) and `case ... ->`(arrow) can be mixed as you need } Now that you have a prototype in hand for conversion to ClosureExpression with nested SwitchStatement, would it be a good idea to at least try the SwitchExpression route to see how much effort difference is involved?