diff --git a/core/src/main/java/com/google/googlejavaformat/CommentsHelper.java b/core/src/main/java/com/google/googlejavaformat/CommentsHelper.java index 45e507bbd..2b789612c 100644 --- a/core/src/main/java/com/google/googlejavaformat/CommentsHelper.java +++ b/core/src/main/java/com/google/googlejavaformat/CommentsHelper.java @@ -14,6 +14,10 @@ package com.google.googlejavaformat; +import com.google.googlejavaformat.Input.Tok; +import java.util.Optional; +import java.util.regex.Pattern; + /** * Rewrite comments. This interface is implemented by {@link * com.google.googlejavaformat.java.JavaCommentsHelper JavaCommentsHelper}. @@ -28,4 +32,19 @@ public interface CommentsHelper { * @return the rewritten comment */ String rewrite(Input.Tok tok, int maxWidth, int column0); + + static Optional reformatParameterComment(Tok tok) { + if (!tok.isSlashStarComment()) { + return Optional.empty(); + } + var match = PARAMETER_COMMENT.matcher(tok.getOriginalText()); + if (!match.matches()) { + return Optional.empty(); + } + return Optional.of(String.format("/* %s= */", match.group(1))); + } + + Pattern PARAMETER_COMMENT = + Pattern.compile( + "/\\*\\s*(\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*)(\\Q...\\E)?\\s*=\\s*\\*/"); } diff --git a/core/src/main/java/com/google/googlejavaformat/Doc.java b/core/src/main/java/com/google/googlejavaformat/Doc.java index 35acca367..d638ddb40 100644 --- a/core/src/main/java/com/google/googlejavaformat/Doc.java +++ b/core/src/main/java/com/google/googlejavaformat/Doc.java @@ -15,6 +15,7 @@ package com.google.googlejavaformat; import static com.google.common.collect.Iterables.getLast; +import static com.google.googlejavaformat.CommentsHelper.reformatParameterComment; import static java.lang.Math.max; import com.google.common.base.MoreObjects; @@ -727,7 +728,7 @@ float computeWidth() { // Account for line comments with missing spaces, see computeFlat. return tok.length() + 1; } else { - return tok.length(); + return reformatParameterComment(tok).map(String::length).orElse(tok.length()); } } return idx != -1 ? Float.POSITIVE_INFINITY : (float) tok.length(); @@ -741,7 +742,7 @@ String computeFlat() { if (tok.isSlashSlashComment() && !tok.getOriginalText().startsWith("// ")) { return "// " + tok.getOriginalText().substring("//".length()); } - return tok.getOriginalText(); + return reformatParameterComment(tok).orElse(tok.getOriginalText()); } @Override diff --git a/core/src/main/java/com/google/googlejavaformat/java/JavaCommentsHelper.java b/core/src/main/java/com/google/googlejavaformat/java/JavaCommentsHelper.java index 346324a45..d34ecc43f 100644 --- a/core/src/main/java/com/google/googlejavaformat/java/JavaCommentsHelper.java +++ b/core/src/main/java/com/google/googlejavaformat/java/JavaCommentsHelper.java @@ -53,11 +53,13 @@ public String rewrite(Tok tok, int maxWidth, int column0) { } if (tok.isSlashSlashComment()) { return indentLineComments(lines, column0); - } else if (javadocShaped(lines)) { - return indentJavadoc(lines, column0); - } else { - return preserveIndentation(lines, column0); } + return CommentsHelper.reformatParameterComment(tok) + .orElseGet( + () -> + javadocShaped(lines) + ? indentJavadoc(lines, column0) + : preserveIndentation(lines, column0)); } // For non-javadoc-shaped block comments, shift the entire block to the correct diff --git a/core/src/test/resources/com/google/googlejavaformat/java/testdata/B21283374.output b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B21283374.output index f98a37b2f..777303e61 100644 --- a/core/src/test/resources/com/google/googlejavaformat/java/testdata/B21283374.output +++ b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B21283374.output @@ -14,41 +14,41 @@ class B21283374 { { f( - /*flagA=*/ Boolean.TRUE, - /*flagB=*/ Boolean.FALSE, - /*flagC=*/ Boolean.FALSE, - /*flagD=*/ Boolean.FALSE, - /*flagE=*/ Boolean.FALSE, - /*flagF=*/ Boolean.FALSE, - /*flagG=*/ Boolean.FALSE, - /*flagH=*/ Boolean.FALSE, - /*flagI=*/ Boolean.FALSE, - /*flagJ=*/ Boolean.FALSE, - /*flagK=*/ Boolean.FALSE); + /* flagA= */ Boolean.TRUE, + /* flagB= */ Boolean.FALSE, + /* flagC= */ Boolean.FALSE, + /* flagD= */ Boolean.FALSE, + /* flagE= */ Boolean.FALSE, + /* flagF= */ Boolean.FALSE, + /* flagG= */ Boolean.FALSE, + /* flagH= */ Boolean.FALSE, + /* flagI= */ Boolean.FALSE, + /* flagJ= */ Boolean.FALSE, + /* flagK= */ Boolean.FALSE); f( - /*flagA=*/ Boolean.TRUE, - /*flagB=*/ Boolean.FALSE, - /*flagC=*/ Boolean.FALSE, - /*flagD=*/ Boolean.FALSE, - /*flagE=*/ Boolean.FALSE, - /*flagF=*/ Boolean.FALSE, - /*flagG=*/ Boolean.FALSE, - /*flagH=*/ Boolean.FALSE, - /*flagI=*/ Boolean.FALSE, - /*flagJ=*/ Boolean.FALSE, - /*flagK=*/ Boolean.FALSE); + /* flagA= */ Boolean.TRUE, + /* flagB= */ Boolean.FALSE, + /* flagC= */ Boolean.FALSE, + /* flagD= */ Boolean.FALSE, + /* flagE= */ Boolean.FALSE, + /* flagF= */ Boolean.FALSE, + /* flagG= */ Boolean.FALSE, + /* flagH= */ Boolean.FALSE, + /* flagI= */ Boolean.FALSE, + /* flagJ= */ Boolean.FALSE, + /* flagK= */ Boolean.FALSE); - assertThat(foo.barAndBaz(/*paramName=*/ false, thingy)).isEqualTo(new Something("")); - assertThat(foo.barAndBaz(/*paramName=*/ false, thingy)).isEqualTo(new Something("")); - assertThat(foo.barAndBaz(/*paramName=*/ false, thingy)).isEqualTo(new Something("")); + assertThat(foo.barAndBaz(/* paramName= */ false, thingy)).isEqualTo(new Something("")); + assertThat(foo.barAndBaz(/* paramName= */ false, thingy)).isEqualTo(new Something("")); + assertThat(foo.barAndBaz(/* paramName= */ false, thingy)).isEqualTo(new Something("")); - f(/*paramName=*/ false); + f(/* paramName= */ false); assertThat__________________________________________________________( - /*paramName=*/ false, thingy); + /* paramName= */ false, thingy); assertThat__________________________________________________________( - /*paramName=*/ false, thingy); + /* paramName= */ false, thingy); f( arg1, /* which arg is this attached to? */ diff --git a/core/src/test/resources/com/google/googlejavaformat/java/testdata/B26694550.output b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B26694550.output index 945a40fce..aedafb779 100644 --- a/core/src/test/resources/com/google/googlejavaformat/java/testdata/B26694550.output +++ b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B26694550.output @@ -3,15 +3,15 @@ class B26694550 { /* === not a param comment */ fffffffffffffffffffffffffffffff( ImmutableList.copyOf(keys), /*&=*/ - /*keepGoing=*/ false, + /* keepGoing= */ false, ggggggggggggggggggggggggggggggggggggggggggg); fffffffffffffffffffffffffffffff( ImmutableList.copyOf(keys), - /*keepGoing=*/ false, + /* keepGoing= */ false, ggggggggggggggggggggggggggggggggggggggggggg); fffffffffffffffffffffffffffffff( ImmutableList.copyOf(keys), - /*foo_bar=*/ false, + /* foo_bar= */ false, /*foo-bar=*/ false, ggggggggggggggggggggggggggggggggggggggggggg); } diff --git a/core/src/test/resources/com/google/googlejavaformat/java/testdata/ParameterComment.input b/core/src/test/resources/com/google/googlejavaformat/java/testdata/ParameterComment.input new file mode 100644 index 000000000..58590ac4e --- /dev/null +++ b/core/src/test/resources/com/google/googlejavaformat/java/testdata/ParameterComment.input @@ -0,0 +1,26 @@ +package com.google.googlejavaformat.java.test; + +/** Tests for formatting of ParameterComments. */ +class Q { + static void f(int a) { + f(/*a=*/ 1); + f( + /* a= */ 1 + ); + } + static void g(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k) { + g( + /*a=*/ 1, + /*b=*/ 1, + /*c=*/ 1, + /*d=*/ 1, + /*e=*/ 1, + /*f=*/ 1, + /*g=*/ 1, + /*h=*/ 1, + /*i=*/ 1, + /*j=*/ 1, + /*k=*/ 1); + g(/*a=*/ 1, /*b=*/ 1, /*c=*/ 1, /*d=*/ 1, /*e=*/ 1, /*f=*/ 1, /*g=*/ 1, /*h=*/ 1, /*i=*/ 1); + } +} diff --git a/core/src/test/resources/com/google/googlejavaformat/java/testdata/ParameterComment.output b/core/src/test/resources/com/google/googlejavaformat/java/testdata/ParameterComment.output new file mode 100644 index 000000000..5616ec0da --- /dev/null +++ b/core/src/test/resources/com/google/googlejavaformat/java/testdata/ParameterComment.output @@ -0,0 +1,34 @@ +package com.google.googlejavaformat.java.test; + +/** Tests for formatting of ParameterComments. */ +class Q { + static void f(int a) { + f(/* a= */ 1); + f(/* a= */ 1); + } + + static void g(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k) { + g( + /* a= */ 1, + /* b= */ 1, + /* c= */ 1, + /* d= */ 1, + /* e= */ 1, + /* f= */ 1, + /* g= */ 1, + /* h= */ 1, + /* i= */ 1, + /* j= */ 1, + /* k= */ 1); + g( + /* a= */ 1, + /* b= */ 1, + /* c= */ 1, + /* d= */ 1, + /* e= */ 1, + /* f= */ 1, + /* g= */ 1, + /* h= */ 1, + /* i= */ 1); + } +}