jhipster / prettier-java

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

fix: hug lambdas without blocks #653

Closed jtkiesel closed 3 months ago

jtkiesel commented 7 months ago

What changed with this PR:

Argument "hugging" is now aligned much more closely with Prettier JavaScript. Specifically, lambdas without blocks are "huggable" again.

Example

Input

class T {

  public Semver getMaven() {
    return describe()
      .map(v -> null == v ? PRE_VERSION : v)
      .map(Semver::coerce)
      .map(v -> Objects.equals(v.getVersion(), PRE_VERSION) ? v.withPreRelease(SNAPSHOT) : v)
      .map(
        v ->
          v
            .getPreRelease()
            .stream()
            .filter(p -> p.matches("^\\d+-+g\\p{XDigit}{7}$"))
            .findFirst()
            .map(p -> v.withClearedPreRelease().withPreRelease(SNAPSHOT).withBuild(p))
            .orElse(v)
      )
      .map(v -> new MavenSemver(v.getVersion()))
      .get();
  }

  void t() {
    aaaaaaaaaaaaaaaaaaaaaaaa((bbbbbbbbbbbbbbbbbbbbbbbb, cccccccccccccccccccccccc, dddddddddddddddddddddddd) -> eeeeeeeeeeeeeeeeeeeeeeee.ffffffffffffffffffffffff());

    a.b(c -> d -> eeeeeeeeee.ffffffffff(gggggggggg, hhhhhhhhhh, iiiiiiiiii, jjjjjjjjjj, kkkkkkkkkk));

    a.b(c -> d && eeeeeeeeee.ffffffffff() ? g && hhhhhhhhhh.iiiiiiiiii() : j && kkkkkkkkkk.llllllllll());

    a.b(c -> d && eeeeeeeeee.ffffffffff(gggggggggg, hhhhhhhhhh, iiiiiiiiii, jjjjjjjjjj, kkkkkkkkkk) > 0);

    a.b(c, (c0, c1) -> d && eeeeeeeeee.ffffffffff(gggggggggg, hhhhhhhhhh, iiiiiiiiii, jjjjjjjjjj, kkkkkkkkkk) > 0);

    a.b(c -> eeeeeeeeee.ffffffffff(gggggggggg, hhhhhhhhhh, iiiiiiiiii, jjjjjjjjjj, kkkkkkkkkk) > 0);

    a.b(c, (c0, c1) -> eeeeeeeeee.ffffffffff(gggggggggg, hhhhhhhhhh, iiiiiiiiii, jjjjjjjjjj, kkkkkkkkkk) > 0);

    a.b(c -> d && eeeeeeeeee.ffffffffff(gggggggggg, hhhhhhhhhh, iiiiiiiiii, jjjjjjjjjj, kkkkkkkkkk));

    a.b(c, (c0, c1) -> d && eeeeeeeeee.ffffffffff(gggggggggg, hhhhhhhhhh, iiiiiiiiii, jjjjjjjjjj, kkkkkkkkkk));

    a.b(c -> eeeeeeeeee.ffffffffff(gggggggggg, hhhhhhhhhh, iiiiiiiiii, jjjjjjjjjj, kkkkkkkkkk));

    a.b(c -> {
      eeeeeeeeee.ffffffffff(gggggggggg, hhhhhhhhhh, iiiiiiiiii, jjjjjjjjjj, kkkkkkkkkk);
    });

    a.b((c0, c1) -> eeeeeeeeee.ffffffffff(gggggggggg, hhhhhhhhhh, iiiiiiiiii, jjjjjjjjjj, kkkkkkkkkk));

    a.b(c, (c0, c1) -> eeeeeeeeee.ffffffffff(gggggggggg, hhhhhhhhhh, iiiiiiiiii, jjjjjjjjjj, kkkkkkkkkk));
  }
}

Output

class T {

  public Semver getMaven() {
    return describe()
      .map(v -> null == v ? PRE_VERSION : v)
      .map(Semver::coerce)
      .map(v ->
        Objects.equals(v.getVersion(), PRE_VERSION)
          ? v.withPreRelease(SNAPSHOT)
          : v
      )
      .map(v ->
        v
          .getPreRelease()
          .stream()
          .filter(p -> p.matches("^\\d+-+g\\p{XDigit}{7}$"))
          .findFirst()
          .map(p ->
            v.withClearedPreRelease().withPreRelease(SNAPSHOT).withBuild(p)
          )
          .orElse(v)
      )
      .map(v -> new MavenSemver(v.getVersion()))
      .get();
  }

