Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: throws rendering #384

Merged
merged 3 commits into from
Nov 1, 2020
Merged

fix: throws rendering #384

merged 3 commits into from
Nov 1, 2020

Conversation

jhaber
Copy link
Contributor

@jhaber jhaber commented Apr 10, 2020

This is a modified version of #305 that makes a more minor change. Based on #286 it seems like there's not a clear answer on how formatting should work when methods throw lots of exceptions. However, the current behavior where there's an extra newline is basically a bug, for example:

public void method(
  Arg arg1,
  Arg arg2
)
  throws Exception {}

This PR attempts to fix the bug, while punting on the question of a more complete behavior change.

The tests should give a good idea of the behavior I was going for. Unfortunately, my prettier fu is pretty weak so a few of the tests are failing and I'm having a hard time getting things just right

@jhaber
Copy link
Contributor Author

jhaber commented Apr 11, 2020

Updated test output to match current behavior so the tests pass, here's the diff:
HubSpot@6d41b67

There's still an extra newline but only when the throws clause is really long

@@ -511,7 +506,8 @@ class ClassesPrettierVisitor {

throws(ctx) {
const exceptionTypeList = this.visit(ctx.exceptionTypeList);
return join(" ", [ctx.Throws[0], exceptionTypeList]);
const throwsDeclaration = join(" ", [ctx.Throws[0], exceptionTypeList]);
return group(indent(rejectAndConcat([softline, throwsDeclaration])));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could add an extra indent here, so that the throws + exceptionTypeList is not at the same level of the rest of the body, WDYT ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, would that be the only place in prettier-java where a double-indent is used? There is a similar issue with a really long class declaration, for example:

public class MyReallyLongClassName
  extends SomeOtherReallyLongClass
  implements SomeReallyLongInterface {
  private Field field;

  public Field someMethodWithAReallyLongName()
    throws IOException {
    return field;
  }
}

I wonder if the fix in both cases could be to force a newline if the class signature or throws clause linebreaks? This would look like:

public class MyReallyLongClassName
  extends SomeOtherReallyLongClass
  implements SomeReallyLongInterface {

  private Field field;

  public Field someMethodWithAReallyLongName()
    throws IOException {

    return field;
  }
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are other places where we could add some double indents indeed.

It might indeed be better to add an extra blank line, but it is more difficult to implement, IMO, as the formatting of the class body is not in the same node as the inheritance/interface declaration.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be easier if class bodies always started with an empty line? (basically #271)

I guess that wouldn't help the method case though, since you wouldn't want methods to unconditionally start with an empty line

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also getting back to the original suggestion, double indent (or continuation indent) is pretty common in Java formatters but doesn't seem to be idiomatic in prettier as far as I can tell (this issue didn't seem to go anywhere prettier/prettier#5865).

If we introduced the idea of continuation indent, I think we'd want to apply it consistently. Off the top of my this would include class signatures:

public class MyReallyLongClassName
  ->extends SomeOtherReallyLongClass
  ->implements SomeReallyLongInterface {

Method signatures:

public void myMethod(
  ->String argOne
  ->String argTwo
  ->String argThree
) {}

Method call chains:

return someCollectionType
  ->.stream()
  ->.filter(x -> x != null)
  ->.collect(Collectors.toList());

And probably a bunch of other statements as well. This is definitely one way to go, but would be a pretty massive formatting change at this point. Might be better to move discussion to an issue if that's under consideration

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Nooo, not in method call chains - those are exactly the type of code that often becomes confusing because there's a continuation on top, and a chained call below, but they look the same. Make split expressions use the continuation indent, and chained calls the "normal", +1, indent...)

@clementdessoude
Copy link
Contributor

Thank you for this @jhaber! One minor comment and we can merge it :)

@jhaber
Copy link
Contributor Author

jhaber commented Apr 18, 2020

Thanks! There is still still an extraneous newline when the throws clause is really long, for example:
HubSpot@6d41b67

I have a hunch I need to use ifBreak somewhere, but couldn't figure out where

@CLAassistant
Copy link

CLAassistant commented Apr 20, 2020

CLA assistant check
All committers have signed the CLA.

@jhaber
Copy link
Contributor Author

jhaber commented Jul 15, 2020

Any more thoughts on this PR? We've been formatting all of our code with this change since April and haven't noticed any undesirable side effects.

@jhaber
Copy link
Contributor Author

jhaber commented Sep 3, 2020

👋 bump on this PR. We're continuing to apply it on top of each prettier-java release for our internal use, but it is a bit of a maintenance burden (and also everyone else doesn't get to benefit 😄 )

@clementdessoude
Copy link
Contributor

I'll think I merge it next week. I will be on holidays so I'll finally have some time :)

@pascalgrimaud
Copy link
Member

@Shaolans @Hawkurane : can one of you have a quick look and merge this plz ?

@clementdessoude clementdessoude merged commit c18d4d5 into jhipster:master Nov 1, 2020
@clementdessoude
Copy link
Contributor

Sorry it took so long @jhaber. I'm merging this. Thank you a lot !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants