google / google-java-format

Reformats Java source code to comply with Google Java Style.
Other
5.62k stars 854 forks source link

Formatting code with intellij plugin and using the jar gives different results #566

Open Allc9001 opened 3 years ago

Allc9001 commented 3 years ago

If I format the following file using the intellij plugin (IDE version: Ultimate 2020.2.4 / plugin version: google-java-format 1.9.0.0. ) I get different result when compared to using the jar on the command line.

original example file:

package x;

public class test2 {

  static final String LONG_STRING = "This is a long string that makes the total line length for this line over 100 characters";

  static final String ANOTHER_LONG_STRING =
      "This is another long string but this line is under 100 characters "
      + "and this line is also under 100 characters "
      + "but this line is over 100 characters and will not be reformatted to under 100 characters using the intellij plugin but will be reformatted to under 100 characters using the jar.";

  public test2() {
    int x=1;if(x==1){x=2;}else{x=3;}
  }

}

after formatting using intellij plugin (using menu code / reformat code) I get this:

package x;

public class test2 {

  static final String LONG_STRING =
      "This is a long string that makes the total line length for this line over 100 characters";

  static final String ANOTHER_LONG_STRING =
      "This is another long string but this line is under 100 characters "
          + "and this line is also under 100 characters "
          + "but this line is over 100 characters and will not be reformatted to under 100 characters using the intellij plugin but will be reformatted to under 100 characters using the jar.";

  public test2() {
    int x = 1;
    if (x == 1) {
      x = 2;
    } else {
      x = 3;
    }
  }
}

And after formatting on the command line:

/tmp $ java -version
openjdk version "11.0.9" 2020-10-20
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9+11)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.9+11, mixed mode)
/tmp $ cksum ~/lib/google-java-format-1.9-all-deps.jar
2002751029 3404610 ~/lib/google-java-format-1.9-all-deps.jar
 /tmp $ java -jar ~/lib/google-java-format-1.9-all-deps.jar ./test2.java

I get this:

package x;

public class test2 {

  static final String LONG_STRING =
      "This is a long string that makes the total line length for this line over 100 characters";

  static final String ANOTHER_LONG_STRING =
      "This is another long string but this line is under 100 characters and this line is also"
          + " under 100 characters but this line is over 100 characters and will not be"
          + " reformatted to under 100 characters using the intellij plugin but will be"
          + " reformatted to under 100 characters using the jar.";

  public test2() {
    int x = 1;
    if (x == 1) {
      x = 2;
    } else {
      x = 3;
    }
  }
}
cies commented 3 years ago

Possibly related to #642

cushon commented 3 years ago

The CLI has a separate pass that reflows long strings literals (corresponding to --skip-reflowing-long-strings):

https://github.com/google/google-java-format/blob/5104d0b27888f3bfab7113f5606374cda5632102/core/src/main/java/com/google/googlejavaformat/java/FormatFileCallable.java#L48

The IntelliJ plugin currently just runs the core formatter logic, not the string reflowing part.

eShorko commented 2 years ago

Hi, we want to start using the plugin in IntelliJ and Eclipse IDE and format code on Save Actions and also in GitHub workflows using the axel-op/googlejavaformat-action. But, it gives different results and our GitHub workflow fails due to unformatted code, even if all code is formatted in the IDE. Is there any workaround for this in IntelliJ and Eclipse plugin or maybe a fix coming?

Allc9001 commented 2 years ago

@eShorko don't hold your breath. I've added git hooks to format all code with the cli on commit to keep things consistent and force the same formatting for everything that is committed.

mdhirsch commented 2 years ago

This is causing me grief at work as well.

ssh352 commented 12 months ago

too bad IntelliJ plugin still cannot line break cc https://github.com/google/google-java-format/issues/800

dweiss commented 1 month ago

So... this has been a problem for me too and after I debugged the source of the problem I found my way here.

Is there any reason why the IntelliJ plugin doesn't reflow long strings by default, @cushon ? Seems like an easy fix to add:

formatted = StringWrapper.wrap(formatted, this);

to the plugin. One could even make it configurable, much like the formatting style. I can produce a patch but wanted to make sure it's not some kind of policy to not make any structural changes to the code in the plugin (I don't see the reason for it).