jhipster / prettier-java

Prettier Java Plugin
http://www.jhipster.tech/prettier-java/
Apache License 2.0
1.06k stars 103 forks source link

Record pattern in exhaustive switch syntax unsupported #610

Closed NolwennD closed 7 months ago

NolwennD commented 8 months ago

Record pattern appears in java 21 and prettier is unable to parse it

Prettier-Java 2.3.1

Input:

package monad;

import java.util.Objects;
import java.util.function.Function;
import java.util.function.Predicate;

public sealed interface Maybe<T> {

  static <T> Maybe<T> of(T value) {
    if (value == null) {
      return new None<>();
    }
    return new Some<>(value);
  }

  default T valueOr(T defaultValue) {
    return switch (this) {
      case Some<T> some -> some.value();
      case None() -> defaultValue;
    };
  }

  default boolean isPresent() {
    return switch (this) {
      case Some<T> __ -> true;
      case None() -> false;
    };
  }

  default <R> Maybe<R> map(Function<T, R> mapper) {
    Objects.requireNonNull(mapper);

    return switch (this) {
      case Some(T value) -> of(mapper.apply(value)); // prettier fails here
      case None() -> new None<>();
    };
  }

  default Maybe<T> filter(Predicate<T> predicate) {
    Objects.requireNonNull(predicate);

    return switch (this) {
      case Some(T value) when predicate.test(value) -> new Some<>(value);
      default -> new None<>();
    };
  }
}

record Some<T>(T value) implements Maybe<T> {
}

record None<T>() implements Maybe<T> {
}

Output:

npx prettier --write src/main/java/monad/Maybe.java 
src/main/java/monad/Maybe.java
[error] src/main/java/monad/Maybe.java: Error: Sad sad panda, parsing errors detected in line: 34, column: 19!
[error] Expecting --> ')' <-- but found --> 'value' <--!
[error]         ->compilationUnit
[error]         ->ordinaryCompilationUnit
[error]         ->typeDeclaration
[error]         ->interfaceDeclaration
[error]         ->normalInterfaceDeclaration
[error]         ->interfaceBody
[error]         ->interfaceMemberDeclaration
[error]         ->interfaceMethodDeclaration
[error]         ->methodBody
[error]         ->block
[error]         ->blockStatements
[error]         ->blockStatement
[error]         ->statement
[error]         ->statementWithoutTrailingSubstatement
[error]         ->returnStatement
[error]         ->expression
[error]         ->ternaryExpression
[error]         ->binaryExpression
[error]         ->unaryExpression
[error]         ->primary
[error]         ->primaryPrefix
[error]         ->switchStatement
[error]         ->switchBlock
[error]         ->switchRule
[error]         ->switchLabel
[error]         ->caseOrDefaultLabel
[error]         ->caseLabelElement
[error]         ->caseConstant
[error]         ->ternaryExpression
[error]         ->binaryExpression
[error]         ->unaryExpression
[error]         ->primary
[error]         ->primarySuffix
[error]         ->methodInvocationSuffix
NolwennD commented 8 months ago
case Some(T value) when predicate.test(value) -> new Some<>(value);

when is not recognize as keyword by prettier.

pascalgrimaud commented 8 months ago

Adding a bounty to have this

cc @clementdessoude in case you are available :)

jtkiesel commented 7 months ago

@pascalgrimaud Bounty claimed: https://opencollective.com/generator-jhipster/expenses/171408

pascalgrimaud commented 7 months ago

@jtkiesel : approved, thanks for your work