  void t() {
    aaaaaaaaaaaaaaaaaaaaaaaa(
      (
        bbbbbbbbbbbbbbbbbbbbbbbb,
        cccccccccccccccccccccccc,
        dddddddddddddddddddddddd
      ) -> eeeeeeeeeeeeeeeeeeeeeeee.ffffffffffffffffffffffff()
    );

    a.b(
      c ->
        d ->
          eeeeeeeeee.ffffffffff(
            gggggggggg,
            hhhhhhhhhh,
            iiiiiiiiii,
            jjjjjjjjjj,
            kkkkkkkkkk
          )
    );

    a.b(c ->
      d && eeeeeeeeee.ffffffffff()
        ? g && hhhhhhhhhh.iiiiiiiiii()
        : j && kkkkkkkkkk.llllllllll()
    );

    a.b(
      c ->
        d &&
        eeeeeeeeee.ffffffffff(
          gggggggggg,
          hhhhhhhhhh,
          iiiiiiiiii,
          jjjjjjjjjj,
          kkkkkkkkkk
        ) >
        0
    );

    a.b(
      c,
      (c0, c1) ->
        d &&
        eeeeeeeeee.ffffffffff(
          gggggggggg,
          hhhhhhhhhh,
          iiiiiiiiii,
          jjjjjjjjjj,
          kkkkkkkkkk
        ) >
        0
    );

    a.b(
      c ->
        eeeeeeeeee.ffffffffff(
          gggggggggg,
          hhhhhhhhhh,
          iiiiiiiiii,
          jjjjjjjjjj,
          kkkkkkkkkk
        ) >
        0
    );

    a.b(
      c,
      (c0, c1) ->
        eeeeeeeeee.ffffffffff(
          gggggggggg,
          hhhhhhhhhh,
          iiiiiiiiii,
          jjjjjjjjjj,
          kkkkkkkkkk
        ) >
        0
    );

    a.b(
      c ->
        d &&
        eeeeeeeeee.ffffffffff(
          gggggggggg,
          hhhhhhhhhh,
          iiiiiiiiii,
          jjjjjjjjjj,
          kkkkkkkkkk
        )
    );

    a.b(
      c,
      (c0, c1) ->
        d &&
        eeeeeeeeee.ffffffffff(
          gggggggggg,
          hhhhhhhhhh,
          iiiiiiiiii,
          jjjjjjjjjj,
          kkkkkkkkkk
        )
    );

    a.b(c ->
      eeeeeeeeee.ffffffffff(
        gggggggggg,
        hhhhhhhhhh,
        iiiiiiiiii,
        jjjjjjjjjj,
        kkkkkkkkkk
      )
    );

    a.b(c -> {
      eeeeeeeeee.ffffffffff(
        gggggggggg,
        hhhhhhhhhh,
        iiiiiiiiii,
        jjjjjjjjjj,
        kkkkkkkkkk
      );
    });

    a.b((c0, c1) ->
      eeeeeeeeee.ffffffffff(
        gggggggggg,
        hhhhhhhhhh,
        iiiiiiiiii,
        jjjjjjjjjj,
        kkkkkkkkkk
      )
    );

    a.b(c, (c0, c1) ->
      eeeeeeeeee.ffffffffff(
        gggggggggg,
        hhhhhhhhhh,
        iiiiiiiiii,
        jjjjjjjjjj,
        kkkkkkkkkk
      )
    );
  }
}

Relative issues or prs:

Closes #650

jtkiesel commented 3 months ago

@clementdessoude Apologies for the ping, but just wanted to check in to ask if you could take another look at this, whenever you have the time. Thanks in advance!

clementdessoude commented 3 months ago

Hello @jtkiesel ! No worry for the ping, it is totally normal. Would you be able to have a chat (through mail/twitter/linkedin/any media you want) ? I tried to contact you via linkedin a few weeks ago to discuss about the project, but you may have missed it :)