jhipster / prettier-java

Prettier Java Plugin
http://www.jhipster.tech/prettier-java/
Apache License 2.0
1.06k stars 103 forks source link

feat: break long lines on type arguments #584

Closed jtkiesel closed 11 months ago

jtkiesel commented 12 months ago

What changed with this PR:

Long lines containing type arguments (i.e. those that previously violated printWidth) are now broken on type arguments the way Prettier JavaScript does (on TypeScript).

Example

Input

class Example {

  <A extends ShortClassName & ShortClassName & ShortClassName & ShortClassName, B extends ShortClassName & ShortClassName & ShortClassName & ShortClassName & ShortClassName, C extends ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName, ExtremelyLongAndObnoxiousClassName>, ExtremelyLongAndObnoxiousClassName> & ExtremelyLongAndObnoxiousInterfaceName & ExtremelyLongAndObnoxiousInterfaceName & ExtremelyLongAndObnoxiousInterfaceName> void example(
    ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName> parameter,
    ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName, ExtremelyLongAndObnoxiousClassName>, ExtremelyLongAndObnoxiousClassName> parameter
  ) {
    ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName> variable;

    ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName, ExtremelyLongAndObnoxiousClassName>, ExtremelyLongAndObnoxiousClassName> variable;

    ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName, ExtremelyLongAndObnoxiousClassName>, ExtremelyLongAndObnoxiousClassName> variable =
      new MyExtremelyLongAndObnoxiousClassName<>();

    ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName, ExtremelyLongAndObnoxiousClassName>, ExtremelyLongAndObnoxiousClassName> variable =
      new MyExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName, ExtremelyLongAndObnoxiousClassName>, ExtremelyLongAndObnoxiousClassName>();

    ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName, ExtremelyLongAndObnoxiousClassName>, ExtremelyLongAndObnoxiousClassName> aParticularlyLongAndObnoxiousNameForIllustrativePurposes =
      new MyExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName, ExtremelyLongAndObnoxiousClassName>, ExtremelyLongAndObnoxiousClassName>();

    new MyExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName<ExtremelyLongAndObnoxiousClassName, ExtremelyLongAndObnoxiousClassName>, ExtremelyLongAndObnoxiousClassName>()
      .method();
  }
}

Output

class Example {

  <
    A extends ShortClassName & ShortClassName & ShortClassName & ShortClassName,
    B extends ShortClassName
      & ShortClassName
      & ShortClassName
      & ShortClassName
      & ShortClassName,
    C extends ExtremelyLongAndObnoxiousClassName<
      ExtremelyLongAndObnoxiousClassName<
        ExtremelyLongAndObnoxiousClassName,
        ExtremelyLongAndObnoxiousClassName
      >,
      ExtremelyLongAndObnoxiousClassName
    >
      & ExtremelyLongAndObnoxiousInterfaceName
      & ExtremelyLongAndObnoxiousInterfaceName
      & ExtremelyLongAndObnoxiousInterfaceName
  > void example(
    ExtremelyLongAndObnoxiousClassName<
      ExtremelyLongAndObnoxiousClassName
    > parameter,
    ExtremelyLongAndObnoxiousClassName<
      ExtremelyLongAndObnoxiousClassName<
        ExtremelyLongAndObnoxiousClassName,
        ExtremelyLongAndObnoxiousClassName
      >,
      ExtremelyLongAndObnoxiousClassName
    > parameter
  ) {
    ExtremelyLongAndObnoxiousClassName<
      ExtremelyLongAndObnoxiousClassName
    > variable;

    ExtremelyLongAndObnoxiousClassName<
      ExtremelyLongAndObnoxiousClassName<
        ExtremelyLongAndObnoxiousClassName,
        ExtremelyLongAndObnoxiousClassName
      >,
      ExtremelyLongAndObnoxiousClassName
    > variable;

    ExtremelyLongAndObnoxiousClassName<
      ExtremelyLongAndObnoxiousClassName<
        ExtremelyLongAndObnoxiousClassName,
        ExtremelyLongAndObnoxiousClassName
      >,
      ExtremelyLongAndObnoxiousClassName
    > variable = new MyExtremelyLongAndObnoxiousClassName<>();

    ExtremelyLongAndObnoxiousClassName<
      ExtremelyLongAndObnoxiousClassName<
        ExtremelyLongAndObnoxiousClassName,
        ExtremelyLongAndObnoxiousClassName
      >,
      ExtremelyLongAndObnoxiousClassName
    > variable = new MyExtremelyLongAndObnoxiousClassName<
      ExtremelyLongAndObnoxiousClassName<
        ExtremelyLongAndObnoxiousClassName,
        ExtremelyLongAndObnoxiousClassName
      >,
      ExtremelyLongAndObnoxiousClassName
    >();

    ExtremelyLongAndObnoxiousClassName<
      ExtremelyLongAndObnoxiousClassName<
        ExtremelyLongAndObnoxiousClassName,
        ExtremelyLongAndObnoxiousClassName
      >,
      ExtremelyLongAndObnoxiousClassName
    > aParticularlyLongAndObnoxiousNameForIllustrativePurposes =
      new MyExtremelyLongAndObnoxiousClassName<
        ExtremelyLongAndObnoxiousClassName<
          ExtremelyLongAndObnoxiousClassName,
          ExtremelyLongAndObnoxiousClassName
        >,
        ExtremelyLongAndObnoxiousClassName
      >();

    new MyExtremelyLongAndObnoxiousClassName<
      ExtremelyLongAndObnoxiousClassName<
        ExtremelyLongAndObnoxiousClassName,
        ExtremelyLongAndObnoxiousClassName
      >,
      ExtremelyLongAndObnoxiousClassName
    >()
      .method();
  }
}

Relative issues or prs:

None

clementdessoude commented 11 months ago

LGTM ! Thanks @jtkiesel !