Skip to content

UpgradeToJava21 requires two runs to produce switch expression when assignment can be inlined #1011

@sergeykad

Description

@sergeykad

What happened

When running org.openrewrite.java.migrate.UpgradeToJava21 twice in succession, the first run converts if-else instanceof chains to switch statements, but does not convert assignment-based switches to switch expressions. A second run of the same recipe is needed to produce the switch expression.

Expected behavior

Per the recipe execution docs, recipes can opt into additional cycles by overriding Recipe.causesAnotherCycle(). The sub-recipe that converts assigning switch statements to switch expressions should either run within the same cycle as the if-else-to-switch conversion, or the recipe should enable an additional cycle so both transformations complete in a single invocation.

Example

Original code:

private static double convertToDouble(Object value) {
    double dValue;
    if (value instanceof String string) {
        dValue = Double.parseDouble(string);
    } else if (value instanceof Integer integer) {
        dValue = integer.doubleValue();
    } else if (value instanceof Long long1) {
        dValue = long1.doubleValue();
    } else {
        dValue = (double) value;
    }
    return dValue;
}

After the first run:

private static double convertToDouble(Object value) {
    double dValue;
    switch (value) {
        case String string -> dValue = Double.parseDouble(string);
        case Integer integer -> dValue = integer.doubleValue();
        case Long long1 -> dValue = long1.doubleValue();
        default -> dValue = (double) value;
    }
    return dValue;
}

After a second run of the same recipe:

private static double convertToDouble(Object value) {
    return switch (value) {
        case String string -> Double.parseDouble(string);
        case Integer integer -> integer.doubleValue();
        case Long long1 -> long1.doubleValue();
        default -> (double) value;
    };
}

Related

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions