views:

242

answers:

4

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 wrappingwithArgName`.

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?

A: 

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.

ChadNC
@ChadNC: I'm describing different settings in the Formatter preferences. The problem is the settings aren't flexible enough AFAICT.
Chris Conway
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.
ChadNC
@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.
ChadNC
@Chad, 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?
rsp
+5  A: 

Use comments:

   Object o = foo() //
      .bar() //
      .toString();
Thorbjørn Ravn Andersen
That is a really clever workaround!
Chris Conway
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?"
Chris Conway
+1  A: 

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

nanda
Yes, that's right. Reported in 2004!
Chris Conway
Well, you can try to extend ICodeFormatter and create your own formatter:http://help.eclipse.org/galileo/topic/org.eclipse.jdt.doc.isv/reference/extension-points/org_eclipse_jdt_core_codeFormatter.html
nanda
Hei... it's fixed on Eclipse 3.6M7!
nanda
+1  A: 

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

http://stackoverflow.com/questions/1820908/how-to-turn-off-the-eclipse-code-formatter-for-certain-sections-of-java-code/

xpmatteo