diff --git a/open-java-format/src/main/java/com/palantir/javaformat/java/JavaInputAstVisitor.java b/open-java-format/src/main/java/com/palantir/javaformat/java/JavaInputAstVisitor.java index 0fd3569d8..dcecd1392 100644 --- a/open-java-format/src/main/java/com/palantir/javaformat/java/JavaInputAstVisitor.java +++ b/open-java-format/src/main/java/com/palantir/javaformat/java/JavaInputAstVisitor.java @@ -3790,6 +3790,14 @@ private void addBodyDeclarations( tokenBreakTrailingComment("{", plusTwo); builder.blankLineWanted(BlankLineWanted.NO); builder.open(ZERO); + if (builder.peekToken().equals(Optional.of(";"))) { + // A body with nothing but stray semicolons: javac drops them, so the member list is empty, but + // the tokens are still there and have to be written out, one per line at the member indent. + builder.open(memberIndent); + dropEmptyDeclarations(); + builder.close(); + builder.forcedBreak(); + } token("}", plusTwo); builder.close(); } diff --git a/open-java-format/src/test/resources/com/palantir/javaformat/java/testdata/SemicolonInClass.input b/open-java-format/src/test/resources/com/palantir/javaformat/java/testdata/SemicolonInClass.input new file mode 100644 index 000000000..52d3c1226 --- /dev/null +++ b/open-java-format/src/test/resources/com/palantir/javaformat/java/testdata/SemicolonInClass.input @@ -0,0 +1,3 @@ +class SemicolonInClass { + ; +} diff --git a/open-java-format/src/test/resources/com/palantir/javaformat/java/testdata/SemicolonInClass.output b/open-java-format/src/test/resources/com/palantir/javaformat/java/testdata/SemicolonInClass.output new file mode 100644 index 000000000..e5a5ed860 --- /dev/null +++ b/open-java-format/src/test/resources/com/palantir/javaformat/java/testdata/SemicolonInClass.output @@ -0,0 +1,3 @@ +class SemicolonInClass { + ; +} diff --git a/open-java-format/src/test/resources/com/palantir/javaformat/java/testdata/ojf-semicolon-only-body.input b/open-java-format/src/test/resources/com/palantir/javaformat/java/testdata/ojf-semicolon-only-body.input new file mode 100644 index 000000000..5be48bd82 --- /dev/null +++ b/open-java-format/src/test/resources/com/palantir/javaformat/java/testdata/ojf-semicolon-only-body.input @@ -0,0 +1,13 @@ +interface B { ; } +enum C { X; ; } +record R(int a) { ; } +class E { ;; } +class F { Object o = new Object() { ; }; } +class G { // comment + ; +} +@interface H { ; } +class I { + ; + int x; +} diff --git a/open-java-format/src/test/resources/com/palantir/javaformat/java/testdata/ojf-semicolon-only-body.output b/open-java-format/src/test/resources/com/palantir/javaformat/java/testdata/ojf-semicolon-only-body.output new file mode 100644 index 000000000..38962018b --- /dev/null +++ b/open-java-format/src/test/resources/com/palantir/javaformat/java/testdata/ojf-semicolon-only-body.output @@ -0,0 +1,36 @@ +interface B { + ; +} + +enum C { + X; + ; +} + +record R(int a) { + ; +} + +class E { + ; + ; +} + +class F { + Object o = new Object() { + ; + }; +} + +class G { // comment + ; +} + +@interface H { + ; +} + +class I { + ; + int x; +}