51

I'm extremely frustrated with the Eclipse formatting rules for a series of qualified invocations (i.e., the Builder pattern style). For example, here is my preferred formatting for some code that creates a new Apache Commons CLI Options object:

  Options options = new Options()
      .addOption(OPTION_HELP_SHORT, OPTION_HELP, false, "print usage information")
      .addOption(OPTION_VERSION_SHORT, OPTION_VERSION, false,
          "print version and exit")
      .addOption(OptionBuilder.withLongOpt(OPTION_PROPERTIES)
                     .hasArg()
                     .withArgName("FILE")
                     .withType(File.class)
                     .withDescription("specify a user properties file")
                     .create());

I.e., parameters are wrapped and indented if necessary and all qualified invocations except the first, unless necessary, are wrapped and indented if there is more than one. If a parameter list wraps inside a qualified invocation, the invocation should wrap first.

The default formatting in Eclipse ("Wrap only when necessary" for arguments and invocations) yields the following mess:

  Options options = new Options().addOption(
      OPTION_HELP_SHORT, OPTION_HELP, false, "print usage information")
      .addOption(OPTION_VERSION_SHORT, OPTION_VERSION, false,
          "print version and exit").addOption(
          OptionBuilder.withLongOpt(OPTION_PROPERTIES).hasArg().withArgName(
              "FILE").withType(File.class).withDescription(
              "specify a user properties file").create());

Going into "Java Code Style -> Formatter -> Line Wrapping" and the line wrapping setting to "Wrap all elements, except first element if not necessary" for invocations yields:

  Options options = new Options().addOption(
      OPTION_HELP_SHORT, OPTION_HELP, false, "print usage information")
      .addOption(OPTION_VERSION_SHORT, OPTION_VERSION, false,
          "print version and exit")
      .addOption(
          OptionBuilder.withLongOpt(OPTION_PROPERTIES).hasArg().withArgName(
              "FILE").withType(File.class).withDescription(
              "specify a user properties file").create());

I don't like that the OptionBuilder expression isn't being wrapped, or that "FILE" gets wrapped without also wrapping withArgName.

Changing the indentation to "Indent on column" yields:

  Options options = new Options().addOption(OPTION_HELP_SHORT, OPTION_HELP,
                                     false, "print usage information")
                                 .addOption(OPTION_VERSION_SHORT,
                                     OPTION_VERSION, false,
                                     "print version and exit")
                                 .addOption(
                                     OptionBuilder.withLongOpt(
                                                      OPTION_PROPERTIES)
                                                  .hasArg()
                                                  .withArgName("FILE")
                                                  .withType(File.class)
                                                  .withDescription(
                                                      "specify a user properties file")
                                                  .create());

The is breaking the lines where I'd prefer, but pushing things over much too far to the right.

Is there any way to convince Eclipse to apply my preferred formatting style or something closer to it than any of the above?

2
  • 4
    +1 Good question. I'd like this as well, working a lot with Google Protobufs. Commented Jan 20, 2010 at 22:14
  • Please consider changing the accepted answer to this: stackoverflow.com/a/68246533/567162 Commented Mar 9, 2022 at 15:54

6 Answers 6

44

Turning off formatting with comments, or inserting line comments is too tedious.

The best way is described here:

... or you can select "Line Wrapping > Never join already wrapped lines" globally. Then, you can break it manually and the formatter will only format inside lines (or add additional line breaks if necessary).

With this setting Eclipse formatter will stop ruining your builder statements.

enter image description here

Sign up to request clarification or add additional context in comments.

1 Comment

Jakub's solution here does the trick. Been working around this issue for years with comments. With this fix, the challenge is reduced to enforcing team-wide import of formatter standards file instead of training each dev to use some syntax of comments. Thanks man.
33

Use comments:

   Object o = foo() //
      .bar() //
      .toString();

7 Comments

And has the advantage of being perfectly generalizable to any question of the form "how can I get my IDE to break lines in place X under circumstances Y?"
It made my day ! Thanks. That was the only reason I would not activate auto format upon save like the rest of the team.
We have been to the moon and back, but to tame a code formatter we still use comments in 2020 :(
@kadam Which formatter do you think should be the standard formatter for Java and how should it be invoked?
Good questions that I don't know the answers for. But if I had to pick, it would be the one that can handle a method chain without extra scaffolding.
|
14

Update for 2021. It is possible to change, navigate to: Code Style -> Formatter -> Line Wrapping -> Wrapping settings -> Function Calls -> Qualified invocations and change value to "Wrap all elements, except first element if not necessary"

1 Comment

This should be upvoted and changed to the accepted answer as this works. Thank you so very much for this!
4

In Eclipse 3.6 It's possible to turn off formatting for a region of code. See my answer to

How to turn off the Eclipse code formatter for certain sections of Java code?

Comments

3

AFAIK, this is known problem with Eclipse Formatter: https://bugs.eclipse.org/bugs/show_bug.cgi?id=59891

2 Comments

Well, you can try to extend ICodeFormatter and create your own formatter: help.eclipse.org/galileo/topic/org.eclipse.jdt.doc.isv/…
Hei... it's fixed on Eclipse 3.6M7!
-4

On the menu select Window -> Preferences when the window opens select Java -> Code Style -> Formatter and from there you can create your own format style to use by selecting the new or edit option. When editing a formatting profile a new window opens that gives you a lot of different options to use.

4 Comments

@ChadNC: I'm describing different settings in the Formatter preferences. The problem is the settings aren't flexible enough AFAICT.
please add a comment with a reason when down voting. Especially when you down vote something that is a valid response. I created a format profile before I posted the answer and it does work just fine.
@Chris, didn't see your comment when I posted my response to your down vote. You did not mention that fact that you were already using the formatter profiles and that is the reason I suggested using it. BTW you have the same name as my brother.
Chris is aware of the format options, but he cannot make them work dor him. If the profile you created formats according to Chris' preference, can you edit your answer with the settings in that profile?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.