Record pattern in exhaustive switch syntax unsupported
Closed this issue · 4 comments
NolwennD commented
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
case Some(T value) when predicate.test(value) -> new Some<>(value);
when
is not recognize as keyword by prettier.
pascalgrimaud commented
Adding a bounty to have this
cc @clementdessoude in case you are available :)
jtkiesel commented
pascalgrimaud commented
@jtkiesel : approved, thanks for your work