google-java-format icon indicating copy to clipboard operation
google-java-format copied to clipboard

Formatter fails when `default` is part of switch expression

Open nastra opened this issue 3 years ago • 1 comments

switch (reference.getReferenceTypeCase()) {
  case A -> ...
  case B, default -> throw new IllegalArgumentException("Unhandled");
}

will fail with

Caused by: com.google.googlejavaformat.java.FormatterException: 65:13: error: expected token: 'default'; generated - instead
                    at com.google.googlejavaformat.java.Formatter.getFormatReplacements(Formatter.java:273)
                    at com.google.googlejavaformat.java.Formatter.formatSource(Formatter.java:247)
                    at com.google.googlejavaformat.java.Formatter.formatSource(Formatter.java:213)

This is because it expects the default part to be separate. As a workaround, the default can be moved out of the switch expression and the formatter succeeds:

switch (reference.getReferenceTypeCase()) {
  case A -> ...
  case B -> throw new IllegalArgumentException("Unhandled");
  default -> throw new IllegalArgumentException("Unhandled");
}

Example code where this issue happenend: https://github.com/nastra/substrait-java/blob/main/core/src/main/java/io/substrait/expression/proto/ProtoExpressionConverter.java#L114 https://github.com/nastra/substrait-java/blob/main/core/src/main/java/io/substrait/expression/proto/ProtoExpressionConverter.java#L65

nastra avatar Apr 29 '22 07:04 nastra

class T {
  void f() {
    switch (reference.getReferenceTypeCase()) {
      case A -> foo();
      case B, default -> throw new IllegalArgumentException("Unhandled");
    }
  }
}
java  -jar google-java-format-1.15.0-all-deps.jar T.java
T.java:5:13: error: expected token: 'default'; generated - instead

cushon avatar Aug 04 '22 22:08 cushon

Still a problem in 1.18.1.

      return switch (subObject) {
          case Map map -> replaceReferencesMap(map, root);
          case List list -> replaceReferencesList(list, root);
          case String string -> replaceReferencesString(string, root);
          case null, default -> subObject;
        };

(invoked via spotless-maven-plugin)

164:17: error: expected token: 'default'; generated - instead
com.google.googlejavaformat.java.FormatterException: 164:17: error: expected token: 'default'; generated - instead
    at com.google.googlejavaformat.java.Formatter.getFormatReplacements (Formatter.java:275)
    at com.google.googlejavaformat.java.Formatter.formatSource (Formatter.java:247)
    at com.google.googlejavaformat.java.Formatter.formatSource (Formatter.java:213)

bentatham avatar Dec 15 '23 17:12 bentatham

After the fixes in 430ba3b0e237b746157a3392663da4b4bb7c733d and b86c508be5f42e7ed0d55cd1abe2c04d2db66676, the formatter handles this code:

class T {
  void f() {
    return switch (subObject) {
      case Map map -> replaceReferencesMap(map, root);
      case List list -> replaceReferencesList(list, root);
      case String string -> replaceReferencesString(string, root);
      case null, default -> subObject;
    };
  }
}

cushon avatar Dec 15 '23 18:12 cushon