From ef826a783fb7b7fc30f18f9f1d24fcd3b924e104 Mon Sep 17 00:00:00 2001 From: Matthias Kurz Date: Wed, 15 Apr 2026 15:21:19 +0200 Subject: [PATCH] Add CLI flag to disable modifier reordering The library API already supports `JavaFormatterOptions.reorderModifiers(false)`, but the CLI had no equivalent flag. This change adds `--skip-reordering-modifiers` and wires it through the CLI into `JavaFormatterOptions`. The default CLI behavior is unchanged. --- .../java/CommandLineOptions.java | 7 ++++++- .../java/CommandLineOptionsParser.java | 1 + .../google/googlejavaformat/java/Main.java | 1 + .../googlejavaformat/java/UsageException.java | 2 ++ .../java/CommandLineOptionsParserTest.java | 9 +++++++++ .../googlejavaformat/java/MainTest.java | 19 +++++++++++++++++++ 6 files changed, 38 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/google/googlejavaformat/java/CommandLineOptions.java b/core/src/main/java/com/google/googlejavaformat/java/CommandLineOptions.java index e794a1815..698a3ea9f 100644 --- a/core/src/main/java/com/google/googlejavaformat/java/CommandLineOptions.java +++ b/core/src/main/java/com/google/googlejavaformat/java/CommandLineOptions.java @@ -39,6 +39,7 @@ * normally. * @param setExitIfChanged Return exit code 1 if there are any formatting changes. * @param assumeFilename Return the name to use for diagnostics when formatting standard input. + * @param reorderModifiers Reorder modifiers into the JLS-recommended order. */ record CommandLineOptions( ImmutableList files, @@ -57,7 +58,8 @@ record CommandLineOptions( boolean setExitIfChanged, Optional assumeFilename, boolean reflowLongStrings, - boolean formatJavadoc) { + boolean formatJavadoc, + boolean reorderModifiers) { /** Returns true if partial formatting was selected. */ boolean isSelection() { @@ -70,6 +72,7 @@ static Builder builder() { .removeUnusedImports(true) .reflowLongStrings(true) .formatJavadoc(true) + .reorderModifiers(true) .aosp(false) .version(false) .help(false) @@ -129,6 +132,8 @@ default Builder addLength(Integer length) { Builder formatJavadoc(boolean formatJavadoc); + Builder reorderModifiers(boolean reorderModifiers); + CommandLineOptions build(); } } diff --git a/core/src/main/java/com/google/googlejavaformat/java/CommandLineOptionsParser.java b/core/src/main/java/com/google/googlejavaformat/java/CommandLineOptionsParser.java index f5ce703e8..fddf9be8a 100644 --- a/core/src/main/java/com/google/googlejavaformat/java/CommandLineOptionsParser.java +++ b/core/src/main/java/com/google/googlejavaformat/java/CommandLineOptionsParser.java @@ -79,6 +79,7 @@ static CommandLineOptions parse(Iterable options) { case "--skip-removing-unused-imports" -> optionsBuilder.removeUnusedImports(false); case "--skip-reflowing-long-strings" -> optionsBuilder.reflowLongStrings(false); case "--skip-javadoc-formatting" -> optionsBuilder.formatJavadoc(false); + case "--skip-reordering-modifiers" -> optionsBuilder.reorderModifiers(false); case "-" -> optionsBuilder.stdin(true); case "-n", "--dry-run" -> optionsBuilder.dryRun(true); case "--set-exit-if-changed" -> optionsBuilder.setExitIfChanged(true); diff --git a/core/src/main/java/com/google/googlejavaformat/java/Main.java b/core/src/main/java/com/google/googlejavaformat/java/Main.java index c8aa800d8..bfe1ff51f 100644 --- a/core/src/main/java/com/google/googlejavaformat/java/Main.java +++ b/core/src/main/java/com/google/googlejavaformat/java/Main.java @@ -120,6 +120,7 @@ public int format(String... args) throws UsageException { JavaFormatterOptions.builder() .style(parameters.aosp() ? Style.AOSP : Style.GOOGLE) .formatJavadoc(parameters.formatJavadoc()) + .reorderModifiers(parameters.reorderModifiers()) .build(); if (parameters.stdin()) { diff --git a/core/src/main/java/com/google/googlejavaformat/java/UsageException.java b/core/src/main/java/com/google/googlejavaformat/java/UsageException.java index 2cdbd92c7..f9c2eb80d 100644 --- a/core/src/main/java/com/google/googlejavaformat/java/UsageException.java +++ b/core/src/main/java/com/google/googlejavaformat/java/UsageException.java @@ -46,6 +46,8 @@ Use AOSP style instead of Google Style (4-space indentation). Do not reflow string literals that exceed the column limit. --skip-javadoc-formatting Do not reformat javadoc. + --skip-reordering-modifiers + Do not reorder modifiers into the JLS-recommended order. --dry-run, -n Prints the paths of the files whose contents would change if the formatter were run normally. --set-exit-if-changed diff --git a/core/src/test/java/com/google/googlejavaformat/java/CommandLineOptionsParserTest.java b/core/src/test/java/com/google/googlejavaformat/java/CommandLineOptionsParserTest.java index 93dfb79c2..3c0605823 100644 --- a/core/src/test/java/com/google/googlejavaformat/java/CommandLineOptionsParserTest.java +++ b/core/src/test/java/com/google/googlejavaformat/java/CommandLineOptionsParserTest.java @@ -53,6 +53,7 @@ public void defaults() { assertThat(options.setExitIfChanged()).isFalse(); assertThat(options.reflowLongStrings()).isTrue(); assertThat(options.formatJavadoc()).isTrue(); + assertThat(options.reorderModifiers()).isTrue(); } @Test @@ -200,4 +201,12 @@ public void skipJavadocFormatting() { .formatJavadoc()) .isFalse(); } + + @Test + public void skipReorderingModifiers() { + assertThat( + CommandLineOptionsParser.parse(Arrays.asList("--skip-reordering-modifiers")) + .reorderModifiers()) + .isFalse(); + } } diff --git a/core/src/test/java/com/google/googlejavaformat/java/MainTest.java b/core/src/test/java/com/google/googlejavaformat/java/MainTest.java index 56582848a..76b99baaf 100644 --- a/core/src/test/java/com/google/googlejavaformat/java/MainTest.java +++ b/core/src/test/java/com/google/googlejavaformat/java/MainTest.java @@ -638,6 +638,25 @@ public static void main(String... args) {} .isEqualTo(input); } + @Test + public void noReorderModifiers() throws Exception { + String input = + """ + class Test { + static public void main(String... args) {} + } + """; + InputStream in = new ByteArrayInputStream(input.getBytes(UTF_8)); + StringWriter out = new StringWriter(); + Main main = + new Main( + new PrintWriter(out, true), + new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.err, UTF_8)), true), + in); + assertThat(main.format("--skip-reordering-modifiers", "-")).isEqualTo(0); + assertThat(out.toString()).isEqualTo(input); + } + @Test public void syntaxError() throws Exception { Path path = testFolder.newFile("Test.java").toPath();