From a1b441eb4c789bb06e7a5c330a508ca014d15f71 Mon Sep 17 00:00:00 2001 From: Neil C Smith Date: Fri, 3 Jul 2026 10:17:54 +0100 Subject: [PATCH] Update Reformatter to honour case wrap settings with case expressions. --- .../modules/java/source/save/Reformatter.java | 9 ++- .../java/source/save/FormatingTest.java | 74 +++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/save/Reformatter.java b/java/java.source.base/src/org/netbeans/modules/java/source/save/Reformatter.java index f911625cbe74..73f51fceb0c1 100644 --- a/java/java.source.base/src/org/netbeans/modules/java/source/save/Reformatter.java +++ b/java/java.source.base/src/org/netbeans/modules/java/source/save/Reformatter.java @@ -3041,7 +3041,14 @@ public Boolean visitCase(CaseTree node, Void p) { } } else if (caseBody != null) { - newline(); + switch (cs.wrapCaseStatements()) { + case WRAP_ALWAYS -> { + newline(); + } + default -> { + spaces(1, true); + } + } scan(caseBody, p); spaces(cs.spaceBeforeSemi() ? 1 : 0); accept(SEMICOLON); diff --git a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java index fb1dbcf5dac4..cc039cfd4d4f 100644 --- a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java +++ b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java @@ -3416,6 +3416,80 @@ public void testSwitchCaseAllPatternsWithReturnValue() throws Exception { reformat(doc, content, golden); } + public void testSwitchCaseExprWrapping() throws Exception { + try { + SourceVersion.valueOf("RELEASE_17"); //NOI18N + } catch (IllegalArgumentException ex) { + //OK, no RELEASE_17, skip test + return; + } + testFile = new File(getWorkDir(), "Test.java"); + TestUtilities.copyStringToFile(testFile, ""); + FileObject testSourceFO = FileUtil.toFileObject(testFile); + DataObject testSourceDO = DataObject.find(testSourceFO); + EditorCookie ec = (EditorCookie) testSourceDO.getCookie(EditorCookie.class); + final Document doc = ec.openDocument(); + doc.putProperty(Language.class, JavaTokenId.language()); + Preferences preferences = MimeLookup.getLookup(JavaTokenId.language().mimeType()).lookup(Preferences.class); + + String content + = """ + package p; + + public class Test { + + String choose(String str) { + return switch (str) { + Object str = "pattern matching switch"; + IntStream iso = IntStream.of(1, 2); + case null -> "case with null formatting"; + case String string when (string.length() == iso.filter(i -> i / 2 == 0).count() || string.length() == 0) -> + "case with pattern matching + condition + lambda expression formatting"; + case String s when s.length() == 1 -> + "case with pattern matching + condition formatting"; + case (String s) -> + "case with pattern matching + condition formatting"; + case CharSequence s -> "case with pattern matching formatting"; + case default -> "default formatting"; + + }; + } + } + """; + + String golden + = """ + package p; + + public class Test { + + String choose(String str) { + return switch (str) { + Object str = "pattern matching switch"; + IntStream iso = IntStream.of(1, 2); + case null -> + "case with null formatting"; + case String string when (string.length() == iso.filter(i -> i / 2 == 0).count() || string.length() == 0) -> + "case with pattern matching + condition + lambda expression formatting"; + case String s when s.length() == 1 -> + "case with pattern matching + condition formatting"; + case (String s) -> + "case with pattern matching + condition formatting"; + case CharSequence s -> + "case with pattern matching formatting"; + case default -> + "default formatting"; + + }; + } + } + """; + reformat(doc, content, golden); + preferences.put("wrapCaseStatements", CodeStyle.WrapStyle.WRAP_NEVER.name()); + reformat(doc, content, content); + + } + public void testNormalRecordPattern() throws Exception { try { SourceVersion.valueOf("RELEASE_19"); //NOI18N