Package: org.codehaus.groovy.classgen.asm

## [Java] Class SwitchExpressionWriter

- org.codehaus.groovy.classgen.asm.SwitchExpressionWriter

-     public class SwitchExpressionWriter
      extends Object

  Emits JVM bytecode for a SwitchExpression. Completing arms leave the result on the operand stack and jump to a shared join point — the same shape javac uses for JEP 361 switch expressions.

  This writer implements sequential `isCase` matching so Class, regex, Collection and Closure cases keep working. Tableswitch / lookupswitch specializations live on the static-compilation subclass.

  Since:
    6.0.0

- - ### Field Summary

    Fields
    Modifiers | Name | Description
    --- | --- | ---
    `protected WriterController` | `controller` | The controller coordinating all bytecode writers for the current class.

  - ### Constructor Summary

    Constructors
    Constructor and description
    `SwitchExpressionWriter(WriterController controller)` Creates a switch-expression writer with the given controller.

  - ### Methods Summary

    Methods
    Type Params | Return Type | Name and description
    --- | --- | ---
    `` | `protected static int` | `enumConstantCount(ClassNode enumType)`
    `` | `protected static String` | `enumConstantName(Expression expression, ClassNode enumType)`
    `` | `protected static Integer` | `intConstant(Expression expression)`
    `` | `protected static boolean` | `isIntegralType(ClassNode type)`
    `` | `protected static boolean` | `isIntegralWrapper(ClassNode type)`
    `` | `protected ClassNode` | `prepareSelectorType(OperandStack operandStack)` Returns the type to store the selector under.
    `` | `protected ClassNode` | `resolveResultType(SwitchExpression expression)` Resolves the type left on the operand stack at the switch-expression join.
    `` | `protected static String` | `stringConstant(Expression expression)`
    `` | `protected void` | `throwIncompatibleClassChangeError()` Throws `IncompatibleClassChangeError` for an enum constant added after an exhaustive switch expression was compiled.
    `` | `protected void` | `throwUnmatchedSelector(int selectorIndex, ClassNode selectorType)` Throws `IllegalStateException` naming the unmatched selector.
    `` | `protected static ClassNode` | `unwrapEnumType(ClassNode type)`
    `` | `protected void` | `writeDefaultOrThrow(SwitchExpression expression, int selectorIndex, ClassNode selectorType, boolean completeEnum)` Emits the default arm, or an unmatched-selector throw.
    `` | `protected void` | `writeIsCaseComparison(CaseStatement caseStatement, int selectorIndex, ClassNode selectorType)` Emits one `isCase` test.
    `` | `protected boolean` | `writeOptimizedSwitch(SwitchExpression expression, int selectorIndex, ClassNode selectorType)` Attempts a specialized dispatch (tableswitch / lookupswitch).
    `` | `public void` | `writeSwitchExpression(SwitchExpression expression)` Generates bytecode for a switch expression.
    `` | `public void` | `writeYield(YieldStatement statement)` Generates bytecode for a `yield` statement: evaluate the operand, cast it to the enclosing switch-expression result type, apply intervening finally blocks, and jump to the expression join point.

  - ### Inherited Methods Summary

    Inherited Methods
    Methods inherited from class | Name
    --- | ---
    `class Object` | `equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### protected final WriterController controller

      The controller coordinating all bytecode writers for the current class.

  - ### Constructor Detail

    - #### public SwitchExpressionWriter(WriterController controller)

      Creates a switch-expression writer with the given controller.

      Parameters:
        `controller` - the writer controller

  - ### Method Detail

    - #### protected static int enumConstantCount(ClassNode enumType)

    - #### protected static String enumConstantName(Expression expression, ClassNode enumType)

    - #### protected static Integer intConstant(Expression expression)

    - #### protected static boolean isIntegralType(ClassNode type)

    - #### protected static boolean isIntegralWrapper(ClassNode type)

    - #### protected ClassNode prepareSelectorType(OperandStack operandStack)

      Returns the type to store the selector under. Dynamic compilation boxes so the subsequent `isCase` tests see a reference.

    - #### protected ClassNode resolveResultType(SwitchExpression expression)

      Resolves the type left on the operand stack at the switch-expression join.

    - #### protected static String stringConstant(Expression expression)

    - #### protected void throwIncompatibleClassChangeError()

      Throws `IncompatibleClassChangeError` for an enum constant added after an exhaustive switch expression was compiled.

    - #### protected void throwUnmatchedSelector(int selectorIndex, ClassNode selectorType)

      Throws `IllegalStateException` naming the unmatched selector.

    - #### protected static ClassNode unwrapEnumType(ClassNode type)

    - #### protected void writeDefaultOrThrow(SwitchExpression expression, int selectorIndex, ClassNode selectorType, boolean completeEnum)

      Emits the default arm, or an unmatched-selector throw.

      Parameters:
        `completeEnum` - `true` when a complete enum switch should throw IncompatibleClassChangeError instead of IllegalStateException

    - #### protected void writeIsCaseComparison(CaseStatement caseStatement, int selectorIndex, ClassNode selectorType)

      Emits one `isCase` test. Shared with StatementWriter via BinaryExpressionHelper.writeIsCase.

    - #### protected boolean writeOptimizedSwitch(SwitchExpression expression, int selectorIndex, ClassNode selectorType)

      Attempts a specialized dispatch (tableswitch / lookupswitch). The base writer has none; static compilation overrides this.

      Returns:
        `true` if specialized bytecode was emitted

    - #### public void writeSwitchExpression(SwitchExpression expression)

      Generates bytecode for a switch expression. The result is left on the operand stack with the expression's resolved type.

      Parameters:
        `expression` - the switch expression to compile

    - #### public void writeYield(YieldStatement statement)

      Generates bytecode for a `yield` statement: evaluate the operand, cast it to the enclosing switch-expression result type, apply intervening finally blocks, and jump to the expression join point.

      Parameters:
        `statement` - the yield statement to compile